render / rpms / libvirt

Forked from rpms/libvirt 7 months ago
Clone
e10da2
From 50c51f13e2af04afac46e181c4ed62581545a488 Mon Sep 17 00:00:00 2001
e10da2
From: Eric Blake <eblake@redhat.com>
e10da2
Date: Mon, 27 Sep 2010 16:37:53 -0600
e10da2
Subject: [PATCH 06/15] vcpu: make old API trivially wrap to new API
e10da2
e10da2
Note - this wrapping is completely mechanical; the old API will
e10da2
function identically, since the new API validates that the exact
e10da2
same flags are provided by the old API.  On a per-driver basis,
e10da2
it may make sense to have the old API pass a different set of flags,
e10da2
but that should be done in the per-driver patch that implements
e10da2
the full range of flag support in the new API.
e10da2
e10da2
* src/esx/esx_driver.c (esxDomainSetVcpus, escDomainGetMaxVpcus):
e10da2
Move guts...
e10da2
(esxDomainSetVcpusFlags, esxDomainGetVcpusFlags): ...to new
e10da2
functions.
e10da2
(esxDriver): Trivially support the new API.
e10da2
* src/openvz/openvz_driver.c (openvzDomainSetVcpus)
e10da2
(openvzDomainSetVcpusFlags, openvzDomainGetMaxVcpus)
e10da2
(openvzDomainGetVcpusFlags, openvzDriver): Likewise.
e10da2
* src/phyp/phyp_driver.c (phypDomainSetCPU)
e10da2
(phypDomainSetVcpusFlags, phypGetLparCPUMAX)
e10da2
(phypDomainGetVcpusFlags, phypDriver): Likewise.
e10da2
* src/qemu/qemu_driver.c (qemudDomainSetVcpus)
e10da2
(qemudDomainSetVcpusFlags, qemudDomainGetMaxVcpus)
e10da2
(qemudDomainGetVcpusFlags, qemuDriver): Likewise.
e10da2
* src/test/test_driver.c (testSetVcpus, testDomainSetVcpusFlags)
e10da2
(testDomainGetMaxVcpus, testDomainGetVcpusFlags, testDriver):
e10da2
Likewise.
e10da2
* src/vbox/vbox_tmpl.c (vboxDomainSetVcpus)
e10da2
(vboxDomainSetVcpusFlags, virDomainGetMaxVcpus)
e10da2
(virDomainGetVcpusFlags, virDriver): Likewise.
e10da2
* src/xen/xen_driver.c (xenUnifiedDomainSetVcpus)
e10da2
(xenUnifiedDomainSetVcpusFlags, xenUnifiedDomainGetMaxVcpus)
e10da2
(xenUnifiedDomainGetVcpusFlags, xenUnifiedDriver): Likewise.
e10da2
* src/xenapi/xenapi_driver.c (xenapiDomainSetVcpus)
e10da2
(xenapiDomainSetVcpusFlags, xenapiDomainGetMaxVcpus)
e10da2
(xenapiDomainGetVcpusFlags, xenapiDriver): Likewise.
e10da2
(xenapiError): New helper macro.
e10da2
---
e10da2
 src/esx/esx_driver.c       |   32 +++++++++++++++++++---
e10da2
 src/openvz/openvz_driver.c |   34 +++++++++++++++++++++---
e10da2
 src/phyp/phyp_driver.c     |   32 ++++++++++++++++++++---
e10da2
 src/qemu/qemu_driver.c     |   38 +++++++++++++++++++++++++---
e10da2
 src/test/test_driver.c     |   36 ++++++++++++++++++++++---
e10da2
 src/vbox/vbox_tmpl.c       |   36 +++++++++++++++++++++++---
e10da2
 src/xen/xen_driver.c       |   34 ++++++++++++++++++++++---
e10da2
 src/xenapi/xenapi_driver.c |   60 ++++++++++++++++++++++++++++++++++++++------
e10da2
 8 files changed, 263 insertions(+), 39 deletions(-)
e10da2
e10da2
diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
e10da2
index 2a32374..b3e1284 100644
e10da2
--- a/src/esx/esx_driver.c
e10da2
+++ b/src/esx/esx_driver.c
e10da2
@@ -2384,7 +2384,8 @@ esxDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info)
e10da2
e10da2
e10da2
 static int
