[PATCH v3 5/5] qemu: qemuDomainHotplugVcpus - separate out pin adjustment code

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Future IOThread setting patches would copy the code anyway, so create
and generalize the adding of pindef for the vcpu and the pinning of the
thread into their own APIs.

Signed-off-by: John Ferlan <jferlan@xxxxxxxxxx>
---
 src/qemu/qemu_driver.c | 103 ++++++++++++++++++++++++++++++++-----------------
 1 file changed, 67 insertions(+), 36 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 7810dee..4165e9e 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4670,6 +4670,67 @@ qemuDomainAddCgroupForThread(virCgroupPtr cgroup,
 }
 
 static int
+qemuDomainHotplugAddPin(virBitmapPtr cpumask,
+                        int index,
+                        virDomainPinDefPtr **pindef_list,
+                        size_t *npin)
+{
+    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;
+    }
+    ret = 0;
+
+ cleanup:
+    return ret;
+}
+
+static int
+qemuDomainHotplugPinThread(virBitmapPtr cpumask,
+                           int index,
+                           pid_t pid,
+                           virCgroupPtr cgroup)
+{
+    int ret = -1;
+
+    if (cgroup) {
+        if (qemuSetupCgroupCpusetCpus(cgroup, cpumask) < 0) {
+            virReportError(VIR_ERR_OPERATION_INVALID,
+                           _("failed to set cpuset.cpus in cgroup for id %d"),
+                           index);
+            goto cleanup;
+        }
+    } else {
+        if (virProcessSetAffinity(pid, 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
 qemuDomainDelCgroupForThread(virCgroupPtr cgroup,
                              virCgroupThreadName nameval,
                              int index)
@@ -4791,48 +4852,18 @@ 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);
+                if (qemuDomainHotplugAddPin(vm->def->cpumask, i,
+                                            &vm->def->cputune.vcpupin,
+                                            &vm->def->cputune.nvcpupin) < 0) {
+                    ret = -1;
                     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 (qemuDomainHotplugPinThread(vm->def->cpumask, i, cpupids[i],
+                                               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

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]