[libvirt] [PATCH 4/7] qemu: Fix coldplug of vcpus

Pavel Hrdina phrdina at redhat.com
Fri Sep 30 07:52:08 UTC 2016


On Wed, Sep 21, 2016 at 01:49:56PM +0200, Peter Krempa wrote:
> virDomainDefSetVcpus was not designed to handle coldplug of vcpus now
> that we can set state of vcpus individually.
> 
> Introduce qemuDomainSetVcpusConfig that properly handles state changes
> of vcpus when coldplugging so that invalid configurations are not
> created.
> 
> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1375939
> ---
>  src/qemu/qemu_driver.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 53 insertions(+), 2 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index e29180d..336673d 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -4898,6 +4898,58 @@ qemuDomainSetVcpusLive(virQEMUDriverPtr driver,
>  }
> 
> 
> +/**
> + * qemuDomainSetVcpusConfig:
> + * @def: config/offline definition of a domain
> + * @nvcpus: target vcpu count
> + *
> + * Properly handle cold(un)plug of vcpus:
> + * - plug in inactive vcpus/uplug active rather than rewriting state
> + * - fix hotpluggable state
> + */
> +static void
> +qemuDomainSetVcpusConfig(virDomainDefPtr def,
> +                         unsigned int nvcpus)
> +{
> +    virDomainVcpuDefPtr vcpu;
> +    size_t curvcpus = virDomainDefGetVcpus(def);
> +    size_t maxvcpus = virDomainDefGetVcpusMax(def);
> +    size_t i;
> +
> +
> +    if (curvcpus == nvcpus)
> +        return;
> +
> +    if (curvcpus < nvcpus) {
> +        for (i = 0; i < maxvcpus; i++) {
> +            vcpu = virDomainDefGetVcpu(def, i);
> +
> +            if (!vcpu || vcpu->online)
> +                continue;

vcpu == NULL should not happen because virDomainDefGetVcpu() checks
if (i >= maxvcpus)

> +
> +            vcpu->online = true;
> +            vcpu->hotpluggable = VIR_TRISTATE_BOOL_NO;
> +
> +            if (++curvcpus == nvcpus)
> +                break;
> +        }
> +    } else {
> +        for (i = maxvcpus; i != 0; i--) {
> +            vcpu = virDomainDefGetVcpu(def, i - 1);
> +
> +            if (!vcpu || !vcpu->online)
> +                continue;
> +
> +            vcpu->online = false;
> +            vcpu->hotpluggable = VIR_TRISTATE_BOOL_YES;
> +
> +            if (--curvcpus == nvcpus)
> +                break;
> +        }
> +    }
> +}

ACK and safe for freeze.

Pavel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20160930/81392591/attachment-0001.sig>


More information about the libvir-list mailing list