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)
Coverity and a few versions of GCC are grumpy about that though since
their static analysis sucks. See:
05f89657eed52550050f9308bb7cb8d56dde9cd0
a6ab72a9c3ad475a544ffd53a782e46a02437006