e10da2
-esxDomainSetVcpus(virDomainPtr domain, unsigned int nvcpus)
e10da2
+esxDomainSetVcpusFlags(virDomainPtr domain, unsigned int nvcpus,
e10da2
+                       unsigned int flags)
e10da2
 {
e10da2
     int result = -1;
e10da2
     esxPrivate *priv = domain->conn->privateData;
e10da2
@@ -2394,6 +2395,11 @@ esxDomainSetVcpus(virDomainPtr domain, unsigned int nvcpus)
e10da2
     esxVI_ManagedObjectReference *task = NULL;
e10da2
     esxVI_TaskInfoState taskInfoState;
e10da2
e10da2
+    if (flags != VIR_DOMAIN_VCPU_LIVE) {
e10da2
+        ESX_ERROR(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"), flags);
e10da2
+        return -1;
e10da2
+    }
e10da2
+
e10da2
     if (nvcpus < 1) {
e10da2
         ESX_ERROR(VIR_ERR_INVALID_ARG, "%s",
e10da2
                   _("Requested number of virtual CPUs must at least be 1"));
e10da2
@@ -2453,15 +2459,26 @@ esxDomainSetVcpus(virDomainPtr domain, unsigned int nvcpus)
e10da2
 }
e10da2
e10da2
e10da2
+static int
e10da2
+esxDomainSetVcpus(virDomainPtr domain, unsigned int nvcpus)
e10da2
+{
e10da2
+    return esxDomainSetVcpusFlags(domain, nvcpus, VIR_DOMAIN_VCPU_LIVE);
e10da2
+}
e10da2
+
e10da2
e10da2
 static int
e10da2
-esxDomainGetMaxVcpus(virDomainPtr domain)
e10da2
+esxDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags)
e10da2
 {
e10da2
     esxPrivate *priv = domain->conn->privateData;
e10da2
     esxVI_String *propertyNameList = NULL;
e10da2
     esxVI_ObjectContent *hostSystem = NULL;
e10da2
     esxVI_DynamicProperty *dynamicProperty = NULL;
e10da2
e10da2
+    if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
e10da2
+        ESX_ERROR(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"), flags);
e10da2
+        return -1;
e10da2
+    }
e10da2
+
e10da2
     if (priv->maxVcpus > 0) {
e10da2
         return priv->maxVcpus;
e10da2
     }
e10da2
@@ -2507,7 +2524,12 @@ esxDomainGetMaxVcpus(virDomainPtr domain)
e10da2
     return priv->maxVcpus;
e10da2
 }
e10da2
e10da2
-
e10da2
+static int
e10da2
+esxDomainGetMaxVcpus(virDomainPtr domain)
e10da2
+{
e10da2
+    return esxDomainGetVcpusFlags(domain, (VIR_DOMAIN_VCPU_LIVE |
e10da2
+                                           VIR_DOMAIN_VCPU_MAXIMUM));
e10da2
+}
e10da2
e10da2
 static char *
e10da2
 esxDomainDumpXML(virDomainPtr domain, int flags)
e10da2
@@ -4160,8 +4182,8 @@ static virDriver esxDriver = {
e10da2
     NULL,                            /* domainRestore */
e10da2
     NULL,                            /* domainCoreDump */
e10da2
     esxDomainSetVcpus,               /* domainSetVcpus */
e10da2
-    NULL,                            /* domainSetVcpusFlags */
e10da2
-    NULL,                            /* domainGetVcpusFlags */
e10da2
+    esxDomainSetVcpusFlags,          /* domainSetVcpusFlags */
e10da2
+    esxDomainGetVcpusFlags,          /* domainGetVcpusFlags */
e10da2
     NULL,                            /* domainPinVcpu */
e10da2
     NULL,                            /* domainGetVcpus */
e10da2
     esxDomainGetMaxVcpus,            /* domainGetMaxVcpus */
e10da2
diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
e10da2
index 9d19aeb..0f3cfdf 100644
e10da2
--- a/src/openvz/openvz_driver.c
e10da2
+++ b/src/openvz/openvz_driver.c
e10da2
@@ -67,7 +67,6 @@
e10da2
 static int openvzGetProcessInfo(unsigned long long *cpuTime, int vpsid);
e10da2
 static int openvzGetMaxVCPUs(virConnectPtr conn, const char *type);
e10da2
 static int openvzDomainGetMaxVcpus(virDomainPtr dom);
e10da2
-static int openvzDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus);
e10da2
 static int openvzDomainSetVcpusInternal(virDomainObjPtr vm,
e10da2
                                         unsigned int nvcpus);
e10da2
 static int openvzDomainSetMemoryInternal(virDomainObjPtr vm,
e10da2
@@ -1211,11 +1210,24 @@ static int openvzGetMaxVCPUs(virConnectPtr conn ATTRIBUTE_UNUSED,
e10da2
     return -1;
e10da2
 }
e10da2
e10da2
+static int
e10da2
+openvzDomainGetVcpusFlags(virDomainPtr dom ATTRIBUTE_UNUSED,
e10da2
+                          unsigned int flags)
e10da2
+{
e10da2
+    if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
e10da2
+        openvzError(VIR_ERR_INVALID_ARG, _("unsupported flags (0x%x)"), flags);
e10da2
+        return -1;
e10da2
+    }
e10da2
e10da2
-static int openvzDomainGetMaxVcpus(virDomainPtr dom ATTRIBUTE_UNUSED) {
e10da2
     return openvzGetMaxVCPUs(NULL, "openvz");
e10da2
 }
e10da2
e10da2
+static int openvzDomainGetMaxVcpus(virDomainPtr dom)
e10da2
+{
e10da2
+    return openvzDomainGetVcpusFlags(dom, (VIR_DOMAIN_VCPU_LIVE |
e10da2
+                                           VIR_DOMAIN_VCPU_MAXIMUM));
e10da2
+}
e10da2
+
e10da2
 static int openvzDomainSetVcpusInternal(virDomainObjPtr vm,
e10da2
                                         unsigned int nvcpus)
e10da2
 {
e10da2
@@ -1241,12 +1253,18 @@ static int openvzDomainSetVcpusInternal(virDomainObjPtr vm,
e10da2
     return 0;
e10da2
 }
e10da2
e10da2
-static int openvzDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus)
e10da2
+static int openvzDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
e10da2
+                                     unsigned int flags)
e10da2
 {
e10da2
     virDomainObjPtr         vm;
e10da2
     struct openvz_driver   *driver = dom->conn->privateData;
e10da2
     int                     ret = -1;
e10da2
e10da2
+    if (flags != VIR_DOMAIN_VCPU_LIVE) {
e10da2
+        openvzError(VIR_ERR_INVALID_ARG, _("unsupported flags (0x%x)"), flags);
e10da2
+        return -1;
e10da2
+    }
e10da2
+
e10da2
     openvzDriverLock(driver);
e10da2
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
e10da2
     openvzDriverUnlock(driver);
e10da2
@@ -1272,6 +1290,12 @@ cleanup:
e10da2
     return ret;
e10da2
 }
e10da2
e10da2
+static int
e10da2
+openvzDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus)
e10da2
+{
e10da2
+    return openvzDomainSetVcpusFlags(dom, nvcpus, VIR_DOMAIN_VCPU_LIVE);
e10da2
+}
e10da2
+
e10da2
 static virDrvOpenStatus openvzOpen(virConnectPtr conn,
e10da2
                                    virConnectAuthPtr auth ATTRIBUTE_UNUSED,
e10da2
                                    int flags ATTRIBUTE_UNUSED)
