From beca509e437b51b68ff42494cc67919d306876ea Mon Sep 17 00:00:00 2001 From: Jiri Denemark Date: Fri, 12 Jun 2015 14:36:51 +0200 Subject: [PATCH] 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 --- src/qemu/qemu_capabilities.c | 38 ++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) 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: -- 2.39.5