[libvirt] [PATCH 2/4] vcpupin: implement the code to address the new API in the qemu driver

Taku Izumi izumi.taku at jp.fujitsu.com
Mon Apr 11 07:15:50 UTC 2011


This patch implements the code to address the new API (virDomainPinVcpuFlags)
in the qemu driver.

Signed-off-by: Taku Izumi <izumi.taku at jp.fujitsu.com>
---
 src/qemu/qemu_driver.c |  100 +++++++++++++++++++++++++++++++++++++------------
 1 file changed, 76 insertions(+), 24 deletions(-)

Index: libvirt/src/qemu/qemu_driver.c
===================================================================
--- libvirt.orig/src/qemu/qemu_driver.c
+++ libvirt/src/qemu/qemu_driver.c
@@ -2667,17 +2667,24 @@ qemudDomainSetVcpus(virDomainPtr dom, un
 
 
 static int
-qemudDomainPinVcpu(virDomainPtr dom,
-                   unsigned int vcpu,
-                   unsigned char *cpumap,
-                   int maplen) {
+qemudDomainPinVcpuFlags(virDomainPtr dom,
+                        unsigned int vcpu,
+                        unsigned char *cpumap,
+                        int maplen,
+                        unsigned int flags) {
+
     struct qemud_driver *driver = dom->conn->privateData;
     virDomainObjPtr vm;
+    virDomainDefPtr persistentDef = NULL;
     int maxcpu, hostcpus;
     virNodeInfo nodeinfo;
     int ret = -1;
+    bool isActive;
     qemuDomainObjPrivatePtr priv;
 
+    virCheckFlags(VIR_DOMAIN_VCPU_LIVE |
+                  VIR_DOMAIN_VCPU_CONFIG, -1);
+
     qemuDriverLock(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
     qemuDriverUnlock(driver);
@@ -2690,9 +2697,18 @@ qemudDomainPinVcpu(virDomainPtr dom,
         goto cleanup;
     }
 
-    if (!virDomainObjIsActive(vm)) {
-        qemuReportError(VIR_ERR_OPERATION_INVALID,
-                        "%s",_("cannot pin vcpus on an inactive domain"));
+    isActive = virDomainObjIsActive(vm);
+    if (flags == VIR_DOMAIN_VCPU_CURRENT) {
+        if (isActive)
+            flags = VIR_DOMAIN_VCPU_LIVE;
+        else
+            flags = VIR_DOMAIN_VCPU_CONFIG;
+    }
+
+    if (!isActive && (flags & VIR_DOMAIN_VCPU_LIVE)) {
+        qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                        _("a domain is inactive; can change only "
+                          "persistent config"));
         goto cleanup;
     }
 
@@ -2705,27 +2721,54 @@ qemudDomainPinVcpu(virDomainPtr dom,
         goto cleanup;
     }
 
-    if (nodeGetInfo(dom->conn, &nodeinfo) < 0)
-        goto cleanup;
+    if (flags & VIR_DOMAIN_VCPU_CONFIG) {
+        if (!vm->persistent) {
+            qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                   _("cannot change persistent config of a transient domain"));
+            goto cleanup;
+        }
+        if (!(persistentDef = virDomainObjGetPersistentDef(driver->caps, vm)))
+            goto cleanup;
+    }
 
-    hostcpus = VIR_NODEINFO_MAXCPUS(nodeinfo);
-    maxcpu = maplen * 8;
-    if (maxcpu > hostcpus)
-        maxcpu = hostcpus;
+    if (flags & VIR_DOMAIN_VCPU_LIVE) {
 
-    if (priv->vcpupids != NULL) {
-        if (virProcessInfoSetAffinity(priv->vcpupids[vcpu],
-                                      cpumap, maplen, maxcpu) < 0)
+        if (nodeGetInfo(dom->conn, &nodeinfo) < 0)
             goto cleanup;
-    } else {
-        qemuReportError(VIR_ERR_NO_SUPPORT,
-                        "%s", _("cpu affinity is not supported"));
-        goto cleanup;
+
+        hostcpus = VIR_NODEINFO_MAXCPUS(nodeinfo);
+        maxcpu = maplen * 8;
+        if (maxcpu > hostcpus)
+            maxcpu = hostcpus;
+
+        if (priv->vcpupids != NULL) {
+            if (virProcessInfoSetAffinity(priv->vcpupids[vcpu],
+                                          cpumap, maplen, maxcpu) < 0)
+                goto cleanup;
+        } else {
+            qemuReportError(VIR_ERR_NO_SUPPORT,
+                            "%s", _("cpu affinity is not supported"));
+            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 (virDomainVcpupinAdd(vm->def, cpumap, maplen, vcpu) < 0) {
-        qemuReportError(VIR_ERR_INTERNAL_ERROR,
-                        "%s", _("failed to update or add vcpupin xml"));
+    if (flags & VIR_DOMAIN_VCPU_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;
+        }
+        ret = virDomainSaveConfig(driver->configDir, persistentDef);
         goto cleanup;
     }
 
@@ -2738,6 +2781,15 @@ cleanup:
 }
 
 static int
+qemudDomainPinVcpu(virDomainPtr dom,
+                   unsigned int vcpu,
+                   unsigned char *cpumap,
+                   int maplen) {
+    return qemudDomainPinVcpuFlags(dom, vcpu, cpumap, maplen,
+                                   VIR_DOMAIN_VCPU_LIVE);
+}
+
+static int
 qemudDomainGetVcpus(virDomainPtr dom,
                     virVcpuInfoPtr info,
                     int maxinfo,
@@ -6901,7 +6953,7 @@ static virDriver qemuDriver = {
     qemudDomainSetVcpusFlags, /* domainSetVcpusFlags */
     qemudDomainGetVcpusFlags, /* domainGetVcpusFlags */
     qemudDomainPinVcpu, /* domainPinVcpu */
-    NULL, /* domainPinVcpuFlags */
+    qemudDomainPinVcpuFlags, /* domainPinVcpuFlags */
     qemudDomainGetVcpus, /* domainGetVcpus */
     qemudDomainGetMaxVcpus, /* domainGetMaxVcpus */
     qemudDomainGetSecurityLabel, /* domainGetSecurityLabel */





More information about the libvir-list mailing list