[libvirt] [PATCH] Explicitly pin hotplugged vcpu to all cpus

Ján Tomko jtomko at redhat.com
Fri May 23 12:37:44 UTC 2014


QEMU does not join vcpu threads after vcpu hotunplug.
The thread might stay pinned when we hotplug the cpu again.

We were already pinning the hotplugged vcpus when a per-domain
pinning was specified.

Explicitly pin the hotplugged vcpu to all cpus if there is no
cpuset specified in domain XML, to make sure the vcpupin
stays accurate.

https://bugzilla.redhat.com/show_bug.cgi?id=1099836
---
 src/qemu/qemu_driver.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 6fda50d..a4fa488 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3994,6 +3994,7 @@ static int qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
     pid_t *cpupids = NULL;
     int ncpupids;
     virCgroupPtr cgroup_vcpu = NULL;
+    virBitmapPtr cpumask = NULL;
 
     qemuDomainObjEnterMonitor(driver, vm);
 
@@ -4117,6 +4118,24 @@ static int qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
                         goto cleanup;
                     }
                 }
+            } else {
+                /* QEMU doesn't destroy vcpu threads on vcpu unplug.
+                 * Pin the vcpu to all CPUs just to be sure */
+                cpumask = qemuPrepareCpumap(driver, NULL);
+                virBitmapSetAll(cpumask);
+                if (cgroup_vcpu) {
+                    if (qemuSetupCgroupEmulatorPin(cgroup_vcpu, cpumask) < 0)
+                        goto cleanup;
+                } else {
+                    if (virProcessSetAffinity(cpupids[i], cpumask) < 0) {
+                        virReportError(VIR_ERR_SYSTEM_ERROR,
+                                       _("failed to set cpu affinity for vcpu %zu"),
+                                       i);
+                        ret = -1;
+                        goto cleanup;
+                    }
+                }
+                VIR_FREE(cpumask);
             }
 
             virCgroupFree(&cgroup_vcpu);
@@ -4145,6 +4164,7 @@ static int qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
  cleanup:
     qemuDomainObjExitMonitor(driver, vm);
     vm->def->vcpus = vcpus;
+    VIR_FREE(cpumask);
     VIR_FREE(cpupids);
     virDomainAuditVcpu(vm, oldvcpus, nvcpus, "update", rc == 1);
     if (cgroup_vcpu)
-- 
1.8.3.2




More information about the libvir-list mailing list