All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [RESEND PATCH V3 0/2] Introduce "machine" QemuOpts
@ 2011-01-25 12:36 anthony.perard
  2011-01-25 12:36 ` [Qemu-devel] [RESEND PATCH V3 1/2] Introduce -machine command option anthony.perard
  2011-01-25 12:36 ` [Qemu-devel] [RESEND PATCH V3 2/2] machine, Add default_machine_opts to QEMUMachine anthony.perard
  0 siblings, 2 replies; 3+ messages in thread
From: anthony.perard @ 2011-01-25 12:36 UTC (permalink / raw)
  To: QEMU-devel; +Cc: Anthony PERARD, Stefano Stabellini

From: Anthony PERARD <anthony.perard@citrix.com>

The first patch adds "-machine accel=accels" to Qemu options. And the second
one adds a new field in QEMUMachine to be able to specify a set of machine
options.

With the second patch, we will be able to run a Xen specific machine without
saying to use Xen as an "accelerator".


Anthony PERARD (2):
  Introduce -machine command option.
  machine, Add default_machine_opts to QEMUMachine.

 arch_init.c     |    5 ++
 arch_init.h     |    1 +
 hw/boards.h     |    1 +
 qemu-config.c   |   14 ++++++
 qemu-options.hx |   10 ++++
 vl.c            |  124 +++++++++++++++++++++++++++++++++++++++++++++++++-----
 6 files changed, 143 insertions(+), 12 deletions(-)

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [Qemu-devel] [RESEND PATCH V3 1/2] Introduce -machine command option.
  2011-01-25 12:36 [Qemu-devel] [RESEND PATCH V3 0/2] Introduce "machine" QemuOpts anthony.perard
@ 2011-01-25 12:36 ` anthony.perard
  2011-01-25 12:36 ` [Qemu-devel] [RESEND PATCH V3 2/2] machine, Add default_machine_opts to QEMUMachine anthony.perard
  1 sibling, 0 replies; 3+ messages in thread
From: anthony.perard @ 2011-01-25 12:36 UTC (permalink / raw)
  To: QEMU-devel; +Cc: Anthony PERARD, Stefano Stabellini

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 colon. QEMU will try each one and use the first whose
works.

So,
./qemu -machine accel=xen:kvm:tcg

which would try Xen support first, then KVM and finally TCG if none of
the other works.

By default, QEMU will use TCG. But we can specify another default in the
global configuration file.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 arch_init.c     |    5 +++
 arch_init.h     |    1 +
 qemu-config.c   |   14 +++++++
 qemu-options.hx |   10 +++++
 vl.c            |  102 ++++++++++++++++++++++++++++++++++++++++++++++++------
 5 files changed, 120 insertions(+), 12 deletions(-)

diff --git a/arch_init.c b/arch_init.c
index cc56f0f..6c07a8c 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -707,6 +707,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 17c9164..a67edf5 100644
--- a/arch_init.h
+++ b/arch_init.h
@@ -28,6 +28,7 @@ void do_smbios_option(const char *optarg);
 void cpudef_init(void);
 int audio_available(void);
 void audio_init(qemu_irq *isa_pic, PCIBus *pci_bus);
+int tcg_available(void);
 int kvm_available(void);
 int xen_available(void);
 
diff --git a/qemu-config.c b/qemu-config.c
index 965fa46..bf004bb 100644
--- a/qemu-config.c
+++ b/qemu-config.c
@@ -445,6 +445,19 @@ QemuOptsList qemu_option_rom_opts = {
     },
 };
 
