qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] Introduce -accel command option.


From: Anthony Liguori
Subject: Re: [Qemu-devel] [PATCH] Introduce -accel command option.
Date: Mon, 15 Nov 2010 10:54:56 -0600
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.15) Gecko/20101027 Lightning/1.0b1 Thunderbird/3.0.10

On 11/15/2010 09:45 AM, address@hidden wrote:
From: Anthony PERARD<address@hidden>

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<address@hidden>
---
  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
address@hidden -accel @var{accel}[,@var{accel}[,...]]
address@hidden -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 via email to

[Prev in Thread] Current Thread [Next in Thread]