libxl: introduce libxl_need_xenpv_qemu
authorStefano Stabellini <stefano.stabellini@eu.citrix.com>
Tue, 14 Dec 2010 18:55:53 +0000 (18:55 +0000)
committerStefano Stabellini <stefano.stabellini@eu.citrix.com>
Tue, 14 Dec 2010 18:55:53 +0000 (18:55 +0000)
Introduce libxl_need_xenpv_qemu to detect if the caller needs to create
a pv qemu instance (using libxl_create_xenpv_qemu).
A positive reply depends on the number of pv console and vfbs, and the
type of disk backends.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
tools/libxl/libxl.c
tools/libxl/libxl.h
tools/libxl/xl_cmdimpl.c

index eb085a26fd86f75a93c4d9291441312d82b3e629..516589c35eb1aa01a3e3952fd845ee8d0e26b90d 100644 (file)
@@ -2654,6 +2654,39 @@ static int libxl_build_xenpv_qemu_args(libxl__gc *gc,
     return 0;
 }
 
+int libxl_need_xenpv_qemu(libxl_ctx *ctx,
+        int nr_consoles, libxl_device_console *consoles,
+        int nr_vfbs, libxl_device_vfb *vfbs,
+        int nr_disks, libxl_device_disk *disks)
+{
+    int i, ret = 0;
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+
+    if (nr_consoles > 1) {
+        ret = 1;
+        goto out;
+    }
+
+    for (i = 0; i < nr_consoles; i++) {
+        if (consoles[i].consback == LIBXL_CONSBACK_IOEMU) {
+            ret = 1;
+            goto out;
+        }
+    }
+
+    if (nr_vfbs > 0) {
+        ret = 1;
+        goto out;
+    }
+
+    if (nr_disks > 0 && !libxl__blktap_enabled(&gc))
+        ret = 1;
+
+out:
+    libxl__free_all(&gc);
+    return ret;
+}
+
 int libxl_create_xenpv_qemu(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb,
                             libxl_device_model_starting **starting_r)
 {
index 2ced9824bc4f34d48f233cc9a354a80669f9526c..2a276c30886504be973392eb45cc8c5991bb55dd 100644 (file)
@@ -376,6 +376,10 @@ int libxl_create_device_model(libxl_ctx *ctx,
                               libxl_device_model_starting **starting_r);
 int libxl_create_xenpv_qemu(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb,
                             libxl_device_model_starting **starting_r);
+int libxl_need_xenpv_qemu(libxl_ctx *ctx,
+        int nr_consoles, libxl_device_console *consoles,
+        int nr_vfbs, libxl_device_vfb *vfbs,
+        int nr_disks, libxl_device_disk *disks);
   /* Caller must either: pass starting_r==0, or on successful
    * return pass *starting_r (which will be non-0) to
    * libxl_confirm_device_model or libxl_detach_device_model. */
index 555531922a7635767b24a0c99e0af676669143ba..a0d5da0826cfd9d3ba3e7ed0d9b30a3ad83ca788 100644 (file)
@@ -1675,6 +1675,7 @@ start:
                                         d_config.vifs, d_config.num_vifs,
                                         &dm_starting) );
     } else {
+        int need_qemu = 0;
         libxl_device_console console;
 
         for (i = 0; i < d_config.num_vfbs; i++) {
@@ -1686,12 +1687,18 @@ start:
 
         init_console_info(&console, 0, &state);
         console.domid = domid;
-        if (d_config.num_vfbs)
+
+        need_qemu = libxl_need_xenpv_qemu(&ctx, 1, &console,
+                d_config.num_vfbs, d_config.vfbs,
+                d_config.num_disks, &d_config.disks[0]);
+
+        if (need_qemu)
              console.consback = LIBXL_CONSBACK_IOEMU;
+
         libxl_device_console_add(&ctx, domid, &console);
         libxl_device_console_destroy(&console);
 
-        if (d_config.num_vfbs)
+        if (need_qemu)
             libxl_create_xenpv_qemu(&ctx, domid, d_config.vfbs, &dm_starting);
     }