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

[Xen-devel] [PATCH 3 of 4] libxl: support multiple consoles



This patch modifies libxenlight to support multiple consoles and
separates the xenstore paths for pv and serial consoles:

- rename libxl_console_constype to libxl_console_consback: constype is
used to to specify whether qemu or xenconsoled provides the backend, so I
renamed it to libxl_console_consback to make it more obvious that we are
talking about backends;

- add a new libxl_console_constype to specify if the console is an
emulated serial or a pv console;

- support the new xenconsole "type" command line parameter;

- use the "output" node under console in xenstore to tell qemu where do we
want the output of this pv console to go;


Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>


diff -r 6b28b2dac7dd tools/libxl/libxl.c
--- a/tools/libxl/libxl.c       Thu Aug 05 11:36:24 2010 +0100
+++ b/tools/libxl/libxl.c       Mon Aug 09 14:26:22 2010 +0100
@@ -884,21 +884,31 @@ int libxl_domain_destroy(libxl_ctx *ctx,
     return 0;
 }
 
-int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num)
+int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num, 
libxl_console_constype type)
 {
     char *p = libxl_sprintf(ctx, "%s/xenconsole", libxl_private_bindir_path());
     char *domid_s = libxl_sprintf(ctx, "%d", domid);
     char *cons_num_s = libxl_sprintf(ctx, "%d", cons_num);
-    return execl(p, p, domid_s, "--num", cons_num_s, (void *)NULL) == 0 ? 0 : 
ERROR_FAIL;
+    char *cons_type_s;
+    
+    if (type == LIBXL_CONSTYPE_PV)
+        cons_type_s = "pv";
+    else
+        cons_type_s = "serial";
+    return execl(p, p, domid_s, "--num", cons_num_s, "--type", cons_type_s, 
(void *)NULL) == 0 ? 0 : ERROR_FAIL;
 }
 
 int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm)
 {
     uint32_t stubdomid = libxl_get_stubdom_id(ctx, domid_vm);
     if (stubdomid)
-        return libxl_console_exec(ctx, stubdomid, 1);
-    else
-        return libxl_console_exec(ctx, domid_vm, 0);
+        return libxl_console_exec(ctx, stubdomid, 1, LIBXL_CONSTYPE_PV);
+    else {
+        if (is_hvm(ctx, domid_vm))
+            return libxl_console_exec(ctx, domid_vm, 0, LIBXL_CONSTYPE_SERIAL);
+        else
+            return libxl_console_exec(ctx, domid_vm, 0, LIBXL_CONSTYPE_PV);
+    }
 }
 
 int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass)
@@ -1292,14 +1302,21 @@ retry_transaction:
 
     for (i = 0; i < num_console; i++) {
         console[i].devid = i;
-        console[i].constype = CONSTYPE_IOEMU;
+        console[i].consback = LIBXL_CONSBACK_IOEMU;
         console[i].domid = domid;
-        if (!i)
+        if (!i) {
+            char *filename;
+            char *name = libxl_sprintf(ctx, "qemu-dm-%s", 
libxl_domid_to_name(ctx, info->domid));
+            libxl_create_logfile(ctx, name, &filename);
+            console[i].output = libxl_sprintf(ctx, "file:%s", filename);
             console[i].build_state = &state;
+            free(filename);
+        } else
+            console[i].output = "pty";
         ret = libxl_device_console_add(ctx, domid, &console[i]);
         if (ret) return ret;
     }
