]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: driver: Extract setting of live vcpu count
authorPeter Krempa <pkrempa@redhat.com>
Tue, 16 Aug 2016 11:27:57 +0000 (13:27 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 16 Aug 2016 12:28:38 +0000 (14:28 +0200)
The live code does ugly things. Contain it in a separate function.

src/qemu/qemu_driver.c

index b81baa521e85a9d38a3d1b3dd64144754f8c77f3..95a78387022b4ed70a2f72efa2c49501e3532143 100644 (file)
@@ -4791,6 +4791,72 @@ qemuDomainSetVcpusMax(virQEMUDriverPtr driver,
 }
 
 
+static int
+qemuDomainSetVcpusLive(virQEMUDriverPtr driver,
+                       virQEMUDriverConfigPtr cfg,
+                       virDomainObjPtr vm,
+                       unsigned int nvcpus)
+{
+    qemuDomainObjPrivatePtr priv = vm->privateData;
+    size_t i;
+    virCgroupPtr cgroup_temp = NULL;
+    char *mem_mask = NULL;
+    char *all_nodes_str = NULL;
+    virBitmapPtr all_nodes = NULL;
+    virErrorPtr err = NULL;
+    int ret = -1;
+
+    if (virNumaIsAvailable() &&
+        virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) {
+        if (virCgroupNewThread(priv->cgroup, VIR_CGROUP_THREAD_EMULATOR, 0,
+                               false, &cgroup_temp) < 0)
+            goto cleanup;
+
+        if (!(all_nodes = virNumaGetHostNodeset()))
+            goto cleanup;
+
+        if (!(all_nodes_str = virBitmapFormat(all_nodes)))
+            goto cleanup;
+
+        if (virCgroupGetCpusetMems(cgroup_temp, &mem_mask) < 0 ||
+            virCgroupSetCpusetMems(cgroup_temp, all_nodes_str) < 0)
+            goto cleanup;
+    }
+
+    if (nvcpus > virDomainDefGetVcpus(vm->def)) {
+        for (i = virDomainDefGetVcpus(vm->def); i < nvcpus; i++) {
+            if (qemuDomainHotplugAddVcpu(driver, vm, i) < 0)
+                goto cleanup;
+        }
+    } else {
+        for (i = virDomainDefGetVcpus(vm->def) - 1; i >= nvcpus; i--) {
+            if (qemuDomainHotplugDelVcpu(driver, vm, i) < 0)
+                goto cleanup;
+        }
+    }
+
+    if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
+        goto cleanup;
+
+    ret = 0;
+
+ cleanup:
+    if (mem_mask) {
+        err = virSaveLastError();
+        virCgroupSetCpusetMems(cgroup_temp, mem_mask);
+        virSetError(err);
+        virFreeError(err);
+        VIR_FREE(mem_mask);
+    }
+
+    VIR_FREE(all_nodes_str);
+    virBitmapFree(all_nodes);
+    virCgroupFree(&cgroup_temp);
+
+    return ret;
+}
+
+
 static int
 qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
                         unsigned int flags)
@@ -4801,13 +4867,6 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
     virDomainDefPtr persistentDef;
     int ret = -1;
     virQEMUDriverConfigPtr cfg = NULL;
-    qemuDomainObjPrivatePtr priv;
-    size_t i;
-    virCgroupPtr cgroup_temp = NULL;
-    char *mem_mask = NULL;
-    char *all_nodes_str = NULL;
-    virBitmapPtr all_nodes = NULL;
-    virErrorPtr err = NULL;
 
     virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
                   VIR_DOMAIN_AFFECT_CONFIG |
@@ -4822,8 +4881,6 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
     if (virDomainSetVcpusFlagsEnsureACL(dom->conn, vm->def, flags) < 0)
         goto cleanup;
 
-    priv = vm->privateData;
-
     if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0)
         goto cleanup;
 
@@ -4860,39 +4917,8 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
         }
     }
 
-    if (def && virNumaIsAvailable() &&
-        virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) {
-        if (virCgroupNewThread(priv->cgroup, VIR_CGROUP_THREAD_EMULATOR, 0,
-                               false, &cgroup_temp) < 0)
-            goto endjob;
-
-        if (!(all_nodes = virNumaGetHostNodeset()))
-            goto endjob;
-
-        if (!(all_nodes_str = virBitmapFormat(all_nodes)))
-            goto endjob;
-
-        if (virCgroupGetCpusetMems(cgroup_temp, &mem_mask) < 0 ||
-            virCgroupSetCpusetMems(cgroup_temp, all_nodes_str) < 0)
-            goto endjob;
-    }
-
-    if (def) {
-        if (nvcpus > virDomainDefGetVcpus(def)) {
-            for (i = virDomainDefGetVcpus(def); i < nvcpus; i++) {
-                if (qemuDomainHotplugAddVcpu(driver, vm, i) < 0)
-                    goto endjob;
-            }
-        } else {
-            for (i = virDomainDefGetVcpus(def) - 1; i >= nvcpus; i--) {
-                if (qemuDomainHotplugDelVcpu(driver, vm, i) < 0)
-                    goto endjob;
-            }
-        }
-
-        if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
-            goto endjob;
-    }
+    if (def && qemuDomainSetVcpusLive(driver, cfg, vm, nvcpus) < 0)
+        goto endjob;
 
     if (persistentDef) {
         if (virDomainDefSetVcpus(persistentDef, nvcpus) < 0)
@@ -4906,21 +4932,10 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
     ret = 0;
 
  endjob:
-    if (mem_mask) {
-        err = virSaveLastError();
-        virCgroupSetCpusetMems(cgroup_temp, mem_mask);
-        virSetError(err);
-        virFreeError(err);
-    }
-
     qemuDomainObjEndJob(driver, vm);
 
  cleanup:
     virDomainObjEndAPI(&vm);
-    VIR_FREE(mem_mask);
-    VIR_FREE(all_nodes_str);
-    virBitmapFree(all_nodes);
-    virCgroupFree(&cgroup_temp);
     virObjectUnref(cfg);
     return ret;
 }