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()) {
>
next prev parent 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).