e10da2
@@ -1590,8 +1614,8 @@ static virDriver openvzDriver = {
e10da2
     NULL, /* domainRestore */
e10da2
     NULL, /* domainCoreDump */
e10da2
     openvzDomainSetVcpus, /* domainSetVcpus */
e10da2
-    NULL, /* domainSetVcpusFlags */
e10da2
-    NULL, /* domainGetVcpusFlags */
e10da2
+    openvzDomainSetVcpusFlags, /* domainSetVcpusFlags */
e10da2
+    openvzDomainGetVcpusFlags, /* domainGetVcpusFlags */
e10da2
     NULL, /* domainPinVcpu */
e10da2
     NULL, /* domainGetVcpus */
e10da2
     openvzDomainGetMaxVcpus, /* domainGetMaxVcpus */
e10da2
diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c
e10da2
index 6e0a5e9..e284ae0 100644
e10da2
--- a/src/phyp/phyp_driver.c
e10da2
+++ b/src/phyp/phyp_driver.c
e10da2
@@ -1497,15 +1497,27 @@ phypGetLparCPU(virConnectPtr conn, const char *managed_system, int lpar_id)
e10da2
 }
e10da2
e10da2
 static int
e10da2
-phypGetLparCPUMAX(virDomainPtr dom)
e10da2
+phypDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags)
e10da2
 {
e10da2
     phyp_driverPtr phyp_driver = dom->conn->privateData;
e10da2
     char *managed_system = phyp_driver->managed_system;
e10da2
e10da2
+    if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
e10da2
+        PHYP_ERROR(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"), flags);
e10da2
+        return -1;
e10da2
+    }
e10da2
+
e10da2
     return phypGetLparCPUGeneric(dom->conn, managed_system, dom->id, 1);
e10da2
 }
e10da2
e10da2
 static int
e10da2
+phypGetLparCPUMAX(virDomainPtr dom)
e10da2
+{
e10da2
+    return phypDomainGetVcpusFlags(dom, (VIR_DOMAIN_VCPU_LIVE |
e10da2
+                                         VIR_DOMAIN_VCPU_MAXIMUM));
e10da2
+}
e10da2
+
e10da2
+static int
e10da2
 phypGetRemoteSlot(virConnectPtr conn, const char *managed_system,
e10da2
                   const char *lpar_name)
e10da2
 {
e10da2
@@ -3831,7 +3843,8 @@ phypConnectGetCapabilities(virConnectPtr conn)
e10da2
 }
e10da2
e10da2
 static int
