On 02/16/2010 07:12 AM, Daniel P. Berrange wrote:
QEMU has a monitor command 'set_cpu' which allows a specific
CPU to be toggled between online& offline state. libvirt CPU
hotplug does not work in terms of individual indexes CPUs.
Thus to support this, we iteratively toggle the online state
when the total number of vCPUs is adjusted via libvirt
NB, currently untested since QEMU segvs when running this!
* src/qemu/qemu_driver.c: Toggle online state for CPUs when
doing hotplug
* src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h,
src/qemu/qemu_monitor_json.c, src/qemu/qemu_monitor_json.h,
src/qemu/qemu_monitor_text.c, src/qemu/qemu_monitor_text.h: Add
monitor API for toggling a CPU's online status via 'set_cpu
---
src/qemu/qemu_driver.c | 59 ++++++++++++++++++++++++++++++++++++-----
src/qemu/qemu_monitor.c | 14 ++++++++++
src/qemu/qemu_monitor.h | 2 +
src/qemu/qemu_monitor_json.c | 44 +++++++++++++++++++++++++++++++
src/qemu/qemu_monitor_json.h | 1 +
src/qemu/qemu_monitor_text.c | 38 +++++++++++++++++++++++++++
src/qemu/qemu_monitor_text.h | 1 +
7 files changed, 151 insertions(+), 8 deletions(-)
Whoops, this made me realize I didn't actually push my changes to
SetVcpus in the qemu driver. I've just done so.
...
static int qemudDomainSetVcpus(virDomainPtr dom, unsigned int
nvcpus) {
struct qemud_driver *driver = dom->conn->privateData;
virDomainObjPtr vm;
@@ -4228,12 +4273,6 @@ static int qemudDomainSetVcpus(virDomainPtr dom, unsigned int
nvcpus) {
if (qemuDomainObjBeginJob(vm) < 0)
goto cleanup;
- if (virDomainObjIsActive(vm)) {
- qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
- _("cannot change vcpu count of an active domain"));
- goto endjob;
- }
-
if (!(type = virDomainVirtTypeToString(vm->def->virtType))) {
qemuReportError(VIR_ERR_INTERNAL_ERROR,
_("unknown virt type in domain definition
'%d'"),
@@ -4254,8 +4293,12 @@ static int qemudDomainSetVcpus(virDomainPtr dom, unsigned int
nvcpus) {
goto endjob;
}
- vm->def->vcpus = nvcpus;
- ret = 0;
+ if (virDomainObjIsActive(vm)) {
+ ret = qemudDomainHotplugVcpus(vm, nvcpus);
+ } else {
+ vm->def->vcpus = nvcpus;
+ ret = 0;
+ }
This portion will need to be rebased. Most important is to drop the
inactive fallback above.
Thanks,
Cole