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@xxxxxxxxxxxx | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list