]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
conf: turn def->vcpus into a structure
authorPeter Krempa <pkrempa@redhat.com>
Fri, 23 Oct 2015 07:38:01 +0000 (09:38 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 9 Dec 2015 13:57:12 +0000 (14:57 +0100)
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
src/conf/domain_conf.h

index 202b2374899ca1af469cb36ca522601f21b7ee25..6d08e88e7266991341a278ec7bfbae77ea771626 100644 (file)
@@ -1284,14 +1284,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;
 }
@@ -1300,7 +1318,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;
 }
 
 
@@ -1315,6 +1340,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)"),
@@ -1322,7 +1349,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;
 }
@@ -1331,7 +1362,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;
 }
 
 
@@ -2359,6 +2398,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,
index deabea4093aa6ef5fb1627fbc98bcc75a59d5689..6b9fa864463d309980c9eaa63800c334cdd2b2f8 100644 (file)
@@ -2145,6 +2145,14 @@ struct _virDomainCputune {
     virDomainThreadSchedParamPtr iothreadsched;
 };
 
+
+typedef struct _virDomainVcpuInfo virDomainVcpuInfo;
+typedef virDomainVcpuInfo *virDomainVcpuInfoPtr;
+
+struct _virDomainVcpuInfo {
+    bool online;
+};
+
 typedef struct _virDomainBlkiotune virDomainBlkiotune;
 typedef virDomainBlkiotune *virDomainBlkiotunePtr;
 
@@ -2218,7 +2226,7 @@ struct _virDomainDef {
     virDomainBlkiotune blkio;
     virDomainMemtune mem;
 
-    unsigned int vcpus;
+    virDomainVcpuInfoPtr vcpus;
     size_t maxvcpus;
     int placement_mode;
     virBitmapPtr cpumask;