[libvirt] [PATCH 26/34] conf: turn def->vcpus into a structure

Peter Krempa pkrempa at redhat.com
Fri Nov 20 15:22:16 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 897b643..631e1db 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1424,20 +1424,38 @@ void virDomainLeaseDefFree(virDomainLeaseDefPtr def)
 }


+static void
+virDomainVCpuInfoClear(virDomainVCpuInfoPtr info)
+{
+    if (!info)
+        return;
+}
+
+
 int
 virDomainDefSetVCpusMax(virDomainDefPtr def,
                         unsigned int vcpus)
 {
+    size_t i;
+
+    if (def->maxvcpus == vcpus)
+        return 0;
+
     if (vcpus == 0) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                        _("domain config can't have 0 maximum vCPUs"));
         return -1;
     }

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

-    def->maxvcpus = vcpus;
+        VIR_SHRINK_N(def->vcpus, def->maxvcpus, def->maxvcpus - vcpus);
+    }

     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 3490f02..68f82c6 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2129,6 +2129,14 @@ struct _virDomainCputune {
     virDomainThreadSchedParamPtr iothreadsched;
 };

+
+typedef struct _virDomainVCpuInfo virDomainVCpuInfo;
+typedef virDomainVCpuInfo *virDomainVCpuInfoPtr;
+
+struct _virDomainVCpuInfo {
+    bool online;
+};
+
 typedef struct _virDomainBlkiotune virDomainBlkiotune;
 typedef virDomainBlkiotune *virDomainBlkiotunePtr;

@@ -2202,7 +2210,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