[libvirt] [PATCH 7/9] qemu: add support for offline vcpupin

Peter Krempa pkrempa at redhat.com
Wed Feb 24 14:22:55 UTC 2016


Allow pinning for inactive cpus. The pinning mask will be automatically
applied as we would apply the default mask in case of a cpu hotplug.

Setting the scheduler settings for a vcpu has the same semantics.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1306556
---
 src/qemu/qemu_domain.c |  3 ++-
 src/qemu/qemu_driver.c | 62 ++++++++++++++++++--------------------------------
 2 files changed, 24 insertions(+), 41 deletions(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index a0dfa7e..f2b9338 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -1515,7 +1515,8 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
 virDomainDefParserConfig virQEMUDriverDomainDefParserConfig = {
     .devicesPostParseCallback = qemuDomainDeviceDefPostParse,
     .domainPostParseCallback = qemuDomainDefPostParse,
-    .features = VIR_DOMAIN_DEF_FEATURE_MEMORY_HOTPLUG,
+    .features = VIR_DOMAIN_DEF_FEATURE_MEMORY_HOTPLUG |
+                VIR_DOMAIN_DEF_FEATURE_OFFLINE_CPUPIN
 };


diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index c8b996b..bfabc53 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4754,9 +4754,6 @@ qemuDomainHotplugDelVcpu(virQEMUDriverPtr driver,
                                      VIR_CGROUP_THREAD_VCPU, vcpu) < 0)
         goto cleanup;

-    virBitmapFree(vcpuinfo->cpumask);
-    vcpuinfo->cpumask = NULL;
-
     ret = 0;

  cleanup:
@@ -5016,36 +5013,19 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,

     priv = vm->privateData;

-    if (def) {
-        if (!(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 (!vcpuinfolive->online) {
-            virReportError(VIR_ERR_OPERATION_INVALID,
-                           _("setting cpu pinning for inactive vcpu '%d' is not "
-                             "supported"), vcpu);
-            goto endjob;
-        }
+    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) {
-        if (!(vcpuinfopersist = virDomainDefGetVcpu(persistentDef, vcpu))) {
-            virReportError(VIR_ERR_INVALID_ARG,
-                           _("vcpu %d is out of range of persistent cpu count %d"),
-                           vcpu, virDomainDefGetVcpus(persistentDef));
-            goto endjob;
-        }
-
-        if (!vcpuinfopersist->online) {
-            virReportError(VIR_ERR_OPERATION_INVALID,
-                           _("setting cpu pinning for inactive vcpu '%d' is not "
-                             "supported"), vcpu);
-            goto endjob;
-        }
+    if (persistentDef &&
+        !(vcpuinfopersist = virDomainDefGetVcpu(persistentDef, vcpu))) {
+        virReportError(VIR_ERR_INVALID_ARG,
+                       _("vcpu %d is out of range of persistent cpu count %d"),
+                       vcpu, virDomainDefGetVcpus(persistentDef));
+        goto endjob;
     }

     if (!(pcpumap = virBitmapNewData(cpumap, maplen)))
@@ -5068,18 +5048,20 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
             goto endjob;
         }

-        /* 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)
+        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;
         }

-        if (virProcessSetAffinity(qemuDomainGetVcpuPid(vm, vcpu), pcpumap) < 0)
-            goto endjob;
-
         virBitmapFree(vcpuinfolive->cpumask);
         vcpuinfolive->cpumask = pcpumaplive;
         pcpumaplive = NULL;
-- 
2.6.2




More information about the libvir-list mailing list