
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);