[libvirt] [PATCH 3/3] qemu: qemuDomainHotplugVcpus - separate out pin adjustment code

John Ferlan jferlan at redhat.com
Thu Apr 2 16:24:42 UTC 2015


Future IOThread setting patches would copy the code anyway, so create
and generalize the adding of pindef for the vcpu into its own API

Signed-off-by: John Ferlan <jferlan at redhat.com>
---
 src/qemu/qemu_driver.c | 92 +++++++++++++++++++++++++++++---------------------
 1 file changed, 54 insertions(+), 38 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 5dc1ad4..f047403 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4675,6 +4675,56 @@ qemuDomainHotplugAddCgroup(virCgroupPtr cgroup,
 }
 
 static int
+qemuDomainHotplugAddPin(virBitmapPtr cpumask,
+                        int index,
+                        pid_t pid,
+                        virDomainPinDefPtr **pindef_list,
+                        size_t *npin,
+                        virCgroupPtr cgroup)
+{
+    int ret = -1;
+    virDomainPinDefPtr pindef = NULL;
+
+    /* vm->def->cputune.* arrays can't be NULL if
+     * vm->def->cpumask is not NULL.
+     */
+    if (VIR_ALLOC(pindef) < 0)
+        goto cleanup;
+
+    if (!(pindef->cpumask = virBitmapNewCopy(cpumask))) {
+        VIR_FREE(pindef);
+        goto cleanup;
+    }
+    pindef->id = index;
+    if (VIR_APPEND_ELEMENT_COPY(*pindef_list, *npin, pindef) < 0) {
+        virBitmapFree(pindef->cpumask);
+        VIR_FREE(pindef);
+        goto cleanup;
+    }
+
+    if (cgroup) {
+        if (qemuSetupCgroupCpusetCpus(cgroup, pindef->cpumask) < 0) {
+            virReportError(VIR_ERR_OPERATION_INVALID,
+                           _("failed to set cpuset.cpus in cgroup for id %d"),
+                           index);
+            goto cleanup;
+        }
+    } else {
+        if (virProcessSetAffinity(pid, pindef->cpumask) < 0) {
+            virReportError(VIR_ERR_SYSTEM_ERROR,
+                           _("failed to set cpu affinity for id %d"),
+                           index);
+            goto cleanup;
+        }
+    }
+
+    ret = 0;
+
+ cleanup:
+    return ret;
+}
+
+static int
 qemuDomainHotplugDelCgroupPin(virCgroupPtr cgroup,
                               cgroupNewFunc func,
                               int index,
@@ -4800,48 +4850,14 @@ qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
 
             /* Inherit def->cpuset */
             if (vm->def->cpumask) {
-                /* vm->def->cputune.vcpupin can't be NULL if
-                 * vm->def->cpumask is not NULL.
-                 */
-                virDomainPinDefPtr vcpupin = NULL;
-
-                if (VIR_ALLOC(vcpupin) < 0)
-                    goto cleanup;
-
-                if (!(vcpupin->cpumask = virBitmapNewCopy(vm->def->cpumask))) {
-                    VIR_FREE(vcpupin);
-                    goto cleanup;
-                }
-                vcpupin->id = i;
-                if (VIR_APPEND_ELEMENT_COPY(vm->def->cputune.vcpupin,
-                                            vm->def->cputune.nvcpupin, vcpupin) < 0) {
-                    virBitmapFree(vcpupin->cpumask);
-                    VIR_FREE(vcpupin);
+                if (qemuDomainHotplugAddPin(vm->def->cpumask, i, cpupids[i],
+                                            &vm->def->cputune.vcpupin,
+                                            &vm->def->cputune.nvcpupin,
+                                            cgroup_vcpu) < 0) {
                     ret = -1;
                     goto cleanup;
                 }
-
-                if (cgroup_vcpu) {
-                    if (qemuSetupCgroupCpusetCpus(cgroup_vcpu,
-                                                  vcpupin->cpumask) < 0) {
-                        virReportError(VIR_ERR_OPERATION_INVALID,
-                                       _("failed to set cpuset.cpus in cgroup"
-                                         " for vcpu %zu"), i);
-                        ret = -1;
-                        goto cleanup;
-                    }
-                } else {
-                    if (virProcessSetAffinity(cpupids[i],
-                                              vcpupin->cpumask) < 0) {
-                        virReportError(VIR_ERR_SYSTEM_ERROR,
-                                       _("failed to set cpu affinity for vcpu %zu"),
-                                       i);
-                        ret = -1;
-                        goto cleanup;
-                    }
-                }
             }
-
             virCgroupFree(&cgroup_vcpu);
 
             if (qemuProcessSetSchedParams(i, cpupids[i],
-- 
2.1.0




More information about the libvir-list mailing list