[PATCH 4/4] vcpupin: add vcpupin resetting feature to qemu driver

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

 



Pinning to all physical cpus means resetting, hence it is preferable to
delete vcpupin setting of XML.

This patch changes qemu driver to delete vcpupin setting by invoking 
virDomainVcpupinDel API when pinning the specified virtual cpu to
all host physical cpus.

Signed-off-by: Taku Izumi <izumi.taku@xxxxxxxxxxxxxx>
---
 src/qemu/qemu_driver.c |   64 +++++++++++++++++++++++++++++++++++--------------
 1 file changed, 46 insertions(+), 18 deletions(-)

Index: libvirt/src/qemu/qemu_driver.c
===================================================================
--- libvirt.orig/src/qemu/qemu_driver.c
+++ libvirt/src/qemu/qemu_driver.c
@@ -2894,6 +2894,7 @@ qemudDomainPinVcpuFlags(virDomainPtr dom
     int ret = -1;
     bool isActive;
     qemuDomainObjPrivatePtr priv;
+    bool canResetting = true;
 
     virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
                   VIR_DOMAIN_AFFECT_CONFIG, -1);
@@ -2944,15 +2945,23 @@ qemudDomainPinVcpuFlags(virDomainPtr dom
             goto cleanup;
     }
 
-    if (flags & VIR_DOMAIN_AFFECT_LIVE) {
-
-        if (nodeGetInfo(dom->conn, &nodeinfo) < 0)
-            goto cleanup;
+    if (nodeGetInfo(dom->conn, &nodeinfo) < 0)
+        goto cleanup;
+    hostcpus = VIR_NODEINFO_MAXCPUS(nodeinfo);
+    maxcpu = maplen * 8;
+    if (maxcpu > hostcpus)
+        maxcpu = hostcpus;
+    /* pinning to all physical cpus means resetting,
+     * so check if we can reset setting.
+     */
+    for (int pcpu = 0; pcpu < hostcpus; pcpu++) {
+        if ((cpumap[pcpu/8] & (1 << (pcpu % 8))) == 0) {
+            canResetting = false;
+            break;
+        }
+    }
 
-        hostcpus = VIR_NODEINFO_MAXCPUS(nodeinfo);
-        maxcpu = maplen * 8;
-        if (maxcpu > hostcpus)
-            maxcpu = hostcpus;
+    if (flags & VIR_DOMAIN_AFFECT_LIVE) {
 
         if (priv->vcpupids != NULL) {
             if (virProcessInfoSetAffinity(priv->vcpupids[vcpu],
@@ -2964,23 +2973,42 @@ qemudDomainPinVcpuFlags(virDomainPtr dom
             goto cleanup;
         }
 
-        if (virDomainVcpupinAdd(vm->def, cpumap, maplen, vcpu) < 0) {
-            qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                            _("failed to update or add vcpupin xml of "
-                              "a running domain"));
-            goto cleanup;
+        if (canResetting) {
+            if (virDomainVcpupinDel(vm->def, vcpu) < 0) {
+                qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                                _("failed to delete vcpupin xml of "
+                                  "a running domain"));
+                goto cleanup;
+            }
+        } else {
+            if (virDomainVcpupinAdd(vm->def, cpumap, maplen, vcpu) < 0) {
+                qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                                _("failed to update or add vcpupin xml of "
+                                  "a running domain"));
+                goto cleanup;
+            }
         }
 
     }
 
     if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
 
-        if (virDomainVcpupinAdd(persistentDef, cpumap, maplen, vcpu) < 0) {
-            qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                            _("failed to update or add vcpupin xml of "
-                              "a persistent domain"));
-            goto cleanup;
+        if (canResetting) {
+            if (virDomainVcpupinDel(persistentDef, vcpu) < 0) {
+                qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                                _("failed to delete vcpupin xml of "
+                                  "a persistent domain"));
+                goto cleanup;
+            }
+        } else {
+            if (virDomainVcpupinAdd(persistentDef, cpumap, maplen, vcpu) < 0) {
+                qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                                _("failed to update or add vcpupin xml of "
+                                  "a persistent domain"));
+                goto cleanup;
+            }
         }
+
         ret = virDomainSaveConfig(driver->configDir, persistentDef);
         goto cleanup;
     }

--
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]