[libvirt] [PATCH v2 1/2] qemu: vcpupin: Extract live vcpupin setting into a separate function

Peter Krempa pkrempa at redhat.com
Wed Mar 9 09:48:55 UTC 2016


The function was now beyond maintainability.
---
 src/qemu/qemu_driver.c | 134 ++++++++++++++++++++++++++++---------------------
 1 file changed, 78 insertions(+), 56 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 72ed3c0..3d45ce3 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4973,6 +4973,82 @@ qemuDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus)


 static int
+qemuDomainPinVcpuLive(virDomainObjPtr vm,
+                      virDomainDefPtr def,
+                      int vcpu,
+                      virQEMUDriverPtr driver,
+                      virQEMUDriverConfigPtr cfg,
+                      virBitmapPtr cpumap)
+{
+    virDomainVcpuInfoPtr vcpuinfo;
+    qemuDomainObjPrivatePtr priv = vm->privateData;
+    virCgroupPtr cgroup_vcpu = NULL;
+    char *str = NULL;
+    virObjectEventPtr event = NULL;
+    char paramField[VIR_TYPED_PARAM_FIELD_LENGTH] = "";
+    virTypedParameterPtr eventParams = NULL;
+    int eventNparams = 0;
+    int eventMaxparams = 0;
+    int ret = -1;
+
+    if (!qemuDomainHasVcpuPids(vm)) {
+        virReportError(VIR_ERR_OPERATION_INVALID,
+                       "%s", _("cpu affinity is not supported"));
+        goto cleanup;
+    }
+
+    if (!(vcpuinfo = virDomainDefGetVcpu(def, vcpu))) {
+        virReportError(VIR_ERR_INVALID_ARG,
+                       _("vcpu %d is out of range of live cpu count %d"),
+                       vcpu, virDomainDefGetVcpusMax(def));
+        goto cleanup;
+    }
+
+    if (vcpuinfo->online) {
+        /* Configure the corresponding cpuset cgroup before set affinity. */
+        if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) {
+            if (virCgroupNewThread(priv->cgroup, VIR_CGROUP_THREAD_VCPU, vcpu,
+                                   false, &cgroup_vcpu) < 0)
+                goto cleanup;
+            if (qemuSetupCgroupCpusetCpus(cgroup_vcpu, cpumap) < 0)
+                goto cleanup;
+        }
+
+        if (virProcessSetAffinity(qemuDomainGetVcpuPid(vm, vcpu), cpumap) < 0)
+            goto cleanup;
+    }
+
+    virBitmapFree(vcpuinfo->cpumask);
+    vcpuinfo->cpumask = cpumap;
+    cpumap = NULL;
+
+    if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
+        goto cleanup;
+
+    if (snprintf(paramField, VIR_TYPED_PARAM_FIELD_LENGTH,
+                 VIR_DOMAIN_TUNABLE_CPU_VCPUPIN, vcpu) < 0) {
+        goto cleanup;
+    }
+
+    str = virBitmapFormat(vcpuinfo->cpumask);
+    if (virTypedParamsAddString(&eventParams, &eventNparams,
+                                &eventMaxparams, paramField, str) < 0)
+        goto cleanup;
+
+    event = virDomainEventTunableNewFromObj(vm, eventParams, eventNparams);
+
+    ret = 0;
+
+ cleanup:
+    virBitmapFree(cpumap);
+    virCgroupFree(&cgroup_vcpu);
+    VIR_FREE(str);
+    qemuDomainEventQueue(driver, event);
+    return ret;
+}
+
+
+static int
 qemuDomainPinVcpuFlags(virDomainPtr dom,
                        unsigned int vcpu,
                        unsigned char *cpumap,
@@ -4984,21 +5060,12 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
     virDomainObjPtr vm;
     virDomainDefPtr def;
     virDomainDefPtr persistentDef;
-    virCgroupPtr cgroup_vcpu = NULL;
     int ret = -1;
-    qemuDomainObjPrivatePtr priv;
     virBitmapPtr pcpumap = NULL;
     virBitmapPtr pcpumaplive = NULL;
     virBitmapPtr pcpumappersist = NULL;
-    virDomainVcpuInfoPtr vcpuinfolive = NULL;
     virDomainVcpuInfoPtr vcpuinfopersist = NULL;
     virQEMUDriverConfigPtr cfg = NULL;
-    virObjectEventPtr event = NULL;
-    char paramField[VIR_TYPED_PARAM_FIELD_LENGTH] = "";
-    char *str = NULL;
-    virTypedParameterPtr eventParams = NULL;
-    int eventNparams = 0;
-    int eventMaxparams = 0;

     virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
                   VIR_DOMAIN_AFFECT_CONFIG, -1);