-    if (libxl_create_xenpv_qemu(ctx, vfb, num_console, console, &dm_starting) 
< 0) {
+    if (libxl_create_xenpv_qemu(ctx, domid, vfb, &dm_starting) < 0) {
         free(args);
         return ERROR_FAIL;
     }
@@ -1978,7 +1995,7 @@ int libxl_device_console_add(libxl_ctx *
 
     if (console->build_state) {
         xs_transaction_t t;
-        char **ents = (char **) libxl_calloc(ctx, 9, sizeof(char *));
+        char **ents = (char **) libxl_calloc(ctx, 11, sizeof(char *));
         ents[0] = "console/port";
         ents[1] = libxl_sprintf(ctx, "%"PRIu32, 
console->build_state->console_port);
         ents[2] = "console/ring-ref";
@@ -1986,10 +2003,12 @@ int libxl_device_console_add(libxl_ctx *
         ents[4] = "console/limit";
         ents[5] = libxl_sprintf(ctx, "%d", LIBXL_XENCONSOLE_LIMIT);
         ents[6] = "console/type";
-        if (console->constype == CONSTYPE_XENCONSOLED)
+        if (console->consback == LIBXL_CONSBACK_XENCONSOLED)
             ents[7] = "xenconsoled";
         else
             ents[7] = "ioemu";
+        ents[8] = "console/output";
+        ents[9] = console->output;
 retry_transaction:
         t = xs_transaction_start(ctx->xsh);
         libxl_xs_writev(ctx, t, libxl_xs_get_dompath(ctx, console->domid), 
ents);
@@ -2032,10 +2051,12 @@ retry_transaction:
     flexarray_set(front, foffset++, "protocol");
     flexarray_set(front, foffset++, LIBXL_XENCONSOLE_PROTOCOL);
     flexarray_set(front, foffset++, "type");
-    if (console->constype == CONSTYPE_XENCONSOLED)
+    if (console->consback == LIBXL_CONSBACK_XENCONSOLED)
         flexarray_set(front, foffset++, "xenconsoled");
     else
         flexarray_set(front, foffset++, "ioemu");
+    flexarray_set(front, foffset++, "output");
+    flexarray_set(front, foffset++, console->output);
 
     libxl_device_generic_add(ctx, &device,
                              libxl_xs_kvs_of_flexarray(ctx, back, boffset),
@@ -2226,64 +2247,39 @@ int libxl_cdrom_insert(libxl_ctx *ctx, u
 
 
/******************************************************************************/
 static int libxl_build_xenpv_qemu_args(libxl_ctx *ctx,
+                                       uint32_t domid,
                                        libxl_device_vfb *vfb,
-                                       int num_console,
-                                       libxl_device_console *console,
                                        libxl_device_model_info *info)
 {
-    int i = 0, j = 0, num = 0;
     memset(info, 0x00, sizeof(libxl_device_model_info));
 
-    info->vnc = vfb->vnc;
-    if (vfb->vnclisten)
-        info->vnclisten = libxl_strdup(ctx, vfb->vnclisten);
-    info->vncdisplay = vfb->vncdisplay;
-    info->vncunused = vfb->vncunused;
-    if (vfb->vncpasswd)
-        info->vncpasswd = vfb->vncpasswd;
-    if (vfb->keymap)
-        info->keymap = libxl_strdup(ctx, vfb->keymap);
-    info->sdl = vfb->sdl;
-    info->opengl = vfb->opengl;
-    for (i = 0; i < num_console; i++) {
-        if (console->constype == CONSTYPE_IOEMU)
-            num++;
-    }
-    if (num > 0) {
-        uint32_t guest_domid;
-        if (libxl_is_stubdom(ctx, vfb->domid, &guest_domid)) {
-            char *filename;
-            char *name = libxl_sprintf(ctx, "qemu-dm-%s", 
libxl_domid_to_name(ctx, guest_domid));
-            libxl_create_logfile(ctx, name, &filename);
-            info->serial = libxl_sprintf(ctx, "file:%s", filename);
-            free(filename);
-        } else {
-            info->serial = "pty";
-        }
-        num--;
-    }
-    if (num > 0) {
-        info->extra = (char **) libxl_calloc(ctx, num * 2 + 1, sizeof(char *));
-        for (j = 0; j < num * 2; j = j + 2) {
-            info->extra[j] = "-serial";
-            info->extra[j + 1] = "pty";
-        }
-        info->extra[j] = NULL;
-    }
-    info->domid = vfb->domid;
-    info->dom_name = libxl_domid_to_name(ctx, vfb->domid);
+    if (vfb != NULL) {
+        info->vnc = vfb->vnc;
+        if (vfb->vnclisten)
+            info->vnclisten = libxl_strdup(ctx, vfb->vnclisten);
+        info->vncdisplay = vfb->vncdisplay;
+        info->vncunused = vfb->vncunused;
+        if (vfb->vncpasswd)
+            info->vncpasswd = vfb->vncpasswd;
+        if (vfb->keymap)
+            info->keymap = libxl_strdup(ctx, vfb->keymap);
+        info->sdl = vfb->sdl;
+        info->opengl = vfb->opengl;
+    } else
+        info->nographic = 1;
+    info->domid = domid;
+    info->dom_name = libxl_domid_to_name(ctx, domid);
     info->device_model = libxl_abs_path(ctx, "qemu-dm", libxl_libexec_path());
     info->type = XENPV;
     return 0;
 }
 
-int libxl_create_xenpv_qemu(libxl_ctx *ctx, libxl_device_vfb *vfb,
-                            int num_console, libxl_device_console *console,
+int libxl_create_xenpv_qemu(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb 
*vfb,
                             libxl_device_model_starting **starting_r)
 {
     libxl_device_model_info info;
 
-    libxl_build_xenpv_qemu_args(ctx, vfb, num_console, console, &info);
+    libxl_build_xenpv_qemu_args(ctx, domid, vfb, &info);
     libxl_create_device_model(ctx, &info, NULL, 0, NULL, 0, starting_r);
     return 0;
 }
diff -r 6b28b2dac7dd tools/libxl/libxl.h
--- a/tools/libxl/libxl.h       Thu Aug 05 11:36:24 2010 +0100
+++ b/tools/libxl/libxl.h       Mon Aug 09 14:26:22 2010 +0100
@@ -229,16 +229,22 @@ typedef struct {
 } libxl_device_vkb;
 
 typedef enum {
-    CONSTYPE_XENCONSOLED,
-    CONSTYPE_IOEMU,
+    LIBXL_CONSTYPE_SERIAL,
+    LIBXL_CONSTYPE_PV,
 } libxl_console_constype;
 
+typedef enum {
+    LIBXL_CONSBACK_XENCONSOLED,
+    LIBXL_CONSBACK_IOEMU,
+} libxl_console_consback;
+
 typedef struct {
     uint32_t backend_domid;
     uint32_t domid;
     int devid;
-    libxl_console_constype constype;
+    libxl_console_consback consback;
     libxl_domain_build_state *build_state;
+    char *output;
 } libxl_device_console;
 
 typedef enum {
@@ -434,7 +440,7 @@ int libxl_domain_setmaxmem(libxl_ctx *ct
 int libxl_set_memory_target(libxl_ctx *ctx, uint32_t domid, uint32_t 
target_memkb, int enforce);
 
 int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass);
-int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num);
+int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num, 
libxl_console_constype type);
 /* libxl_primary_console_exec finds the domid and console number
  * corresponding to the primary console of the given vm, then calls
  * libxl_console_exec with the right arguments (domid might be different
@@ -456,8 +462,7 @@ int libxl_create_device_model(libxl_ctx 
                               libxl_device_disk *disk, int num_disks,
                               libxl_device_nic *vifs, int num_vifs,
                               libxl_device_model_starting **starting_r);
-int libxl_create_xenpv_qemu(libxl_ctx *ctx, libxl_device_vfb *vfb,
-                            int num_console, libxl_device_console *console,
+int libxl_create_xenpv_qemu(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb 
*vfb,
                             libxl_device_model_starting **starting_r);
   /* Caller must either: pass starting_r==0, or on successful
    * return pass *starting_r (which will be non-0) to
diff -r 6b28b2dac7dd tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c  Thu Aug 05 11:36:24 2010 +0100
+++ b/tools/libxl/xl_cmdimpl.c  Mon Aug 09 14:26:22 2010 +0100
@@ -370,7 +370,8 @@ static void init_console_info(libxl_devi
 {
     memset(console, 0x00, sizeof(libxl_device_console));
     console->devid = dev_num;
-    console->constype = CONSTYPE_XENCONSOLED;
+    console->consback = LIBXL_CONSBACK_XENCONSOLED;
+    console->output = "pty";
     if (state)
         console->build_state = state;
 }
@@ -1435,6 +1436,7 @@ start:
     if (d_config.c_info.hvm) {
         init_console_info(&console, 0, &state);
         console.domid = domid;
+        console.consback = LIBXL_CONSBACK_IOEMU;
         libxl_device_console_add(&ctx, domid, &console);
         dm_info.domid = domid;
         MUST( libxl_create_device_model(&ctx, &dm_info,
@@ -1451,10 +1453,10 @@ start:
         init_console_info(&console, 0, &state);
         console.domid = domid;
         if (d_config.num_vfbs)
-            console.constype = CONSTYPE_IOEMU;
+             console.consback = LIBXL_CONSBACK_IOEMU;
         libxl_device_console_add(&ctx, domid, &console);
         if (d_config.num_vfbs)
-            libxl_create_xenpv_qemu(&ctx, d_config.vfbs, 1, &console, 
&dm_starting);
+            libxl_create_xenpv_qemu(&ctx, domid, d_config.vfbs, &dm_starting);
     }
 
     if (dm_starting)
@@ -1849,13 +1851,27 @@ int main_cd_insert(int argc, char **argv
 
 int main_console(int argc, char **argv)
 {
-    int opt = 0;
-
-    while ((opt = getopt(argc, argv, "hn:")) != -1) {
+    int opt = 0, num = 0;
+    libxl_console_constype type = -1;
+
+    while ((opt = getopt(argc, argv, "hn:t:")) != -1) {
         switch (opt) {
         case 'h':
             help("console");
             return 0;
+        case 't':
+            if (!strcmp(optarg, "pv"))
+                type = LIBXL_CONSTYPE_PV;
+            else if (!strcmp(optarg, "serial"))
+                type = LIBXL_CONSTYPE_SERIAL;
+            else {
+                fprintf(stderr, "console type supported are: pv, serial\n");
+                return 2;
+            }
+            break;
+        case 'n':
+            num = atoi(optarg);
+            break;
         default:
             fprintf(stderr, "option not supported\n");
             break;
@@ -1867,7 +1883,10 @@ int main_console(int argc, char **argv)
     }
 
     find_domain(argv[optind]);
-    libxl_primary_console_exec(&ctx, domid);
+    if (type <= 0 && num == 0)
+        libxl_primary_console_exec(&ctx, domid);
+    else
+        libxl_console_exec(&ctx, domid, num, type);
     fprintf(stderr, "Unable to attach console\n");
     return 1;
 }
diff -r 6b28b2dac7dd tools/libxl/xl_cmdtable.c
--- a/tools/libxl/xl_cmdtable.c Thu Aug 05 11:36:24 2010 +0100
+++ b/tools/libxl/xl_cmdtable.c Mon Aug 09 14:26:22 2010 +0100
@@ -86,7 +86,9 @@ struct cmd_spec cmd_table[] = {
     { "console",
       &main_console,
       "Attach to domain's console",
-      "<Domain>",
+      "[options] <Domain>\n"
+      "-t <type>       console type, pv or serial\n"
+      "-n <number>     console number"
     },
     { "vncviewer",
       &main_vncviewer,

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.