
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