From: Jiri Denemark Date: Fri, 12 Jun 2015 12:36:51 +0000 (+0200) Subject: qemu: Report all supported machine types in capabilities X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=beca509e437b51b68ff42494cc67919d306876ea;p=libvirt.git qemu: Report all supported machine types in capabilities Some machine types are only reported as canonical names for other machine types, which make it a bit harder to find what machine types are supported by a specific QEMU binary. Ideally, one would just use /capabilities/guest/arch[@name='...']/machine/text() XPath to get a list of all supported machine types, but it doesn't work right now. For example, we report pc in guest capabilities, but the corresponding pc-i440fx-2.3 is missing. This is a result of QMP probing. With "-machine ?" parsing QEMU sends us two lines: pc Standard PC (i440FX + PIIX, 1996) (alias of pc-i440fx-2.3) pc-i440fx-2.3 Standard PC (i440FX + PIIX, 1996) (default) while query-machines QMP command reports both in the same entry: {"name": "pc-i440fx-2.3", "is-default": true, "cpu-max": 255, "alias": "pc"} Let's make sure we always report separate for both the canonical name and its alias and using the canonical name as the default machine type (i.e., inserting it before its alias) in case is-default is true. https://bugzilla.redhat.com/show_bug.cgi?id=1229666 Signed-off-by: Jiri Denemark --- diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 27a632abe0..cbcd67299d 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -2229,6 +2229,44 @@ int virQEMUCapsGetMachineTypesCaps(virQEMUCapsPtr qemuCaps, mach->maxCpus = qemuCaps->machineMaxCpus[i]; } + /* Make sure all canonical machine types also have their own entry so that + * /capabilities/guest/arch[@name='...']/machine/text() XPath selects all + * supported machine types. + */ + i = 0; + while (i < *nmachines) { + size_t j; + bool found = false; + virCapsGuestMachinePtr machine = (*machines)[i]; + + if (!machine->canonical) { + i++; + continue; + } + + for (j = 0; j < *nmachines; j++) { + if (STREQ(machine->canonical, (*machines)[j]->name)) { + found = true; + break; + } + } + + if (!found) { + virCapsGuestMachinePtr mach; + if (VIR_ALLOC(mach) < 0) + goto error; + if (VIR_INSERT_ELEMENT_COPY(*machines, i, *nmachines, mach) < 0) { + VIR_FREE(mach); + goto error; + } + if (VIR_STRDUP(mach->name, machine->canonical) < 0) + goto error; + mach->maxCpus = machine->maxCpus; + i++; + } + i++; + } + return 0; error: