[libvirt] [PATCH 7/7] qemu: Allow making vcpus hotpluggable with virDomainSetVcpusFlags

Shivaprasad G Bhat sbhat at linux.vnet.ibm.com
Thu Sep 29 10:59:13 UTC 2016


On 09/21/2016 05:19 PM, Peter Krempa wrote:
> Implement support for VIR_DOMAIN_VCPU_HOTPLUGGABLE so that users can
> choose to make vcpus added by the API removable.
> ---
>   src/qemu/qemu_driver.c | 22 ++++++++++++++++------
>   1 file changed, 16 insertions(+), 6 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 357be4e..8453628 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -4912,7 +4912,8 @@ qemuDomainSetVcpusLive(virQEMUDriverPtr driver,
>    */
>   static void
>   qemuDomainSetVcpusConfig(virDomainDefPtr def,
> -                         unsigned int nvcpus)
> +                         unsigned int nvcpus,
> +                         bool hotpluggable)
>   {
>       virDomainVcpuDefPtr vcpu;
Here  if (curvcpus == nvcpus)

                     return
    we still need to allow if someone wants to switch from hotpluggable 
= yes to no/ vice versa.


>       size_t curvcpus = virDomainDefGetVcpus(def);
> @@ -4933,7 +4934,12 @@ qemuDomainSetVcpusConfig(virDomainDefPtr def,
>                   continue;
>
>               vcpu->online = true;
> -            vcpu->hotpluggable = VIR_TRISTATE_BOOL_NO;
> +            if (hotpluggable) {
> +                vcpu->hotpluggable = VIR_TRISTATE_BOOL_YES;
> +                def->individualvcpus = true;
> +            } else {
> +                vcpu->hotpluggable = VIR_TRISTATE_BOOL_NO;
> +            }
>
>               if (++curvcpus == nvcpus)
>                   break;

Can we add checks here to see on PPC, the config is valid with a check 
when topology is given in xml to see (curvcpus%threads_per_core == 0)

Otherwise with virsh setvcpus rhel71 13 --config --hotpluggable
for a guest with topology     <topology sockets='8' cores='2' threads='4'/>
we would see,
2016-09-29 10:12:05.929+0000: 1137: error : 
qemuProcessValidateHotpluggableVcpus:4829 : unsupported configuration: 
vcpus '12' and '13' are in the same hotplug group but differ in 
configuration

OR

Even when setvcpus live to a number not leading to a complete core, we 
have checks leading to sensible error (error: unsupported configuration: 
target vm vcpu granularity does not allow the desired vcpu count ) . So, 
in case of --config also may be we can add the check to bring the 
consistency.

Otherwise the series looks good with the above two cases addressed . ACK

Thanks,
Shivaprasad


> @@ -4960,7 +4966,8 @@ qemuDomainSetVcpusInternal(virQEMUDriverPtr driver,
>                              virDomainObjPtr vm,
>                              virDomainDefPtr def,
>                              virDomainDefPtr persistentDef,
> -                           unsigned int nvcpus)
> +                           unsigned int nvcpus,
> +                           bool hotpluggable)
>   {
>       virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
>       int ret = -1;
> @@ -4985,7 +4992,7 @@ qemuDomainSetVcpusInternal(virQEMUDriverPtr driver,
>           goto cleanup;
>
>       if (persistentDef) {
> -        qemuDomainSetVcpusConfig(persistentDef, nvcpus);
> +        qemuDomainSetVcpusConfig(persistentDef, nvcpus, hotpluggable);
>
>           if (virDomainSaveConfig(cfg->configDir, driver->caps, persistentDef) < 0)
>               goto cleanup;
> @@ -5008,12 +5015,14 @@ qemuDomainSetVcpusFlags(virDomainPtr dom,
>       virDomainObjPtr vm = NULL;
>       virDomainDefPtr def;
>       virDomainDefPtr persistentDef;
> +    bool hotpluggable = !!(flags & VIR_DOMAIN_VCPU_HOTPLUGGABLE);
>       int ret = -1;
>
>       virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
>                     VIR_DOMAIN_AFFECT_CONFIG |
>                     VIR_DOMAIN_VCPU_MAXIMUM |
> -                  VIR_DOMAIN_VCPU_GUEST, -1);
> +                  VIR_DOMAIN_VCPU_GUEST |
> +                  VIR_DOMAIN_VCPU_HOTPLUGGABLE, -1);
>
>       if (!(vm = qemuDomObjFromDomain(dom)))
>           goto cleanup;
> @@ -5032,7 +5041,8 @@ qemuDomainSetVcpusFlags(virDomainPtr dom,
>       else if (flags & VIR_DOMAIN_VCPU_MAXIMUM)
>           ret = qemuDomainSetVcpusMax(driver, def, persistentDef, nvcpus);
>       else
> -        ret = qemuDomainSetVcpusInternal(driver, vm, def, persistentDef, nvcpus);
> +        ret = qemuDomainSetVcpusInternal(driver, vm, def, persistentDef,
> +                                         nvcpus, hotpluggable);
>
>    endjob:
>       qemuDomainObjEndJob(driver, vm);




More information about the libvir-list mailing list