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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list