diff mbox

Fix the -accel parameter and the documentation for 'hax'

Message ID 1493718721-29774-1-git-send-email-thuth@redhat.com
State New
Headers show

Commit Message

Thomas Huth May 2, 2017, 9:52 a.m. UTC
Since 'hax' is a possible accelerator nowadays, too, the '-accel'
option should support it and we should mention it in the documentation,
too.

Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 qemu-options.hx |  8 ++++----
 vl.c            | 24 ++++++++++--------------
 2 files changed, 14 insertions(+), 18 deletions(-)

Comments

Paolo Bonzini May 2, 2017, 12:58 p.m. UTC | #1
On 02/05/2017 11:52, Thomas Huth wrote:
> Since 'hax' is a possible accelerator nowadays, too, the '-accel'
> option should support it and we should mention it in the documentation,
> too.
> 
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---
>  qemu-options.hx |  8 ++++----
>  vl.c            | 24 ++++++++++--------------
>  2 files changed, 14 insertions(+), 18 deletions(-)
> 
> diff --git a/qemu-options.hx b/qemu-options.hx
> index 787b9c3..c7b1d2d 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -31,7 +31,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \
>      "-machine [type=]name[,prop[=value][,...]]\n"
>      "                selects emulated machine ('-machine help' for list)\n"
>      "                property accel=accel1[:accel2[:...]] selects accelerator\n"
> -    "                supported accelerators are kvm, xen, tcg (default: tcg)\n"
> +    "                supported accelerators are kvm, xen, hax or tcg (default: tcg)\n"
>      "                kernel_irqchip=on|off|split controls accelerated irqchip support (default=off)\n"
>      "                vmport=on|off|auto controls emulation of vmport (default: auto)\n"
>      "                kvm_shadow_mem=size of KVM shadow MMU in bytes\n"
> @@ -52,9 +52,9 @@ available machines. Supported machine properties are:
>  @table @option
>  @item accel=@var{accels1}[:@var{accels2}[:...]]
>  This is used to enable an accelerator. Depending on the target architecture,
> -kvm, xen, or tcg can be available. By default, tcg is used. If there is more
> -than one accelerator specified, the next one is used if the previous one fails
> -to initialize.
> +kvm, xen, hax or tcg can be available. By default, tcg is used. If there is
> +more than one accelerator specified, the next one is used if the previous one
> +fails to initialize.
>  @item kernel_irqchip=on|off
>  Controls in-kernel irqchip support for the chosen accelerator when available.
>  @item gfx_passthru=on|off
> diff --git a/vl.c b/vl.c
> index f46e070..d5e88fb 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -3725,26 +3725,22 @@ int main(int argc, char **argv, char **envp)
>                  qdev_prop_register_global(&kvm_pit_lost_tick_policy);
>                  break;
>              }
> -            case QEMU_OPTION_accel:
> +            case QEMU_OPTION_accel: {
> +                char *mstr;
> +
>                  accel_opts = qemu_opts_parse_noisily(qemu_find_opts("accel"),
>                                                       optarg, true);
>                  optarg = qemu_opt_get(accel_opts, "accel");
> -
> -                olist = qemu_find_opts("machine");
> -                if (strcmp("kvm", optarg) == 0) {
> -                    qemu_opts_parse_noisily(olist, "accel=kvm", false);
> -                } else if (strcmp("xen", optarg) == 0) {
> -                    qemu_opts_parse_noisily(olist, "accel=xen", false);
> -                } else if (strcmp("tcg", optarg) == 0) {
> -                    qemu_opts_parse_noisily(olist, "accel=tcg", false);
> -                } else {
> -                    if (!is_help_option(optarg)) {
> -                        error_printf("Unknown accelerator: %s", optarg);
> -                    }
> -                    error_printf("Supported accelerators: kvm, xen, tcg\n");
> +                if (is_help_option(optarg)) {
> +                    error_printf("Possible accelerators: kvm, xen, hax, tcg\n");
>                      exit(1);
>                  }
> +                mstr = g_strdup_printf("accel=%s", optarg);
> +                olist = qemu_find_opts("machine");
> +                qemu_opts_parse_noisily(olist, mstr, false);

Thanks for the report.  I think this has bad side effects when one
specifies an invalid accelerator such as -accel tcg,,usb=on.  Eduardo
has more plans for -accel, I think.

Paolo

> +                g_free(mstr);
>                  break;
> +            }
>              case QEMU_OPTION_usb:
>                  olist = qemu_find_opts("machine");
>                  qemu_opts_parse_noisily(olist, "usb=on", false);
>
Eduardo Habkost May 2, 2017, 1:45 p.m. UTC | #2
On Tue, May 02, 2017 at 02:58:35PM +0200, Paolo Bonzini wrote:
> 
> 
> On 02/05/2017 11:52, Thomas Huth wrote:
> > Since 'hax' is a possible accelerator nowadays, too, the '-accel'
> > option should support it and we should mention it in the documentation,
> > too.
> > 
> > Signed-off-by: Thomas Huth <thuth@redhat.com>
> > ---
> >  qemu-options.hx |  8 ++++----
> >  vl.c            | 24 ++++++++++--------------
> >  2 files changed, 14 insertions(+), 18 deletions(-)
> > 
> > diff --git a/qemu-options.hx b/qemu-options.hx
> > index 787b9c3..c7b1d2d 100644
> > --- a/qemu-options.hx
> > +++ b/qemu-options.hx
> > @@ -31,7 +31,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \
> >      "-machine [type=]name[,prop[=value][,...]]\n"
> >      "                selects emulated machine ('-machine help' for list)\n"
> >      "                property accel=accel1[:accel2[:...]] selects accelerator\n"
> > -    "                supported accelerators are kvm, xen, tcg (default: tcg)\n"
> > +    "                supported accelerators are kvm, xen, hax or tcg (default: tcg)\n"
> >      "                kernel_irqchip=on|off|split controls accelerated irqchip support (default=off)\n"
> >      "                vmport=on|off|auto controls emulation of vmport (default: auto)\n"
> >      "                kvm_shadow_mem=size of KVM shadow MMU in bytes\n"
> > @@ -52,9 +52,9 @@ available machines. Supported machine properties are:
> >  @table @option
> >  @item accel=@var{accels1}[:@var{accels2}[:...]]
> >  This is used to enable an accelerator. Depending on the target architecture,
> > -kvm, xen, or tcg can be available. By default, tcg is used. If there is more
> > -than one accelerator specified, the next one is used if the previous one fails
> > -to initialize.
> > +kvm, xen, hax or tcg can be available. By default, tcg is used. If there is
> > +more than one accelerator specified, the next one is used if the previous one
> > +fails to initialize.
> >  @item kernel_irqchip=on|off
> >  Controls in-kernel irqchip support for the chosen accelerator when available.
> >  @item gfx_passthru=on|off
> > diff --git a/vl.c b/vl.c
> > index f46e070..d5e88fb 100644
> > --- a/vl.c
> > +++ b/vl.c
> > @@ -3725,26 +3725,22 @@ int main(int argc, char **argv, char **envp)
> >                  qdev_prop_register_global(&kvm_pit_lost_tick_policy);
> >                  break;
> >              }
> > -            case QEMU_OPTION_accel:
> > +            case QEMU_OPTION_accel: {
> > +                char *mstr;
> > +
> >                  accel_opts = qemu_opts_parse_noisily(qemu_find_opts("accel"),
> >                                                       optarg, true);
> >                  optarg = qemu_opt_get(accel_opts, "accel");
> > -
> > -                olist = qemu_find_opts("machine");
> > -                if (strcmp("kvm", optarg) == 0) {
> > -                    qemu_opts_parse_noisily(olist, "accel=kvm", false);
> > -                } else if (strcmp("xen", optarg) == 0) {
> > -                    qemu_opts_parse_noisily(olist, "accel=xen", false);
> > -                } else if (strcmp("tcg", optarg) == 0) {
> > -                    qemu_opts_parse_noisily(olist, "accel=tcg", false);
> > -                } else {

Getting rid of this hardcoded list is welcome.

> > -                    if (!is_help_option(optarg)) {
> > -                        error_printf("Unknown accelerator: %s", optarg);
> > -                    }
> > -                    error_printf("Supported accelerators: kvm, xen, tcg\n");
> > +                if (is_help_option(optarg)) {
> > +                    error_printf("Possible accelerators: kvm, xen, hax, tcg\n");

This should be replaced by object_class_get_list()- or
object_class_for_each()-based loop, so we don't need to maintain
the list manually. But that's for a follow-up patch.

> >                      exit(1);
> >                  }
> > +                mstr = g_strdup_printf("accel=%s", optarg);
> > +                olist = qemu_find_opts("machine");
> > +                qemu_opts_parse_noisily(olist, mstr, false);
> 
> Thanks for the report.  I think this has bad side effects when one
> specifies an invalid accelerator such as -accel tcg,,usb=on.  Eduardo
> has more plans for -accel, I think.

We can use qemu_opt_set() here to avoid this problem.

I wasn't even aware that we had a new -accel option. Thanks for
CCing me. I believe -accel should be mapped to
"-object ...-accel" eventually, but that's for the future.


> 
> Paolo
> 
> > +                g_free(mstr);
> >                  break;
> > +            }
> >              case QEMU_OPTION_usb:
> >                  olist = qemu_find_opts("machine");
> >                  qemu_opts_parse_noisily(olist, "usb=on", false);
> >
diff mbox

Patch

diff --git a/qemu-options.hx b/qemu-options.hx
index 787b9c3..c7b1d2d 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -31,7 +31,7 @@  DEF("machine", HAS_ARG, QEMU_OPTION_machine, \
     "-machine [type=]name[,prop[=value][,...]]\n"
     "                selects emulated machine ('-machine help' for list)\n"
     "                property accel=accel1[:accel2[:...]] selects accelerator\n"
-    "                supported accelerators are kvm, xen, tcg (default: tcg)\n"
+    "                supported accelerators are kvm, xen, hax or tcg (default: tcg)\n"
     "                kernel_irqchip=on|off|split controls accelerated irqchip support (default=off)\n"
     "                vmport=on|off|auto controls emulation of vmport (default: auto)\n"
     "                kvm_shadow_mem=size of KVM shadow MMU in bytes\n"
@@ -52,9 +52,9 @@  available machines. Supported machine properties are:
 @table @option
 @item accel=@var{accels1}[:@var{accels2}[:...]]
 This is used to enable an accelerator. Depending on the target architecture,
-kvm, xen, or tcg can be available. By default, tcg is used. If there is more
-than one accelerator specified, the next one is used if the previous one fails
-to initialize.
+kvm, xen, hax or tcg can be available. By default, tcg is used. If there is
+more than one accelerator specified, the next one is used if the previous one
+fails to initialize.
 @item kernel_irqchip=on|off
 Controls in-kernel irqchip support for the chosen accelerator when available.
 @item gfx_passthru=on|off
diff --git a/vl.c b/vl.c
index f46e070..d5e88fb 100644
--- a/vl.c
+++ b/vl.c
@@ -3725,26 +3725,22 @@  int main(int argc, char **argv, char **envp)
                 qdev_prop_register_global(&kvm_pit_lost_tick_policy);
                 break;
             }
-            case QEMU_OPTION_accel:
+            case QEMU_OPTION_accel: {
+                char *mstr;
+
                 accel_opts = qemu_opts_parse_noisily(qemu_find_opts("accel"),
                                                      optarg, true);
                 optarg = qemu_opt_get(accel_opts, "accel");
-
-                olist = qemu_find_opts("machine");
-                if (strcmp("kvm", optarg) == 0) {
-                    qemu_opts_parse_noisily(olist, "accel=kvm", false);
-                } else if (strcmp("xen", optarg) == 0) {
-                    qemu_opts_parse_noisily(olist, "accel=xen", false);
-                } else if (strcmp("tcg", optarg) == 0) {
-                    qemu_opts_parse_noisily(olist, "accel=tcg", false);
-                } else {
-                    if (!is_help_option(optarg)) {
-                        error_printf("Unknown accelerator: %s", optarg);
-                    }
-                    error_printf("Supported accelerators: kvm, xen, tcg\n");
+                if (is_help_option(optarg)) {
+                    error_printf("Possible accelerators: kvm, xen, hax, tcg\n");
                     exit(1);
                 }
+                mstr = g_strdup_printf("accel=%s", optarg);
+                olist = qemu_find_opts("machine");
+                qemu_opts_parse_noisily(olist, mstr, false);
+                g_free(mstr);
                 break;
+            }
             case QEMU_OPTION_usb:
                 olist = qemu_find_opts("machine");
                 qemu_opts_parse_noisily(olist, "usb=on", false);