e10da2
-phypDomainSetCPU(virDomainPtr dom, unsigned int nvcpus)
e10da2
+phypDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
e10da2
+                        unsigned int flags)
e10da2
 {
e10da2
     ConnectionData *connection_data = dom->conn->networkPrivateData;
e10da2
     phyp_driverPtr phyp_driver = dom->conn->privateData;
e10da2
@@ -3846,6 +3859,11 @@ phypDomainSetCPU(virDomainPtr dom, unsigned int nvcpus)
e10da2
     unsigned int amount = 0;
e10da2
     virBuffer buf = VIR_BUFFER_INITIALIZER;
e10da2
e10da2
+    if (flags != VIR_DOMAIN_VCPU_LIVE) {
e10da2
+        PHYP_ERROR(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"), flags);
e10da2
+        return -1;
e10da2
+    }
e10da2
+
e10da2
     if ((ncpus = phypGetLparCPU(dom->conn, managed_system, dom->id)) == 0)
e10da2
         return 0;
e10da2
e10da2
@@ -3891,6 +3909,12 @@ phypDomainSetCPU(virDomainPtr dom, unsigned int nvcpus)
e10da2
e10da2
 }
e10da2
e10da2
+static int
e10da2
+phypDomainSetCPU(virDomainPtr dom, unsigned int nvcpus)
e10da2
+{
e10da2
+    return phypDomainSetVcpusFlags(dom, nvcpus, VIR_DOMAIN_VCPU_LIVE);
e10da2
+}
e10da2
+
e10da2
 static virDrvOpenStatus
e10da2
 phypVIOSDriverOpen(virConnectPtr conn,
e10da2
                    virConnectAuthPtr auth ATTRIBUTE_UNUSED,
e10da2
@@ -3941,8 +3965,8 @@ static virDriver phypDriver = {
e10da2
     NULL,                       /* domainRestore */
e10da2
     NULL,                       /* domainCoreDump */
e10da2
     phypDomainSetCPU,           /* domainSetVcpus */
e10da2
-    NULL,                       /* domainSetVcpusFlags */
e10da2
-    NULL,                       /* domainGetVcpusFlags */
e10da2
+    phypDomainSetVcpusFlags,    /* domainSetVcpusFlags */
e10da2
+    phypDomainGetVcpusFlags,    /* domainGetVcpusFlags */
e10da2
     NULL,                       /* domainPinVcpu */
e10da2
     NULL,                       /* domainGetVcpus */
e10da2
     phypGetLparCPUMAX,          /* domainGetMaxVcpus */
e10da2
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
e10da2
index 3d17e04..7a2ea8f 100644
e10da2
--- a/src/qemu/qemu_driver.c
e10da2
+++ b/src/qemu/qemu_driver.c
e10da2
@@ -5934,13 +5934,22 @@ unsupported:
e10da2
 }
e10da2
e10da2
e10da2
-static int qemudDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus) {
e10da2
+static int
e10da2
+qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
e10da2
+                         unsigned int flags)
e10da2
+{
e10da2
     struct qemud_driver *driver = dom->conn->privateData;
e10da2
     virDomainObjPtr vm;
e10da2
     const char * type;
e10da2
     int max;
e10da2
     int ret = -1;
e10da2
e10da2
+    if (flags != VIR_DOMAIN_VCPU_LIVE) {
e10da2
+        qemuReportError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
e10da2
+                        flags);
e10da2
+        return -1;
e10da2
+    }
e10da2
+
e10da2
     qemuDriverLock(driver);
e10da2
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
e10da2
     qemuDriverUnlock(driver);
e10da2
@@ -5994,6 +6003,12 @@ cleanup:
e10da2
     return ret;
e10da2
 }
e10da2
e10da2
+static int
e10da2
+qemudDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus)
e10da2
+{
e10da2
+    return qemudDomainSetVcpusFlags(dom, nvcpus, VIR_DOMAIN_VCPU_LIVE);
e10da2
+}
e10da2
+
e10da2
e10da2
 static int
e10da2
 qemudDomainPinVcpu(virDomainPtr dom,
e10da2
@@ -6150,12 +6165,20 @@ cleanup:
e10da2
 }
e10da2
e10da2
e10da2
-static int qemudDomainGetMaxVcpus(virDomainPtr dom) {
e10da2
+static int
e10da2
+qemudDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags)
e10da2
+{
e10da2
     struct qemud_driver *driver = dom->conn->privateData;
e10da2
     virDomainObjPtr vm;
e10da2
     const char *type;
e10da2
     int ret = -1;
e10da2
e10da2
+    if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
e10da2
+        qemuReportError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
e10da2
+                        flags);
e10da2
+        return -1;
e10da2
+    }
e10da2
+
e10da2
     qemuDriverLock(driver);
e10da2
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
e10da2
     qemuDriverUnlock(driver);
e10da2
@@ -6183,6 +6206,13 @@ cleanup:
e10da2
     return ret;
e10da2
 }
