qemu-devel.nongnu.org archive mirror
 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).