[libvirt] [PATCH] Support VCPU hotplug in QEMU guests
Daniel Veillard
veillard at redhat.com
Tue Feb 16 14:55:26 UTC 2010
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 at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list