[libvirt] [PATCHv2 1/2] Optimize machine option to set more options with it.

Li Zhang zhlcindy at gmail.com
Wed Mar 27 05:13:46 UTC 2013


Any comment ?

Thanks. :)

On 2013年03月15日 17:19, Li Zhang wrote:
> From: Li Zhang <zhlcindy at linux.vnet.ibm.com>
>
>   Currently, -machine option is used only when dump-guest-core is set.
>
>   To use options defined in machine option for newer version of QEMU,
>   it needs to use -machine xxx, and to be compatible with older version
>   -M, this patch addes QEMU_CAPS_MACHINE_OPT capability for newer version,
>   say 1.2.0.
>
> Signed-off-by: Li Zhang <zhlcindy at linux.vnet.ibm.com>
> ---
>   v2 -> v1:
>    * Split the patch to 2 parts suggested by Daniel P.Berrange
>    * Rename QEMU_CAPS_MACH_OPT to QEMU_CAPS_MACHINE_OPT
>    * Remove version 1.1 assertion for QEMU_CAPS_MACHINE_OPT
>
>   src/qemu/qemu_capabilities.c |    6 +++++-
>   src/qemu/qemu_capabilities.h |    1 +
>   src/qemu/qemu_command.c      |   30 +++++++++++++++++++-----------
>   tests/qemuxml2argvtest.c     |    6 +++---
>   4 files changed, 28 insertions(+), 15 deletions(-)
>
> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
> index 519d2c5..778e825 100644
> --- a/src/qemu/qemu_capabilities.c
> +++ b/src/qemu/qemu_capabilities.c
> @@ -210,7 +210,8 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
>   
>                 "rng-random", /* 130 */
>                 "rng-egd",
> -              "virtio-ccw"
> +              "virtio-ccw",
> +              "machine-opt"
>       );
>   
>   struct _virQEMUCaps {
> @@ -2442,6 +2443,9 @@ virQEMUCapsInitQMP(virQEMUCapsPtr qemuCaps,
>   
>       virQEMUCapsInitQMPBasic(qemuCaps);
>   
> +    /* machine option is supported for newer version */
> +    virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_OPT);
> +
>       if (!(archstr = qemuMonitorGetTargetArch(mon)))
>           goto cleanup;
>   
> diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
> index da06e27..66df556 100644
> --- a/src/qemu/qemu_capabilities.h
> +++ b/src/qemu/qemu_capabilities.h
> @@ -172,6 +172,7 @@ enum virQEMUCapsFlags {
>                                              virtio rng */
>       QEMU_CAPS_OBJECT_RNG_EGD     = 131, /* EGD protocol daemon for rng */
>       QEMU_CAPS_VIRTIO_CCW         = 132, /* -device virtio-*-ccw */
> +    QEMU_CAPS_MACHINE_OPT        = 133, /* -machine xxxx*/
>   
>       QEMU_CAPS_LAST,                   /* this must always be the last item */
>   };
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index dc49d44..c39faf0 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -4941,6 +4941,8 @@ qemuBuildMachineArgStr(virCommandPtr cmd,
>                          const virDomainDefPtr def,
>                          virQEMUCapsPtr qemuCaps)
>   {
> +    virBuffer buf = VIR_BUFFER_INITIALIZER;
> +
>       /* This should *never* be NULL, since we always provide
>        * a machine in the capabilities data for QEMU. So this
>        * check is just here as a safety in case the unexpected
> @@ -4948,27 +4950,33 @@ qemuBuildMachineArgStr(virCommandPtr cmd,
>       if (!def->os.machine)
>           return 0;
>   
> -    if (!def->mem.dump_core) {
> +    if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_OPT)) {
>           /* if no parameter to the machine type is needed, we still use
>            * '-M' to keep the most of the compatibility with older versions.
>            */
>           virCommandAddArgList(cmd, "-M", def->os.machine, NULL);
>       } else {
> -        if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DUMP_GUEST_CORE)) {
> -            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> -                           "%s", _("dump-guest-core is not available "
> -                                   " with this QEMU binary"));
> -            return -1;
> -        }
>   
>           /* However, in case there is a parameter to be added, we need to
>            * use the "-machine" parameter because qemu is not parsing the
>            * "-M" correctly */
> +
>           virCommandAddArg(cmd, "-machine");
> -        virCommandAddArgFormat(cmd,
> -                               "%s,dump-guest-core=%s",
> -                               def->os.machine,
> -                               virDomainMemDumpTypeToString(def->mem.dump_core));
> +        virBufferAsprintf(&buf, "%s", def->os.machine);
> +
> +        if (def->mem.dump_core) {
> +            if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DUMP_GUEST_CORE)) {
> +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                               "%s", _("dump-guest-core is not available "
> +                                " with this QEMU binary"));
> +                return -1;
> +            }
> +
> +            virBufferAsprintf(&buf, ",dump-guest-core=%s",
> +                              virDomainMemDumpTypeToString(def->mem.dump_core));
> +        }
> +
> +        virCommandAddArg(cmd, virBufferContentAndReset(&buf));
>       }
>   
>       return 0;
> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
> index c77b73f..352b41f 100644
> --- a/tests/qemuxml2argvtest.c
> +++ b/tests/qemuxml2argvtest.c
> @@ -363,9 +363,9 @@ mymain(void)
>       DO_TEST("minimal-s390", QEMU_CAPS_NAME);
>       DO_TEST("machine-aliases1", NONE);
>       DO_TEST("machine-aliases2", QEMU_CAPS_KVM);
> -    DO_TEST("machine-core-on", QEMU_CAPS_DUMP_GUEST_CORE);
> -    DO_TEST("machine-core-off", QEMU_CAPS_DUMP_GUEST_CORE);
> -    DO_TEST_FAILURE("machine-core-on", NONE);
> +    DO_TEST("machine-core-on", QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_DUMP_GUEST_CORE);
> +    DO_TEST("machine-core-off", QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_DUMP_GUEST_CORE);
> +    DO_TEST_FAILURE("machine-core-on", QEMU_CAPS_MACHINE_OPT, NONE);
>       DO_TEST("boot-cdrom", NONE);
>       DO_TEST("boot-network", NONE);
>       DO_TEST("boot-floppy", NONE);




More information about the libvir-list mailing list