[libvirt] [PATCH v2 19/27] conf: turn def->vcpus into a structure

Peter Krempa pkrempa at redhat.com
Fri Nov 27 16:16:44 UTC 2015


To allow collecting all relevant data at one place let's make def->vcpus
a structure and then we can start moving stuff into it.
---
 src/conf/domain_conf.c | 55 ++++++++++++++++++++++++++++++++++++++++++++------
 src/conf/domain_conf.h | 10 ++++++++-
 2 files changed, 58 insertions(+), 7 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 2bc0f1c..ed4fe29 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1430,14 +1430,32 @@ void virDomainLeaseDefFree(virDomainLeaseDefPtr def)
 }


+static void
+virDomainVcpuInfoClear(virDomainVcpuInfoPtr info)
+{
+    if (!info)
+        return;
+}
+
+
 int
 virDomainDefSetVcpusMax(virDomainDefPtr def,
                         unsigned int maxvcpus)
 {
-    if (maxvcpus < def->vcpus)
-        virDomainDefSetVcpus(def, maxvcpus);
+    size_t i;

-    def->maxvcpus = maxvcpus;
+    if (def->maxvcpus == maxvcpus)
+        return 0;
+
+    if (def->maxvcpus < maxvcpus) {
+        if (VIR_EXPAND_N(def->vcpus, def->maxvcpus, maxvcpus - def->maxvcpus) < 0)
+            return -1;
+    } else {
+        for (i = maxvcpus; i < def->maxvcpus; i++)
+            virDomainVcpuInfoClear(&def->vcpus[i]);
+
+        VIR_SHRINK_N(def->vcpus, def->maxvcpus, def->maxvcpus - maxvcpus);
+    }

     return 0;
 }
@@ -1446,7 +1464,14 @@ virDomainDefSetVcpusMax(virDomainDefPtr def,
 bool
 virDomainDefHasVcpusOffline(const virDomainDef *def)
 {
-    return def->vcpus < def->maxvcpus;
+    size_t i;
+
+    for (i = 0; i < def->maxvcpus; i++) {
+        if (!def->vcpus[i].online)
+            return true;
+    }
+
+    return false;
 }


@@ -1461,6 +1486,8 @@ int
 virDomainDefSetVcpus(virDomainDefPtr def,
                      unsigned int vcpus)
 {
+    size_t i;
+
     if (vcpus > def->maxvcpus) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                        _("maxvcpus must not be less than current vcpus (%u < %zu)"),
@@ -1468,7 +1495,11 @@ virDomainDefSetVcpus(virDomainDefPtr def,
         return -1;
     }

-    def->vcpus = vcpus;
+    for (i = 0; i < vcpus; i++)
+        def->vcpus[i].online = true;
+
+    for (i = vcpus; i < def->maxvcpus; i++)
+        def->vcpus[i].online = false;

     return 0;
 }
@@ -1477,7 +1508,15 @@ virDomainDefSetVcpus(virDomainDefPtr def,
 unsigned int
 virDomainDefGetVcpus(const virDomainDef *def)
 {
-    return def->vcpus;
+    size_t i;
+    unsigned int ret = 0;
+
+    for (i = 0; i < def->maxvcpus; i++) {
+        if (def->vcpus[i].online)
+            ret++;
+    }
+
+    return ret;
 }


@@ -2505,6 +2544,10 @@ void virDomainDefFree(virDomainDefPtr def)

     virDomainResourceDefFree(def->resource);

+    for (i = 0; i < def->maxvcpus; i++)
+        virDomainVcpuInfoClear(&def->vcpus[i]);
+    VIR_FREE(def->vcpus);
+
     /* hostdevs must be freed before nets (or any future "intelligent
      * hostdevs") because the pointer to the hostdev is really
      * pointing into the middle of the higher level device's object,
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index b681bd2..ad6c401 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2139,6 +2139,14 @@ struct _virDomainCputune {
     virDomainThreadSchedParamPtr iothreadsched;
 };

+
+typedef struct _virDomainVcpuInfo virDomainVcpuInfo;
+typedef virDomainVcpuInfo *virDomainVcpuInfoPtr;
+
+struct _virDomainVcpuInfo {
+    bool online;
+};
+
 typedef struct _virDomainBlkiotune virDomainBlkiotune;
 typedef virDomainBlkiotune *virDomainBlkiotunePtr;

@@ -2212,7 +2220,7 @@ struct _virDomainDef {
     virDomainBlkiotune blkio;
     virDomainMemtune mem;

-    unsigned int vcpus;
+    virDomainVcpuInfoPtr vcpus;
     size_t maxvcpus;
     int placement_mode;
     virBitmapPtr cpumask;
-- 
2.6.2




More information about the libvir-list mailing list