QEMU binary is called several times when we probe different kinds of capabilities the binary supports. This patch introduces new common helper so that all probes use a consistent way of invoking qemu. --- src/qemu/qemu_capabilities.c | 59 ++++++++++++++++++++++++++--------------- src/qemu/qemu_capabilities.h | 5 +++ src/qemu/qemu_driver.c | 9 +++++- 3 files changed, 50 insertions(+), 23 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 3d1fb43..6e5165b 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -289,6 +289,7 @@ qemuCapsParseMachineTypesStr(const char *output, int qemuCapsProbeMachineTypes(const char *binary, + virBitmapPtr qemuCaps, virCapsGuestMachinePtr **machines, int *nmachines) { @@ -306,10 +307,9 @@ qemuCapsProbeMachineTypes(const char *binary, return -1; } - cmd = virCommandNewArgList(binary, "-M", "?", NULL); - virCommandAddEnvPassCommon(cmd); + cmd = qemuCapsProbeCommand(binary, qemuCaps); + virCommandAddArgList(cmd, "-M", "?", NULL); virCommandSetOutputBuffer(cmd, &output); - virCommandClearCaps(cmd); /* Ignore failure from older qemu that did not understand '-M ?'. */ if (virCommandRun(cmd, &status) < 0) @@ -599,12 +599,9 @@ qemuCapsProbeCPUModels(const char *qemu, return 0; } - cmd = virCommandNewArgList(qemu, "-cpu", "?", NULL); - if (qemuCapsGet(qemuCaps, QEMU_CAPS_NODEFCONFIG)) - virCommandAddArg(cmd, "-nodefconfig"); - virCommandAddEnvPassCommon(cmd); + cmd = qemuCapsProbeCommand(qemu, qemuCaps); + virCommandAddArgList(cmd, "-cpu", "?", NULL); virCommandSetOutputBuffer(cmd, &output); - virCommandClearCaps(cmd); if (virCommandRun(cmd, NULL) < 0) goto cleanup; @@ -730,7 +727,8 @@ qemuCapsInitGuest(virCapsPtr caps, info->wordsize, binary, binary_mtime, old_caps, &machines, &nmachines); if (probe && - qemuCapsProbeMachineTypes(binary, &machines, &nmachines) < 0) + qemuCapsProbeMachineTypes(binary, qemuCaps, + &machines, &nmachines) < 0) goto error; } @@ -798,7 +796,8 @@ qemuCapsInitGuest(virCapsPtr caps, kvmbin, binary_mtime, old_caps, &machines, &nmachines); if (probe && - qemuCapsProbeMachineTypes(kvmbin, &machines, &nmachines) < 0) + qemuCapsProbeMachineTypes(kvmbin, qemuCaps, + &machines, &nmachines) < 0) goto error; } @@ -1366,17 +1365,16 @@ qemuCapsExtractDeviceStr(const char *qemu, * understand '-device name,?', and always exits with status 1 for * the simpler '-device ?', so this function is really only useful * if -help includes "device driver,?". */ - cmd = virCommandNewArgList(qemu, - "-device", "?", - "-device", "pci-assign,?", - "-device", "virtio-blk-pci,?", - "-device", "virtio-net-pci,?", - "-device", "scsi-disk,?", - NULL); - virCommandAddEnvPassCommon(cmd); + cmd = qemuCapsProbeCommand(qemu, flags); + virCommandAddArgList(cmd, + "-device", "?", + "-device", "pci-assign,?", + "-device", "virtio-blk-pci,?", + "-device", "virtio-net-pci,?", + "-device", "scsi-disk,?", + NULL); /* qemu -help goes to stdout, but qemu -device ? goes to stderr. */ virCommandSetErrorBuffer(cmd, &output); - virCommandClearCaps(cmd); if (virCommandRun(cmd, NULL) < 0) goto cleanup; @@ -1485,10 +1483,9 @@ int qemuCapsExtractVersionInfo(const char *qemu, const char *arch, return -1; } - cmd = virCommandNewArgList(qemu, "-help", NULL); - virCommandAddEnvPassCommon(cmd); + cmd = qemuCapsProbeCommand(qemu, NULL); + virCommandAddArgList(cmd, "-help", NULL); virCommandSetOutputBuffer(cmd, &help); - virCommandClearCaps(cmd); if (virCommandRun(cmd, NULL) < 0) goto cleanup; @@ -1628,3 +1625,21 @@ qemuCapsGet(virBitmapPtr caps, else return b; } + + +virCommandPtr +qemuCapsProbeCommand(const char *qemu, + virBitmapPtr qemuCaps) +{ + virCommandPtr cmd = virCommandNew(qemu); + + if (qemuCaps) { + if (qemuCapsGet(qemuCaps, QEMU_CAPS_NODEFCONFIG)) + virCommandAddArg(cmd, "-nodefconfig"); + } + + virCommandAddEnvPassCommon(cmd); + virCommandClearCaps(cmd); + + return cmd; +} diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 7279cdb..7a6c5a0 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -26,6 +26,7 @@ # include "bitmap.h" # include "capabilities.h" +# include "command.h" /* Internal flags to keep track of qemu command line capabilities */ enum qemuCapsFlags { @@ -150,6 +151,7 @@ bool qemuCapsGet(virBitmapPtr caps, virCapsPtr qemuCapsInit(virCapsPtr old_caps); int qemuCapsProbeMachineTypes(const char *binary, + virBitmapPtr qemuCaps, virCapsGuestMachinePtr **machines, int *nmachines); @@ -175,6 +177,9 @@ int qemuCapsParseHelpStr(const char *qemu, int qemuCapsParseDeviceStr(const char *str, virBitmapPtr qemuCaps); +virCommandPtr qemuCapsProbeCommand(const char *qemu, + virBitmapPtr qemuCaps); + VIR_ENUM_DECL(qemuCaps); #endif /* __QEMU_CAPABILITIES_H__*/ diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index c3555ca..bcc3947 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -4867,7 +4867,14 @@ qemudCanonicalizeMachineDirect(virDomainDefPtr def, char **canonical) virCapsGuestMachinePtr *machines = NULL; int i, nmachines = 0; - if (qemuCapsProbeMachineTypes(def->emulator, &machines, &nmachines) < 0) + /* XXX we should be checking emulator capabilities and pass them instead + * of NULL so that -nodefconfig is properly added when + * probing machine types. Luckily, qemu does not support specifying new + * machine types in its configuration files yet, which means passing this + * additional parameter makes no difference now. + */ + if (qemuCapsProbeMachineTypes(def->emulator, NULL, + &machines, &nmachines) < 0) return -1; for (i = 0; i < nmachines; i++) { -- 1.7.8.5 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list