e10da2
e10da2
+static int
e10da2
+qemudDomainGetMaxVcpus(virDomainPtr dom)
e10da2
+{
e10da2
+    return qemudDomainGetVcpusFlags(dom, (VIR_DOMAIN_VCPU_LIVE |
e10da2
+                                          VIR_DOMAIN_VCPU_MAXIMUM));
e10da2
+}
e10da2
+
e10da2
 static int qemudDomainGetSecurityLabel(virDomainPtr dom, virSecurityLabelPtr seclabel)
e10da2
 {
e10da2
     struct qemud_driver *driver = (struct qemud_driver *)dom->conn->privateData;
e10da2
@@ -12938,8 +12968,8 @@ static virDriver qemuDriver = {
e10da2
     qemudDomainRestore, /* domainRestore */
e10da2
     qemudDomainCoreDump, /* domainCoreDump */
e10da2
     qemudDomainSetVcpus, /* domainSetVcpus */
e10da2
-    NULL, /* domainSetVcpusFlags */
e10da2
-    NULL, /* domainGetVcpusFlags */
e10da2
+    qemudDomainSetVcpusFlags, /* domainSetVcpusFlags */
e10da2
+    qemudDomainGetVcpusFlags, /* domainGetVcpusFlags */
e10da2
     qemudDomainPinVcpu, /* domainPinVcpu */
e10da2
     qemudDomainGetVcpus, /* domainGetVcpus */
e10da2
     qemudDomainGetMaxVcpus, /* domainGetMaxVcpus */
e10da2
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
e10da2
index 6a00558..b70c80d 100644
e10da2
--- a/src/test/test_driver.c
e10da2
+++ b/src/test/test_driver.c
e10da2
@@ -2029,17 +2029,37 @@ cleanup:
e10da2
     return ret;
e10da2
 }
e10da2
e10da2
-static int testDomainGetMaxVcpus(virDomainPtr domain)
e10da2
+static int
e10da2
+testDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags)
e10da2
 {
e10da2
+    if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
e10da2
+        testError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"), flags);
e10da2
+        return -1;
e10da2
+    }
e10da2
+
e10da2
     return testGetMaxVCPUs(domain->conn, "test");
e10da2
 }
