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

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



On 06/09/2011 11:38 AM, Taku Izumi wrote:

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

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

Index: libvirt/src/qemu/qemu_driver.c
===================================================================
--- libvirt.orig/src/qemu/qemu_driver.c
+++ libvirt/src/qemu/qemu_driver.c
@@ -2880,17 +2880,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_AFFECT_LIVE |
+                  VIR_DOMAIN_AFFECT_CONFIG, -1);
+
      qemuDriverLock(driver);
      vm = virDomainFindByUUID(&driver->domains, dom->uuid);
      qemuDriverUnlock(driver);
@@ -2903,9 +2910,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_AFFECT_CURRENT) {
+        if (isActive)
+            flags = VIR_DOMAIN_AFFECT_LIVE;
+        else
+            flags = VIR_DOMAIN_AFFECT_CONFIG;
+    }
+
+    if (!isActive&&  (flags&  VIR_DOMAIN_AFFECT_LIVE)) {
+        qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                        _("a domain is inactive; can change only "
+                          "persistent config"));
          goto cleanup;
      }

@@ -2918,27 +2934,54 @@ qemudDomainPinVcpu(virDomainPtr dom,
          goto cleanup;
      }

-    if (nodeGetInfo(dom->conn,&nodeinfo)<  0)
-        goto cleanup;
+    if (flags&  VIR_DOMAIN_AFFECT_CONFIG) {
+        if (!vm->persistent) {
+            qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                   _("cannot change persistent config of a transient
domain"));

Indention

+            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_AFFECT_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_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;
+        }
+        ret = virDomainSaveConfig(driver->configDir, persistentDef);
          goto cleanup;
      }

@@ -2951,6 +2994,15 @@ cleanup:
  }

  static int
+qemudDomainPinVcpu(virDomainPtr dom,
+                   unsigned int vcpu,
+                   unsigned char *cpumap,
+                   int maplen) {
+    return qemudDomainPinVcpuFlags(dom, vcpu, cpumap, maplen,
+                                   VIR_DOMAIN_AFFECT_LIVE);
+}
+
+static int
  qemudDomainGetVcpus(virDomainPtr dom,
                      virVcpuInfoPtr info,
                      int maxinfo,
@@ -8014,6 +8066,7 @@ static virDriver qemuDriver = {
      .domainSetVcpusFlags = qemudDomainSetVcpusFlags, /* 0.8.5 */
      .domainGetVcpusFlags = qemudDomainGetVcpusFlags, /* 0.8.5 */
      .domainPinVcpu = qemudDomainPinVcpu, /* 0.4.4 */
+    .domainPinVcpuFlags = qemudDomainPinVcpuFlags, /* 0.9.2 */

Here should be 0.9.3, 0.9.2 is already out.


      .domainGetVcpus = qemudDomainGetVcpus, /* 0.4.4 */
      .domainGetMaxVcpus = qemudDomainGetMaxVcpus, /* 0.4.4 */
      .domainGetSecurityLabel = qemudDomainGetSecurityLabel, /* 0.6.1 */




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