All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anthony Liguori <anthony@codemonkey.ws>
To: anthony.perard@citrix.com
Cc: QEMU-devel <qemu-devel@nongnu.org>
Subject: Re: [Qemu-devel] [PATCH] Introduce -accel command option.
Date: Mon, 15 Nov 2010 10:54:56 -0600	[thread overview]
Message-ID: <4CE165E0.5040705@codemonkey.ws> (raw)
In-Reply-To: <1289835951-25567-1-git-send-email-anthony.perard@citrix.com>

On 11/15/2010 09:45 AM, anthony.perard@citrix.com wrote:
> From: Anthony PERARD<anthony.perard@citrix.com>
>
> This option gives the ability to switch one "accelerator" like kvm, xen
> or the default one tcg. We can specify more than one accelerator by
> separate them by a comma. QEMU will try each one and use the first whose
> works.
>
> So,
>
> -accel xen,kvm,tcg
>
> which would try Xen support first, then KVM and finaly tcg if none of
> the other works.
>    

Should use QemuOpts instead of parsing by hand.  I'd rather it be 
presented as a -machine option too with accel=xen:kvm:tcg to specify order.

Regards,

Anthony Liguori

> Signed-off-by: Anthony PERARD<anthony.perard@citrix.com>
> ---
>   arch_init.c     |    5 +++
>   arch_init.h     |    1 +
>   qemu-options.hx |   10 ++++++
>   vl.c            |   85 +++++++++++++++++++++++++++++++++++++++++++++++-------
>   4 files changed, 90 insertions(+), 11 deletions(-)
>
> diff --git a/arch_init.c b/arch_init.c
> index 4486925..e0d7a4c 100644
> --- a/arch_init.c
> +++ b/arch_init.c
> @@ -639,6 +639,11 @@ int audio_available(void)
>   #endif
>   }
>
> +int tcg_available(void)
> +{
> +    return 1;
> +}
> +
>   int kvm_available(void)
>   {
>   #ifdef CONFIG_KVM
> diff --git a/arch_init.h b/arch_init.h
> index 682890c..f0fb6a0 100644
> --- a/arch_init.h
> +++ b/arch_init.h
> @@ -27,6 +27,7 @@ void do_acpitable_option(const char *optarg);
>   void do_smbios_option(const char *optarg);
>   void cpudef_init(void);
>   int audio_available(void);
> +int tcg_available(void);
>   int kvm_available(void);
>   int xen_available(void);
>
> diff --git a/qemu-options.hx b/qemu-options.hx
> index 4d99a58..958d126 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -1975,6 +1975,16 @@ Enable KVM full virtualization support. This option is only available
>   if KVM support is enabled when compiling.
>   ETEXI
>
> +DEF("accel", HAS_ARG, QEMU_OPTION_accel, \
> +    "-accel accel    use an accelerator (kvm,xen,tcg), default is tcg\n", QEMU_ARCH_ALL)
> +STEXI
> +@item -accel @var{accel}[,@var{accel}[,...]]
> +@findex -accel
> +This is use to enable an accelerator, in kvm,xen,tcg.
> +By default, it use only tcg. If there a more than one accelerator
> +specified, the next one is used if the first don't work.
> +ETEXI
> +
>   DEF("xen-domid", HAS_ARG, QEMU_OPTION_xen_domid,
>       "-xen-domid id   specify xen guest domain id\n", QEMU_ARCH_ALL)
>   DEF("xen-create", 0, QEMU_OPTION_xen_create,
> diff --git a/vl.c b/vl.c
> index c58583d..2917e32 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -242,6 +242,7 @@ static void *boot_set_opaque;
>   static NotifierList exit_notifiers =
>       NOTIFIER_LIST_INITIALIZER(exit_notifiers);
>
> +static int tcg_allowed = 1;
>   int kvm_allowed = 0;
>   uint32_t xen_domid;
>   enum xen_mode xen_mode = XEN_EMULATE;
> @@ -1723,6 +1724,72 @@ static int debugcon_parse(const char *devname)
>       return 0;
>   }
>
> +static int tcg_init(int smp_cpus)
> +{
> +    return 0;
> +}
> +
> +static struct {
> +    const char *opt_name;
> +    const char *name;
> +    int (*available)(void);
> +    int (*init)(int smp_cpus);
> +    int *allowed;
> +} accel_list[] = {
> +    { "tcg", "tcg", tcg_available, tcg_init,&tcg_allowed },
> +    { "kvm", "KVM", kvm_available, kvm_init,&kvm_allowed },
> +};
> +
> +static int accel_parse_init(const char *opts)
> +{
> +    const char *p = opts;
> +    char buf[10];
> +    int i, ret;
> +    bool accel_initalised = 0;
> +    bool init_failed = 0;
> +
> +    while (!accel_initalised&&  *p != '\0') {
> +        if (*p == ',') {
> +            p++;
> +        }
> +        p = get_opt_name(buf, sizeof (buf), p, ',');
> +        for (i = 0; i<  ARRAY_SIZE(accel_list); i++) {
> +            if (strcmp(accel_list[i].opt_name, buf) == 0) {
> +                ret = accel_list[i].init(smp_cpus);
> +                if (ret<  0) {
> +                    init_failed = 1;
> +                    if (!accel_list[i].available()) {
> +                        printf("%s not supported for this target\n",
> +                               accel_list[i].name);
> +                    } else {
> +                        fprintf(stderr, "failed to initialize %s: %s\n",
> +                                accel_list[i].name,
> +                                strerror(-ret));
> +                    }
> +                } else {
> +                    accel_initalised = 1;
> +                    *(accel_list[i].allowed) = 1;
> +                }
> +                break;
> +            }
> +        }
> +        if (i == ARRAY_SIZE(accel_list)) {
> +            fprintf(stderr, "\"%s\" accelerator does not exist.\n", buf);
> +        }
> +    }
> +
> +    if (!accel_initalised) {
> +        fprintf(stderr, "No accelerator found!\n");
> +        exit(1);
> +    }
> +
> +    if (init_failed) {
> +        fprintf(stderr, "Back to %s accelerator.\n", accel_list[i].name);
> +    }
> +
> +    return !accel_initalised;
> +}
> +
>   void qemu_add_exit_notifier(Notifier *notify)
>   {
>       notifier_list_add(&exit_notifiers, notify);
> @@ -1802,6 +1869,7 @@ int main(int argc, char **argv, char **envp)
>       const char *incoming = NULL;
>       int show_vnc_port = 0;
>       int defconfig = 1;
> +    const char *accel_list_opts = "tcg";
>
>   #ifdef CONFIG_SIMPLE_TRACE
>       const char *trace_file = NULL;
> @@ -2409,7 +2477,10 @@ int main(int argc, char **argv, char **envp)
>                   do_smbios_option(optarg);
>                   break;
>               case QEMU_OPTION_enable_kvm:
> -                kvm_allowed = 1;
> +                accel_list_opts = "kvm";
> +                break;
> +            case QEMU_OPTION_accel:
> +                accel_list_opts = optarg;
>                   break;
>               case QEMU_OPTION_usb:
>                   usb_enabled = 1;
> @@ -2719,16 +2790,8 @@ int main(int argc, char **argv, char **envp)
>           exit(1);
>       }
>
> -    if (kvm_allowed) {
> -        int ret = kvm_init(smp_cpus);
> -        if (ret<  0) {
> -            if (!kvm_available()) {
> -                printf("KVM not supported for this target\n");
> -            } else {
> -                fprintf(stderr, "failed to initialize KVM: %s\n", strerror(-ret));
> -            }
> -            exit(1);
> -        }
> +    if (accel_list_opts) {
> +        accel_parse_init(accel_list_opts);
>       }
>
>       if (qemu_init_main_loop()) {
>    

  reply	other threads:[~2010-11-15 16:55 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-11-15 15:45 [Qemu-devel] [PATCH] Introduce -accel command option anthony.perard
2010-11-15 16:54 ` Anthony Liguori [this message]
2010-11-16 16:10   ` Anthony PERARD
2010-11-16 16:41     ` Anthony Liguori
2010-11-16 16:55       ` Daniel P. Berrange
2010-11-16 16:59         ` Alexander Graf
2010-11-16 17:20           ` Anthony Liguori
2010-11-16 17:24             ` Alexander Graf
2010-11-16 17:27               ` Anthony Liguori
2010-11-16 17:32                 ` Alexander Graf
2010-11-16 18:22                 ` Anthony PERARD
2010-11-16 18:49                   ` Alexander Graf
2010-11-16 18:57                     ` Anthony Liguori
2010-11-16 17:07         ` Anthony Liguori

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4CE165E0.5040705@codemonkey.ws \
    --to=anthony@codemonkey.ws \
    --cc=anthony.perard@citrix.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.