e10da2
e10da2
-static int testSetVcpus(virDomainPtr domain,
e10da2
-                        unsigned int nrCpus) {
e10da2
+static int
e10da2
+testDomainGetMaxVcpus(virDomainPtr domain)
e10da2
+{
e10da2
+    return testDomainGetVcpusFlags(domain, (VIR_DOMAIN_VCPU_LIVE |
e10da2
+                                            VIR_DOMAIN_VCPU_MAXIMUM));
e10da2
+}
e10da2
+
e10da2
+static int
e10da2
+testDomainSetVcpusFlags(virDomainPtr domain, unsigned int nrCpus,
e10da2
+                        unsigned int flags)
e10da2
+{
e10da2
     testConnPtr privconn = domain->conn->privateData;
e10da2
     virDomainObjPtr privdom = NULL;
e10da2
     int ret = -1, maxvcpus;
e10da2
e10da2
+    if (flags != VIR_DOMAIN_VCPU_LIVE) {
e10da2
+        testError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"), flags);
e10da2
+        return -1;
e10da2
+    }
e10da2
+
e10da2
     /* Do this first before locking */
e10da2
     maxvcpus = testDomainGetMaxVcpus(domain);
e10da2
     if (maxvcpus < 0)
e10da2
@@ -2082,6 +2102,12 @@ cleanup:
e10da2
     return ret;
e10da2
 }
e10da2
e10da2
+static int
e10da2
+testSetVcpus(virDomainPtr domain, unsigned int nrCpus)
e10da2
+{
e10da2
+    return testDomainSetVcpusFlags(domain, nrCpus, VIR_DOMAIN_VCPU_LIVE);
e10da2
+}
e10da2
+
e10da2
 static int testDomainGetVcpus(virDomainPtr domain,
e10da2
                               virVcpuInfoPtr info,
e10da2
                               int maxinfo,
e10da2
@@ -5260,8 +5286,8 @@ static virDriver testDriver = {
e10da2
     testDomainRestore, /* domainRestore */
e10da2
     testDomainCoreDump, /* domainCoreDump */
e10da2
     testSetVcpus, /* domainSetVcpus */
e10da2
-    NULL, /* domainSetVcpusFlags */
e10da2
-    NULL, /* domainGetVcpusFlags */
e10da2
+    testDomainSetVcpusFlags, /* domainSetVcpusFlags */
e10da2
+    testDomainGetVcpusFlags, /* domainGetVcpusFlags */
e10da2
     testDomainPinVcpu, /* domainPinVcpu */
e10da2
     testDomainGetVcpus, /* domainGetVcpus */
e10da2
     testDomainGetMaxVcpus, /* domainGetMaxVcpus */
e10da2
diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
e10da2
index cb9193a..0cbe8b3 100644
e10da2
--- a/src/vbox/vbox_tmpl.c
e10da2
+++ b/src/vbox/vbox_tmpl.c
e10da2
@@ -1839,13 +1839,21 @@ cleanup:
e10da2
     return ret;
e10da2
 }
e10da2
e10da2
-static int vboxDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus) {
e10da2
+static int
e10da2
+vboxDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
e10da2
+                        unsigned int flags)
e10da2
+{
e10da2
     VBOX_OBJECT_CHECK(dom->conn, int, -1);
e10da2
     IMachine *machine    = NULL;
e10da2
     vboxIID  *iid        = NULL;
e10da2
     PRUint32  CPUCount   = nvcpus;
e10da2
     nsresult rc;
e10da2
e10da2
+    if (flags != VIR_DOMAIN_VCPU_LIVE) {
e10da2
+        vboxError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"), flags);
e10da2
+        return -1;
e10da2
+    }
e10da2
+
e10da2
 #if VBOX_API_VERSION == 2002
e10da2
     if (VIR_ALLOC(iid) < 0) {
e10da2
         virReportOOMError();
e10da2
@@ -1887,11 +1895,24 @@ cleanup:
e10da2
     return ret;
e10da2
 }
e10da2
e10da2
-static int vboxDomainGetMaxVcpus(virDomainPtr dom) {
e10da2
+static int
e10da2
+vboxDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus)
e10da2
+{
e10da2
+    return vboxDomainSetVcpusFlags(dom, nvcpus, VIR_DOMAIN_VCPU_LIVE);
e10da2
+}
e10da2
+
e10da2
+static int
e10da2
+vboxDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags)
e10da2
+{
e10da2
     VBOX_OBJECT_CHECK(dom->conn, int, -1);
e10da2
     ISystemProperties *systemProperties = NULL;
e10da2
     PRUint32 maxCPUCount = 0;
e10da2
e10da2
+    if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
e10da2
+        vboxError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"), flags);
e10da2
+        return -1;
e10da2
+    }
e10da2
+
e10da2
     /* Currently every domain supports the same number of max cpus
e10da2
      * as that supported by vbox and thus take it directly from
e10da2
      * the systemproperties.
e10da2
@@ -1909,6 +1930,13 @@ static int vboxDomainGetMaxVcpus(virDomainPtr dom) {
e10da2
     return ret;
e10da2
 }
e10da2
e10da2
+static int
e10da2
+vboxDomainGetMaxVcpus(virDomainPtr dom)
e10da2
+{
e10da2
+    return vboxDomainGetVcpusFlags(dom, (VIR_DOMAIN_VCPU_LIVE |
e10da2
+                                         VIR_DOMAIN_VCPU_MAXIMUM));
e10da2
+}
e10da2
+
e10da2
 static char *vboxDomainDumpXML(virDomainPtr dom, int flags) {
e10da2
     VBOX_OBJECT_CHECK(dom->conn, char *, NULL);
e10da2
     virDomainDefPtr def  = NULL;
e10da2
@@ -8267,8 +8295,8 @@ virDriver NAME(Driver) = {
e10da2
     NULL, /* domainRestore */
e10da2
     NULL, /* domainCoreDump */
e10da2
     vboxDomainSetVcpus, /* domainSetVcpus */
e10da2
-    NULL, /* domainSetVcpusFlags */
e10da2
-    NULL, /* domainGetVcpusFlags */
e10da2
+    vboxDomainSetVcpusFlags, /* domainSetVcpusFlags */
e10da2
+    vboxDomainGetVcpusFlags, /* domainGetVcpusFlags */
e10da2
     NULL, /* domainPinVcpu */
e10da2
     NULL, /* domainGetVcpus */
e10da2
     vboxDomainGetMaxVcpus, /* domainGetMaxVcpus */
e10da2
diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
e10da2
index 7d67ced..d6c9c57 100644
e10da2
--- a/src/xen/xen_driver.c
e10da2
+++ b/src/xen/xen_driver.c
e10da2
@@ -1069,11 +1069,18 @@ xenUnifiedDomainCoreDump (virDomainPtr dom, const char *to, int flags)
e10da2
 }
e10da2
e10da2
 static int
e10da2
-xenUnifiedDomainSetVcpus (virDomainPtr dom, unsigned int nvcpus)
e10da2
+xenUnifiedDomainSetVcpusFlags (virDomainPtr dom, unsigned int nvcpus,
e10da2
+                               unsigned int flags)
e10da2
 {
e10da2
     GET_PRIVATE(dom->conn);
e10da2
     int i;
e10da2
e10da2
+    if (flags != VIR_DOMAIN_VCPU_LIVE) {
e10da2
+        xenUnifiedError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
e10da2
+                        flags);
e10da2
+        return -1;
e10da2
+    }
e10da2
+
e10da2
     /* Try non-hypervisor methods first, then hypervisor direct method
e10da2
      * as a last resort.
e10da2
      */
e10da2
@@ -1093,6 +1100,12 @@ xenUnifiedDomainSetVcpus (virDomainPtr dom, unsigned int nvcpus)
e10da2
 }
