[libvirt] [PATCH v3 21/24] qemu: command: Add support for sparse vcpu topologies
Ján Tomko
jtomko at redhat.com
Wed Aug 24 15:45:23 UTC 2016
On Wed, Aug 24, 2016 at 09:35:37AM -0400, Peter Krempa wrote:
>Add support for using the new approach to hotplug vcpus using device_add
>during startup of qemu to allow sparse vcpu topologies.
>
>There are a few limitations imposed by qemu on the supported
>configuration:
>- vcpu0 needs to be always present and not hotpluggable
>- non-hotpluggable cpus need to be ordered at the beginning
>- order of the vcpus needs to be unique for every single hotpluggable
> entity
>
>Qemu also doesn't really allow to query the information necessary to
>start a VM with the vcpus directly on the commandline. Fortunately they
>can be hotplugged during startup.
>
>The new hotplug code uses the following approach:
>- non-hotpluggable vcpus are counted and put to the -smp option
>- qemu is started
>- qemu is queried for the necessary information
>- the configuration is checked
>- the hotpluggable vcpus are hotplugged
>- vcpus are started
>
>This patch adds a lot of checking code and enables the support to
>specify the individual vcpu element with qemu.
>---
>
>Notes:
> v3:
> - fixed qsort comparison function (added dereference of one level)
>
> v3:
> - added docs to the HTML stating qemu restrictions.
>
> docs/formatdomain.html.in | 5 +
> src/qemu/qemu_command.c | 20 ++-
> src/qemu/qemu_domain.c | 76 ++++++++-
> src/qemu/qemu_process.c | 178 +++++++++++++++++++++
> .../qemuxml2argv-cpu-hotplug-startup.args | 20 +++
> .../qemuxml2argv-cpu-hotplug-startup.xml | 29 ++++
> tests/qemuxml2argvtest.c | 2 +
> 7 files changed, 325 insertions(+), 5 deletions(-)
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cpu-hotplug-startup.args
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cpu-hotplug-startup.xml
>
>diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
>index 062045b..8d3168a 100644
>--- a/docs/formatdomain.html.in
>+++ b/docs/formatdomain.html.in
>@@ -580,6 +580,11 @@
> Note that providing state for individual cpus may be necessary to enable
> support of addressable vCPU hotplug and this feature may not be
> supported by all hypervisors.
>+
>+ For QEMU the following conditions are required. Vcpu 0 needs to be
>+ enabled and non-hotpluggable. On PPC64 along with it vcpus that are in
>+ the same core need to be enabled as well. All non hotpluggable cpus
non-hotpluggable?
>+ present at boot need to be grouped after vcpu 0.
> <span class="since">Since 2.2.0 (QEMU only)</span>
> </dd>
> </dl>
>diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
>index 28e5a7e..c1dc390 100644
>--- a/src/qemu/qemu_command.c
>+++ b/src/qemu/qemu_command.c
>@@ -7082,17 +7082,29 @@ qemuBuildMachineCommandLine(virCommandPtr cmd,
>
> static int
> qemuBuildSmpCommandLine(virCommandPtr cmd,
>- const virDomainDef *def)
>+ virDomainDefPtr def)
> {
> char *smp;
> virBuffer buf = VIR_BUFFER_INITIALIZER;
>+ unsigned int maxvcpus = virDomainDefGetVcpusMax(def);
>+ unsigned int nvcpus = 0;
>+ virDomainVcpuDefPtr vcpu;
>+ size_t i;
>+
>+ /* count un-hotpluggable enabled vcpus. Hotpluggable ones will be added
non-hotpluggable?
>+ * in a different way */
>+ for (i = 0; i < maxvcpus; i++) {
>+ vcpu = virDomainDefGetVcpu(def, i);
>+ if (vcpu->online && vcpu->hotpluggable == VIR_TRISTATE_BOOL_NO)
>+ nvcpus++;
>+ }
>
> virCommandAddArg(cmd, "-smp");
>
>- virBufferAsprintf(&buf, "%u", virDomainDefGetVcpus(def));
>+ virBufferAsprintf(&buf, "%u", nvcpus);
>
>- if (virDomainDefHasVcpusOffline(def))
>- virBufferAsprintf(&buf, ",maxcpus=%u", virDomainDefGetVcpusMax(def));
>+ if (nvcpus != maxvcpus)
>+ virBufferAsprintf(&buf, ",maxcpus=%u", maxvcpus);
> /* sockets, cores, and threads are either all zero
> * or all non-zero, thus checking one of them is enough */
> if (def->cpu && def->cpu->sockets) {
>diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
>index aa93498..970c34a 100644
>--- a/src/qemu/qemu_domain.c
>+++ b/src/qemu/qemu_domain.c
>@@ -2253,6 +2253,76 @@ qemuDomainRecheckInternalPaths(virDomainDefPtr def,
>
>
> static int
>+qemuDomainDefVcpusPostParse(virDomainDefPtr def)
>+{
>+ unsigned int maxvcpus = virDomainDefGetVcpusMax(def);
>+ virDomainVcpuDefPtr vcpu;
>+ virDomainVcpuDefPtr prevvcpu;
>+ size_t i;
>+ bool has_order = false;
>+
>+ /* vcpu 0 needs to be present, first, and non-hotpluggable */
>+ vcpu = virDomainDefGetVcpu(def, 0);
>+ if (!vcpu->online) {
>+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>+ _("vcpu 0 can't be offline"));
>+ return -1;
>+ }
>+ if (vcpu->hotpluggable == VIR_TRISTATE_BOOL_YES) {
>+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>+ _("vcpu0 can't be hotpluggable"));
>+ return -1;
>+ }
>+ if (vcpu->order != 0 && vcpu->order != 1) {
>+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>+ _("vcpu0 must be enabled first"));
>+ return -1;
>+ }
>+
>+ if (vcpu->order != 0)
>+ has_order = true;
>+
>+ prevvcpu = vcpu;
>+
>+ /* all online vcpus or non online vcpu need to have order set */
>+ for (i = 1; i < maxvcpus; i++) {
>+ vcpu = virDomainDefGetVcpu(def, i);
>+
>+ if (vcpu->online &&
>+ (vcpu->order != 0) != has_order) {
>+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>+ _("all vcpus must have either set or unset order"));
>+ return -1;
>+ }
>+
>+ /* few conditions for non-hotpluggable (thus online) vcpus */
>+ if (vcpu->hotpluggable == VIR_TRISTATE_BOOL_NO) {
>+ /* they can be ordered only at the beinning */
beginning
ACK
Jan
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20160824/29f80496/attachment-0001.sig>
More information about the libvir-list
mailing list