
On Tue, Feb 16, 2010 at 12:12:31PM +0000, 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
+static int qemudDomainHotplugVcpus(virDomainObjPtr vm, unsigned int nvcpus) +{ + qemuDomainObjPrivatePtr priv = vm->privateData; + int i, rc; + int ret = -1; + + /* We need different branches here, because we want to offline + * in reverse order to onlining, so any partial fail leaves us in a + * reasonably sensible state */ + if (nvcpus > vm->def->vcpus) { + for (i = vm->def->vcpus ; i < nvcpus ; i++) { + /* Online new CPU */ + rc = qemuMonitorSetCPU(priv->mon, i, 1); + if (rc == 0) + goto unsupported; + if (rc < 0) + goto cleanup; + + vm->def->vcpus++; + } + } else { + for (i = vm->def->vcpus - 1 ; i >= nvcpus ; i--) { + /* Offline old CPU */ + rc = qemuMonitorSetCPU(priv->mon, i, 0); + if (rc == 0) + goto unsupported; + if (rc < 0) + goto cleanup; + + vm->def->vcpus--; + } + } + + ret = 0; + +cleanup: + return ret; + +unsupported: + qemudReportError(NULL, NULL, NULL, VIR_ERR_OPERATION_INVALID, "%s", + _("cannot change vcpu count of an active domain")); + goto cleanup; +}
Hum, seems QEMu would allow CPU 0 and 2 to be online and CPU 1 to be offline for example but our code really assumes all CPUs from 0 to vm->def->vcpus are always online (and other offline). I hope this restriction we impose won't be a problem later. [...]
+int qemuMonitorJSONSetCPU(qemuMonitorPtr mon, + int cpu, int online) +{ + int ret; + virJSONValuePtr cmd = qemuMonitorJSONMakeCommand("balloon", + "U:cpu", (unsigned long long)cpu, + "s:state", online ? "online" : "offline", + NULL); + virJSONValuePtr reply = NULL; + if (!cmd) + return -1; + + ret = qemuMonitorJSONCommand(mon, cmd, &reply); + + if (ret == 0) { + /* XXX See if CPU soft-failed due to lack of ACPI */ +#if 0 + if (qemuMonitorJSONHasError(reply, "DeviceNotActive") || + qemuMonitorJSONHasError(reply, "KVMMissingCap")) + goto cleanup; +#endif
Hum ... why can't we activate this now ? Just wondering about those 2 small issues, ACK, Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/