e10da2
e10da2
 static int
e10da2
+xenUnifiedDomainSetVcpus (virDomainPtr dom, unsigned int nvcpus)
e10da2
+{
e10da2
+    return xenUnifiedDomainSetVcpusFlags(dom, nvcpus, VIR_DOMAIN_VCPU_LIVE);
e10da2
+}
e10da2
+
e10da2
+static int
e10da2
 xenUnifiedDomainPinVcpu (virDomainPtr dom, unsigned int vcpu,
e10da2
                          unsigned char *cpumap, int maplen)
e10da2
 {
e10da2
@@ -1126,11 +1139,17 @@ xenUnifiedDomainGetVcpus (virDomainPtr dom,
e10da2
 }
e10da2
e10da2
 static int
e10da2
-xenUnifiedDomainGetMaxVcpus (virDomainPtr dom)
e10da2
+xenUnifiedDomainGetVcpusFlags (virDomainPtr dom, unsigned int flags)
e10da2
 {
e10da2
     GET_PRIVATE(dom->conn);
e10da2
     int i, ret;
e10da2
e10da2
+    if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
e10da2
+        xenUnifiedError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
e10da2
+                        flags);
e10da2
+        return -1;
e10da2
+    }
e10da2
+
e10da2
     for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
e10da2
         if (priv->opened[i] && drivers[i]->domainGetMaxVcpus) {
e10da2
             ret = drivers[i]->domainGetMaxVcpus (dom);
e10da2
@@ -1140,6 +1159,13 @@ xenUnifiedDomainGetMaxVcpus (virDomainPtr dom)
e10da2
     return -1;
e10da2
 }
e10da2
e10da2
+static int
e10da2
+xenUnifiedDomainGetMaxVcpus (virDomainPtr dom)
e10da2
+{
e10da2
+    return xenUnifiedDomainGetVcpusFlags(dom, (VIR_DOMAIN_VCPU_LIVE |
e10da2
+                                               VIR_DOMAIN_VCPU_MAXIMUM));
e10da2
+}
e10da2
+
e10da2
 static char *
e10da2
 xenUnifiedDomainDumpXML (virDomainPtr dom, int flags)
