On Tue, Feb 16, 2010 at 04:23:25PM +0000, Daniel P. Berrange wrote:
On Tue, Feb 16, 2010 at 03:55:26PM +0100, Daniel Veillard wrote:
> 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.
Yes, that is correct. With the current libvirt API / XML description,
this is the best that we can do. In the future we might find we have
to extend our format to allow exact specification of which individual
CPUs are online. Currently I don't think this matters, but if we add
support for NUMA topology inside the guest, we might need finer
control. eg, you want to unplug a specific CPU from a specific guest
NUMA cell.
Okay, we're on the same page.
>
> [...]
> > +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 ?
QEMU doesn't actually return those errors in this case. This was a cut+paste
from teh balloon driver that I left in to remind me to investigate that later
ah, okay
re-ACK
thanks !
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit
http://xmlsoft.org/
daniel(a)veillard.com | Rpmfind RPM search engine
http://rpmfind.net/
http://veillard.com/ | virtualization library
http://libvirt.org/