+static QemuOptsList qemu_machine_opts = {
+    .name = "machine",
+    .head = QTAILQ_HEAD_INITIALIZER(qemu_machine_opts.head),
+    .desc = {
+        {
+            .name = "accel",
+            .type = QEMU_OPT_STRING,
+            .help = "accelerator list",
+        },
+        { /* End of list */ }
+    },
+};
+
 static QemuOptsList *vm_config_groups[32] = {
     &qemu_drive_opts,
     &qemu_chardev_opts,
@@ -459,6 +472,7 @@ static QemuOptsList *vm_config_groups[32] = {
     &qemu_trace_opts,
 #endif
     &qemu_option_rom_opts,
+    &qemu_machine_opts,
     NULL,
 };
 
diff --git a/qemu-options.hx b/qemu-options.hx
index 898561d..18948d0 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -1986,6 +1986,16 @@ Enable KVM full virtualization support. This option is only available
 if KVM support is enabled when compiling.
 ETEXI
 
+DEF("machine", HAS_ARG, QEMU_OPTION_machine, \
+    "-machine accel=accel1[:accel2]    use an accelerator (kvm,xen,tcg), default is tcg\n", QEMU_ARCH_ALL)
+STEXI
+@item -machine accel=@var{accels}
+@findex -machine
+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 14255c4..6a62728 100644
--- a/vl.c
+++ b/vl.c
@@ -257,6 +257,7 @@ static NotifierList exit_notifiers =
 static NotifierList machine_init_done_notifiers =
     NOTIFIER_LIST_INITIALIZER(machine_init_done_notifiers);
 
+static int tcg_allowed = 1;
 int kvm_allowed = 0;
 uint32_t xen_domid;
 enum xen_mode xen_mode = XEN_EMULATE;
@@ -1822,6 +1823,82 @@ 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 configure_accelerator(void)
+{
+    const char *p = NULL;
+    char buf[10];
+    int i, ret;
+    bool accel_initalised = 0;
+    bool init_failed = 0;
+
+    QemuOptsList *list = qemu_find_opts("machine");
+    if (!QTAILQ_EMPTY(&list->head)) {
+        p = qemu_opt_get(QTAILQ_FIRST(&list->head), "accel");
+    }
+
+    if (p == NULL) {
+        /* Use the default "accelerator", tcg */
+        p = "tcg";
+    }
+
+    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);
@@ -2518,7 +2595,18 @@ int main(int argc, char **argv, char **envp)
                 do_smbios_option(optarg);
                 break;
             case QEMU_OPTION_enable_kvm:
-                kvm_allowed = 1;
+                olist = qemu_find_opts("machine");
+                qemu_opts_reset(olist);
+                qemu_opts_parse(olist, "accel=kvm", 0);
+                break;
+            case QEMU_OPTION_machine:
+                olist = qemu_find_opts("machine");
+                qemu_opts_reset(olist);
+                opts = qemu_opts_parse(olist, optarg, 0);
+                if (!opts) {
+                    fprintf(stderr, "parse error: %s\n", optarg);
+                    exit(1);
+                }
                 break;
             case QEMU_OPTION_usb:
                 usb_enabled = 1;
@@ -2835,17 +2923,7 @@ 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);
-        }
-    }
+    configure_accelerator();
 
     if (qemu_init_main_loop()) {
         fprintf(stderr, "qemu_init_main_loop failed\n");
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [Qemu-devel] [RESEND PATCH V3 2/2] machine, Add default_machine_opts to QEMUMachine.
  2011-01-25 12:36 [Qemu-devel] [RESEND PATCH V3 0/2] Introduce "machine" QemuOpts anthony.perard
  2011-01-25 12:36 ` [Qemu-devel] [RESEND PATCH V3 1/2] Introduce -machine command option anthony.perard
@ 2011-01-25 12:36 ` anthony.perard
  1 sibling, 0 replies; 3+ messages in thread
From: anthony.perard @ 2011-01-25 12:36 UTC (permalink / raw)
  To: QEMU-devel; +Cc: Anthony PERARD, Stefano Stabellini

From: Anthony PERARD <anthony.perard@citrix.com>

With this new field, we can specified which accelerator use to run the
machine, if the accelerator is not already specified by either a
configuration file or the command line options.

Currently, the only use will be made in the xenfv machine.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 hw/boards.h |    1 +
 vl.c        |   22 ++++++++++++++++++++++
 2 files changed, 23 insertions(+), 0 deletions(-)

diff --git a/hw/boards.h b/hw/boards.h
index 6f0f0d7..716fd7b 100644
--- a/hw/boards.h
+++ b/hw/boards.h
@@ -27,6 +27,7 @@ typedef struct QEMUMachine {
         no_cdrom:1,
         no_sdcard:1;
     int is_default;
+    const char *default_machine_opts;
     GlobalProperty *compat_props;
     struct QEMUMachine *next;
 } QEMUMachine;
diff --git a/vl.c b/vl.c
index 6a62728..626f4e1 100644
--- a/vl.c
+++ b/vl.c
@@ -2853,6 +2853,28 @@ int main(int argc, char **argv, char **envp)
         exit(1);
     }
 
+    /*
+     * Get the default machine options from the machine if it is not already
+     * specified either by the configuration file or by the command line.
+     */
+    if (machine->default_machine_opts) {
+        QemuOptsList *list = qemu_find_opts("machine");
+        const char *p = NULL;
+
+        if (!QTAILQ_EMPTY(&list->head)) {
+            p = qemu_opt_get(QTAILQ_FIRST(&list->head), "accel");
+        }
+        if (p == NULL) {
+            opts = qemu_opts_parse(qemu_find_opts("machine"),
+                                   machine->default_machine_opts, 0);
+            if (!opts) {
+                fprintf(stderr, "parse error for machine %s: %s\n",
+                        machine->name, machine->default_machine_opts);
+                exit(1);
+            }
+        }
+    }
+
     qemu_opts_foreach(qemu_find_opts("device"), default_driver_check, NULL, 0);
     qemu_opts_foreach(qemu_find_opts("global"), default_driver_check, NULL, 0);
 
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2011-01-25 12:36 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-01-25 12:36 [Qemu-devel] [RESEND PATCH V3 0/2] Introduce "machine" QemuOpts anthony.perard
2011-01-25 12:36 ` [Qemu-devel] [RESEND PATCH V3 1/2] Introduce -machine command option anthony.perard
2011-01-25 12:36 ` [Qemu-devel] [RESEND PATCH V3 2/2] machine, Add default_machine_opts to QEMUMachine anthony.perard

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.