
On Fri, Sep 30, 2016 at 09:52:08 +0200, Pavel Hrdina wrote:
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