[libvirt] [PATCH 2/3] setvcpus: extend qemuDomainSetVcpusFlags() to support current flag

Eric Blake eblake at redhat.com
Fri Jul 15 14:31:23 UTC 2011


On 07/15/2011 01:01 AM, Taku Izumi wrote:
> 
> This patch extends qemudDomainSetVcpusFlags() function to support
> VIR_DOMAIN_AFFECT_CURRENT flag.

We've been renaming qemudDomain to qemuDomain lately, so now is as good
a time to make the change for this function as any.  Especially since
you used that shorter name in your subject line :)

> Signed-off-by: Taku Izumi <izumi.taku at jp.fujitsu.com>
> ---
>  src/qemu/qemu_driver.c |   37 +++++++++++++++++++++++++++----------
>  1 file changed, 27 insertions(+), 10 deletions(-)
> 
> @@ -2950,7 +2942,32 @@ qemudDomainSetVcpusFlags(virDomainPtr do
>      if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0)
>          goto cleanup;
>  
> -    if (!virDomainObjIsActive(vm) && (flags & VIR_DOMAIN_AFFECT_LIVE)) {
> +    isActive = virDomainObjIsActive(vm);
> +
> +    if (flags == VIR_DOMAIN_AFFECT_CURRENT) {
> +        if (isActive)
> +            flags = VIR_DOMAIN_AFFECT_LIVE;
> +        else
> +            flags = VIR_DOMAIN_AFFECT_CONFIG;
> +    }
> +    if (flags == VIR_DOMAIN_VCPU_MAXIMUM) {
> +        if (isActive)
> +            flags |= VIR_DOMAIN_AFFECT_LIVE;
> +        else
> +            flags |= VIR_DOMAIN_AFFECT_CONFIG;
> +    }

That's a bit redundant.  How about:

if ((flags & (VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG)) == 0)

and a single set of flags |=.

Or even better, peel off VIR_DOMAIN_VCPU_MAXIMUM into a helper bool
before doing anything else.

> +
> +    /* At least one of LIVE or CONFIG must be set.  MAXIMUM cannot be
> +     * mixed with LIVE.  */
> +    if ((flags & (VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG)) == 0 ||

This condition is now guaranteed to be false, given the earlier
manipulations.

> +        (flags & (VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_AFFECT_LIVE)) ==
> +         (VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_AFFECT_LIVE)) {
> +        qemuReportError(VIR_ERR_INVALID_ARG,
> +                        _("invalid flag combination: (0x%x)"), flags);

This error message is inaccurate - we've possibly modified flags, so it
might not match what the user passed in.  Rather, we should just state
the restriction.

> +        goto endjob;
> +    }
> +
> +    if (!isActive && (flags & VIR_DOMAIN_AFFECT_LIVE)) {

ACK with nits fixed, so I'm squashing this in before pushing:

diff --git i/src/qemu/qemu_driver.c w/src/qemu/qemu_driver.c
index 0b1d5ec..f3a495f 100644
--- i/src/qemu/qemu_driver.c
+++ w/src/qemu/qemu_driver.c
@@ -2906,8 +2906,8 @@ unsupported:


 static int
-qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
-                         unsigned int flags)
+qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
+                        unsigned int flags)
 {
     struct qemud_driver *driver = dom->conn->privateData;
     virDomainObjPtr vm;
@@ -2916,6 +2916,7 @@ qemudDomainSetVcpusFlags(virDomainPtr dom,
unsigned int nvcpus,
     int max;
     int ret = -1;
     bool isActive;
+    bool maximum;

     virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
                   VIR_DOMAIN_AFFECT_CONFIG |
@@ -2943,27 +2944,20 @@ qemudDomainSetVcpusFlags(virDomainPtr dom,
unsigned int nvcpus,
         goto cleanup;

     isActive = virDomainObjIsActive(vm);
+    maximum = (flags & VIR_DOMAIN_VCPU_MAXIMUM) != 0;
+    flags &= ~VIR_DOMAIN_VCPU_MAXIMUM;

     if (flags == VIR_DOMAIN_AFFECT_CURRENT) {
         if (isActive)
-            flags = VIR_DOMAIN_AFFECT_LIVE;
-        else
-            flags = VIR_DOMAIN_AFFECT_CONFIG;
-    }
-    if (flags == VIR_DOMAIN_VCPU_MAXIMUM) {
-        if (isActive)
             flags |= VIR_DOMAIN_AFFECT_LIVE;
         else
             flags |= VIR_DOMAIN_AFFECT_CONFIG;
     }

-    /* At least one of LIVE or CONFIG must be set.  MAXIMUM cannot be
-     * mixed with LIVE.  */
-    if ((flags & (VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG))
== 0 ||
-        (flags & (VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_AFFECT_LIVE)) ==
-         (VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_AFFECT_LIVE)) {
-        qemuReportError(VIR_ERR_INVALID_ARG,
-                        _("invalid flag combination: (0x%x)"), flags);
+    /* MAXIMUM cannot be mixed with LIVE.  */
+    if (maximum && (flags & VIR_DOMAIN_AFFECT_LIVE)) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("cannot adjust maximum on running domain"));
         goto endjob;
     }

@@ -2992,7 +2986,7 @@ qemudDomainSetVcpusFlags(virDomainPtr dom,
unsigned int nvcpus,
         goto endjob;
     }

-    if (!(flags & VIR_DOMAIN_VCPU_MAXIMUM) && vm->def->maxvcpus < max) {
+    if (!maximum && vm->def->maxvcpus < max) {
         max = vm->def->maxvcpus;
     }

@@ -3007,15 +3001,14 @@ qemudDomainSetVcpusFlags(virDomainPtr dom,
unsigned int nvcpus,
         goto endjob;

     switch (flags) {
-    case VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_AFFECT_CONFIG:
-        persistentDef->maxvcpus = nvcpus;
-        if (nvcpus < persistentDef->vcpus)
-            persistentDef->vcpus = nvcpus;
-        ret = 0;
-        break;
-
     case VIR_DOMAIN_AFFECT_CONFIG:
-        persistentDef->vcpus = nvcpus;
+        if (maximum) {
+            persistentDef->maxvcpus = nvcpus;
+            if (nvcpus < persistentDef->vcpus)
+                persistentDef->vcpus = nvcpus;
+        } else {
+            persistentDef->vcpus = nvcpus;
+        }
         ret = 0;
         break;

@@ -3046,9 +3039,9 @@ cleanup:
 }

 static int
-qemudDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus)
+qemuDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus)
 {
-    return qemudDomainSetVcpusFlags(dom, nvcpus, VIR_DOMAIN_AFFECT_LIVE);
+    return qemuDomainSetVcpusFlags(dom, nvcpus, VIR_DOMAIN_AFFECT_LIVE);
 }


@@ -8597,8 +8590,8 @@ static virDriver qemuDriver = {
     .domainRestore = qemuDomainRestore, /* 0.2.0 */
     .domainCoreDump = qemudDomainCoreDump, /* 0.7.0 */
     .domainScreenshot = qemuDomainScreenshot, /* 0.9.2 */
-    .domainSetVcpus = qemudDomainSetVcpus, /* 0.4.4 */
-    .domainSetVcpusFlags = qemudDomainSetVcpusFlags, /* 0.8.5 */
+    .domainSetVcpus = qemuDomainSetVcpus, /* 0.4.4 */
+    .domainSetVcpusFlags = qemuDomainSetVcpusFlags, /* 0.8.5 */
     .domainGetVcpusFlags = qemudDomainGetVcpusFlags, /* 0.8.5 */
     .domainPinVcpu = qemudDomainPinVcpu, /* 0.4.4 */
     .domainPinVcpuFlags = qemudDomainPinVcpuFlags, /* 0.9.3 */


-- 
Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 619 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20110715/ee96cf12/attachment-0001.sig>


More information about the libvir-list mailing list