@@ -5017,15 +5084,6 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
     if (virDomainObjGetDefs(vm, flags, &def, &persistentDef) < 0)
         goto endjob;

-    priv = vm->privateData;
-
-    if (def && !(vcpuinfolive = virDomainDefGetVcpu(def, vcpu))) {
-        virReportError(VIR_ERR_INVALID_ARG,
-                       _("vcpu %d is out of range of live cpu count %d"),
-                       vcpu, virDomainDefGetVcpus(def));
-        goto endjob;
-    }
-
     if (persistentDef &&
         !(vcpuinfopersist = virDomainDefGetVcpu(persistentDef, vcpu))) {
         virReportError(VIR_ERR_INVALID_ARG,
@@ -5048,44 +5106,12 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
         goto endjob;

     if (def) {
-        if (!qemuDomainHasVcpuPids(vm)) {
-            virReportError(VIR_ERR_OPERATION_INVALID,
-                           "%s", _("cpu affinity is not supported"));
+        if (qemuDomainPinVcpuLive(vm, def, vcpu, driver, cfg, pcpumaplive) < 0) {
+            pcpumaplive = NULL;
             goto endjob;
         }

-        if (vcpuinfolive->online) {
-            /* Configure the corresponding cpuset cgroup before set affinity. */
-            if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) {
-                if (virCgroupNewThread(priv->cgroup, VIR_CGROUP_THREAD_VCPU, vcpu,
-                                       false, &cgroup_vcpu) < 0)
-                    goto endjob;
-                if (qemuSetupCgroupCpusetCpus(cgroup_vcpu, pcpumap) < 0)
-                    goto endjob;
-            }
-
-            if (virProcessSetAffinity(qemuDomainGetVcpuPid(vm, vcpu), pcpumap) < 0)
-                goto endjob;
-        }
-
-        virBitmapFree(vcpuinfolive->cpumask);
-        vcpuinfolive->cpumask = pcpumaplive;
         pcpumaplive = NULL;
-
-        if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
-            goto endjob;
-
-        if (snprintf(paramField, VIR_TYPED_PARAM_FIELD_LENGTH,
-                     VIR_DOMAIN_TUNABLE_CPU_VCPUPIN, vcpu) < 0) {
-            goto endjob;
-        }
-
-        str = virBitmapFormat(pcpumap);
-        if (virTypedParamsAddString(&eventParams, &eventNparams,
-                                    &eventMaxparams, paramField, str) < 0)
-            goto endjob;
-
-        event = virDomainEventTunableNewFromDom(dom, eventParams, eventNparams);
     }

     if (persistentDef) {
@@ -5103,11 +5129,7 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
     qemuDomainObjEndJob(driver, vm);

  cleanup:
-    if (cgroup_vcpu)
-        virCgroupFree(&cgroup_vcpu);
     virDomainObjEndAPI(&vm);
-    qemuDomainEventQueue(driver, event);
-    VIR_FREE(str);
     virBitmapFree(pcpumap);
     virBitmapFree(pcpumaplive);
     virBitmapFree(pcpumappersist);
-- 
2.6.2




More information about the libvir-list mailing list