e10da2
 {
e10da2
@@ -1951,8 +1977,8 @@ static virDriver xenUnifiedDriver = {
e10da2
     xenUnifiedDomainRestore, /* domainRestore */
e10da2
     xenUnifiedDomainCoreDump, /* domainCoreDump */
e10da2
     xenUnifiedDomainSetVcpus, /* domainSetVcpus */
e10da2
-    NULL, /* domainSetVcpusFlags */
e10da2
-    NULL, /* domainGetVcpusFlags */
e10da2
+    xenUnifiedDomainSetVcpusFlags, /* domainSetVcpusFlags */
e10da2
+    xenUnifiedDomainGetVcpusFlags, /* domainGetVcpusFlags */
e10da2
     xenUnifiedDomainPinVcpu, /* domainPinVcpu */
e10da2
     xenUnifiedDomainGetVcpus, /* domainGetVcpus */
e10da2
     xenUnifiedDomainGetMaxVcpus, /* domainGetMaxVcpus */
e10da2
diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c
e10da2
index 753169c..7d4ab8d 100644
e10da2
--- a/src/xenapi/xenapi_driver.c
e10da2
+++ b/src/xenapi/xenapi_driver.c
e10da2
@@ -40,6 +40,11 @@
e10da2
 #include "xenapi_driver_private.h"
e10da2
 #include "xenapi_utils.h"
e10da2
e10da2
+#define VIR_FROM_THIS VIR_FROM_XENAPI
e10da2
+
e10da2
+#define xenapiError(code, ...)                                    \
e10da2
+        virReportErrorHelper(NULL, VIR_FROM_THIS, code, __FILE__, \
e10da2
+                             __FUNCTION__, __LINE__, __VA_ARGS__)
e10da2
e10da2
 /*
e10da2
  * getCapsObject
e10da2
@@ -987,19 +992,26 @@ xenapiDomainGetInfo (virDomainPtr dom, virDomainInfoPtr info)
e10da2
e10da2
e10da2
 /*
e10da2
- * xenapiDomainSetVcpus
e10da2
+ * xenapiDomainSetVcpusFlags
e10da2
  *
e10da2
  * Sets the VCPUs on the domain
e10da2
  * Return 0 on success or -1 in case of error
e10da2
  */
e10da2
 static int
e10da2
-xenapiDomainSetVcpus (virDomainPtr dom, unsigned int nvcpus)
e10da2
+xenapiDomainSetVcpusFlags (virDomainPtr dom, unsigned int nvcpus,
e10da2
+                           unsigned int flags)
e10da2
 {
e10da2
-
e10da2
     /* vm.set_vcpus_max */
e10da2
     xen_vm vm;
e10da2
     xen_vm_set *vms;
e10da2
     xen_session *session = ((struct _xenapiPrivate *)(dom->conn->privateData))->session;
e10da2
+
e10da2
+    if (flags != VIR_DOMAIN_VCPU_LIVE) {
e10da2
+        xenapiError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
e10da2
+                    flags);
e10da2
+        return -1;
e10da2
+    }
e10da2
+
e10da2
     if (xen_vm_get_by_name_label(session, &vms, dom->name) && vms->size > 0) {
e10da2
         if (vms->size != 1) {
e10da2
             xenapiSessionErrorHandler(dom->conn, VIR_ERR_INTERNAL_ERROR,
e10da2
@@ -1019,6 +1031,18 @@ xenapiDomainSetVcpus (virDomainPtr dom, unsigned int nvcpus)
e10da2
 }
e10da2
e10da2
 /*
e10da2
+ * xenapiDomainSetVcpus
e10da2
+ *
e10da2
+ * Sets the VCPUs on the domain
e10da2
+ * Return 0 on success or -1 in case of error
e10da2
+ */
e10da2
+static int
e10da2
+xenapiDomainSetVcpus (virDomainPtr dom, unsigned int nvcpus)
e10da2
+{
e10da2
+    return xenapiDomainSetVcpusFlags(dom, nvcpus, VIR_DOMAIN_VCPU_LIVE);
e10da2
+}
e10da2
+
e10da2
+/*
e10da2
  * xenapiDomainPinVcpu
e10da2
  *
e10da2
  * Dynamically change the real CPUs which can be allocated to a virtual CPU
e10da2
@@ -1140,19 +1164,26 @@ xenapiDomainGetVcpus (virDomainPtr dom,
e10da2
 }
e10da2
e10da2
 /*
e10da2
- * xenapiDomainGetMaxVcpus
e10da2
+ * xenapiDomainGetVcpusFlags
e10da2
  *
e10da2
  *
e10da2
- * Returns maximum number of Vcpus on success or -1 in case of error
e10da2
+ * Returns Vcpus count on success or -1 in case of error
e10da2
  */
e10da2
 static int
e10da2
-xenapiDomainGetMaxVcpus (virDomainPtr dom)
e10da2
+xenapiDomainGetVcpusFlags (virDomainPtr dom, unsigned int flags)
e10da2
 {
e10da2
     xen_vm vm;
e10da2
     xen_vm_set *vms;
e10da2
     int64_t maxvcpu = 0;
e10da2
     enum xen_vm_power_state state;
e10da2
     xen_session *session = ((struct _xenapiPrivate *)(dom->conn->privateData))->session;
e10da2
+
e10da2
+    if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
e10da2
+        xenapiError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
e10da2
+                    flags);
e10da2
+        return -1;
e10da2
+    }
e10da2
+
e10da2
     if (xen_vm_get_by_name_label(session, &vms, dom->name) && vms->size > 0) {
e10da2
         if (vms->size != 1) {
e10da2
             xenapiSessionErrorHandler(dom->conn, VIR_ERR_INTERNAL_ERROR,
e10da2
@@ -1176,6 +1207,19 @@ xenapiDomainGetMaxVcpus (virDomainPtr dom)
e10da2
 }
e10da2
e10da2
 /*
e10da2
+ * xenapiDomainGetMaxVcpus
e10da2
+ *
e10da2
+ *
e10da2
+ * Returns maximum number of Vcpus on success or -1 in case of error
e10da2
+ */
e10da2
+static int
e10da2
+xenapiDomainGetMaxVcpus (virDomainPtr dom)
e10da2
+{
e10da2
+    return xenapiDomainGetVcpusFlags(dom, (VIR_DOMAIN_VCPU_LIVE |
e10da2
+                                           VIR_DOMAIN_VCPU_MAXIMUM));
e10da2
+}
e10da2
+
e10da2
+/*
e10da2
  * xenapiDomainDumpXML
e10da2
  *
e10da2
  *
e10da2
@@ -1754,8 +1798,8 @@ static virDriver xenapiDriver = {
e10da2
     NULL, /* domainRestore */
e10da2
     NULL, /* domainCoreDump */
e10da2
     xenapiDomainSetVcpus, /* domainSetVcpus */
e10da2
-    NULL, /* domainSetVcpusFlags */
e10da2
-    NULL, /* domainGetVcpusFlags */
e10da2
+    xenapiDomainSetVcpusFlags, /* domainSetVcpusFlags */
e10da2
+    xenapiDomainGetVcpusFlags, /* domainGetVcpusFlags */
e10da2
     xenapiDomainPinVcpu, /* domainPinVcpu */
e10da2
     xenapiDomainGetVcpus, /* domainGetVcpus */
e10da2
     xenapiDomainGetMaxVcpus, /* domainGetMaxVcpus */
e10da2
-- 
e10da2
1.7.2.3
e10da2