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 <machine canonical='pc-i440fx-2.3' maxCpus='255'>pc</machine> in guest capabilities, but the corresponding <machine maxCpus='255'>pc-i440fx-2.3</machine> 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 <machine/> 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 <jdenemar@redhat.com>
This commit is contained in:
parent
7690a5a838
commit
beca509e43
@ -2229,6 +2229,44 @@ int virQEMUCapsGetMachineTypesCaps(virQEMUCapsPtr qemuCaps,
|
|||||||
mach->maxCpus = qemuCaps->machineMaxCpus[i];
|
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;
|
return 0;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user