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

[Xen-changelog] [xen-unstable] libxenlight: wait for pv qemu initialization



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1259676222 0
# Node ID fef6d531f04fcea53da4e5b4dee0e8a30ece4974
# Parent  14d9fb7a326211eda1dbda07eb995e0b04cf678d
libxenlight: wait for pv qemu initialization

this patch makes libxl_create_stubdom wait for pv qemu to be properly
initialized before unpausing the stubdom.
A new libxl_device_model_starting pointer is used to wait for pv qemu
initialization while the libxl_device_model_starting pointer given by
the user is initialized to a new structure with an empty for_spawn
member, because nothing that was spawn has to be waited for anymore.

Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
---
 tools/libxl/libxl.c          |   55 +++++++++++++++++++++++++------------------
 tools/libxl/libxl_exec.c     |    7 +++--
 tools/libxl/libxl_internal.h |    8 +++++-
 3 files changed, 43 insertions(+), 27 deletions(-)

diff -r 14d9fb7a3262 -r fef6d531f04f tools/libxl/libxl.c
--- a/tools/libxl/libxl.c       Tue Dec 01 14:02:00 2009 +0000
+++ b/tools/libxl/libxl.c       Tue Dec 01 14:03:42 2009 +0000
@@ -651,12 +651,6 @@ static char ** libxl_build_device_model_
     return (char **) flexarray_contents(dm_args);
 }
 
-struct libxl_device_model_starting {
-    struct libxl_spawn_starting for_spawn; /* first! */
-    char *dom_path; /* from libxl_malloc, only for dm_xenstore_record_pid */
-    int domid;
-};
-
 void dm_xenstore_record_pid(struct libxl_ctx *ctx, void *for_spawn,
                             pid_t innerchild) {
     struct libxl_device_model_starting *starting = for_spawn;
@@ -675,6 +669,7 @@ void dm_xenstore_record_pid(struct libxl
     if (rc) XL_LOG_ERRNO(ctx, XL_LOG_ERROR,
                          "Couldn't record device model pid %ld at %s/%s",
                          (unsigned long)innerchild, starting->dom_path, kvs);
+    xs_daemon_close(clone.xsh);
 }
 
 static int libxl_vfb_and_vkb_from_device_model_info(struct libxl_ctx *ctx,
@@ -765,6 +760,7 @@ static int libxl_create_stubdom(struct l
     xen_uuid_t uuid[16];
     struct xs_permissions perm[2];
     xs_transaction_t t;
+    libxl_device_model_starting *dm_starting = 0;
 
     args = libxl_build_device_model_args(ctx, info, vifs, num_vifs);
     if (!args)
@@ -833,9 +829,23 @@ retry_transaction:
         console[i].constype = CONSTYPE_IOEMU;
         libxl_device_console_add(ctx, domid, &console[i]);
     }
-    libxl_create_xenpv_qemu(ctx, vfb, num_console, console, starting_r);
+    if (libxl_create_xenpv_qemu(ctx, vfb, num_console, console, &dm_starting) 
< 0) {
+        free(args);
+        return -1;
+    }
+    if (libxl_confirm_device_model_startup(ctx, dm_starting) < 0) {
+        free(args);
+        return -1;
+    }
 
     libxl_domain_unpause(ctx, domid);
+
+    if (starting_r) {
+        *starting_r = libxl_calloc(ctx, sizeof(libxl_device_model_starting), 
1);
+        (*starting_r)->domid = domid;
+        (*starting_r)->dom_path = libxl_xs_get_dompath(ctx, info->domid);
+        (*starting_r)->for_spawn = NULL;
+    }
 
     free(args);
     return 0;
@@ -851,7 +861,7 @@ int libxl_create_device_model(struct lib
     int logfile_w, null;
     int rc;
     char **args;
-    struct libxl_spawn_starting buf_spawn, *for_spawn;
+    struct libxl_device_model_starting buf_starting, *p;
 
     if (strstr(info->device_model, "stubdom-dm")) {
         libxl_device_vfb vfb;
@@ -860,8 +870,6 @@ int libxl_create_device_model(struct lib
         libxl_vfb_and_vkb_from_device_model_info(ctx, info, &vfb, &vkb);
         return libxl_create_stubdom(ctx, info, disks, num_disks, vifs, 
num_vifs, &vfb, &vkb, starting_r);
     }
-
-    *starting_r= 0;
 
     args = libxl_build_device_model_args(ctx, info, vifs, num_vifs);
     if (!args)
@@ -877,19 +885,19 @@ int libxl_create_device_model(struct lib
 
     if (starting_r) {
         rc = ERROR_NOMEM;
-        *starting_r= libxl_calloc(ctx, sizeof(**starting_r), 1);
+        *starting_r = libxl_calloc(ctx, sizeof(libxl_device_model_starting), 
1);
         if (!*starting_r) goto xit;
-        (*starting_r)->domid= info->domid;
-
-        (*starting_r)->dom_path = libxl_xs_get_dompath(ctx, info->domid);
-        if (!(*starting_r)->dom_path) { free(*starting_r); return ERROR_FAIL; }
-
-        for_spawn= &(*starting_r)->for_spawn;
+        p = *starting_r;
     } else {
-        for_spawn= &buf_spawn;
-    }
-    rc = libxl_spawn_spawn(ctx, for_spawn, "device model",
-                           dm_xenstore_record_pid);
+        p = &buf_starting;
+        p->for_spawn = NULL;
+    }
+
+    p->domid = info->domid;
+    p->dom_path = libxl_xs_get_dompath(ctx, info->domid);
+    if (!p->dom_path) { libxl_free(ctx, p); return ERROR_FAIL; }
+
+    rc = libxl_spawn_spawn(ctx, p, "device model", dm_xenstore_record_pid);
     if (rc < 0) goto xit;
     if (!rc) { /* inner child */
         libxl_exec(ctx, null, logfile_w, logfile_w,
@@ -908,7 +916,8 @@ int libxl_detach_device_model(struct lib
 int libxl_detach_device_model(struct libxl_ctx *ctx,
                               libxl_device_model_starting *starting) {
     int rc;
-    rc = libxl_spawn_detach(ctx, &starting->for_spawn);
+    rc = libxl_spawn_detach(ctx, starting->for_spawn);
+    if (starting->for_spawn) libxl_free(ctx, starting->for_spawn);
     libxl_free(ctx, starting);
     return rc;
 }
@@ -918,7 +927,7 @@ int libxl_confirm_device_model_startup(s
                                        libxl_device_model_starting *starting) {
     int problem = libxl_wait_for_device_model(ctx, starting->domid, "running",
                                               libxl_spawn_check,
-                                              &starting->for_spawn);
+                                              starting->for_spawn);
     int detach = libxl_detach_device_model(ctx, starting);
     return problem ? problem : detach;
     return 0;
diff -r 14d9fb7a3262 -r fef6d531f04f tools/libxl/libxl_exec.c
--- a/tools/libxl/libxl_exec.c  Tue Dec 01 14:02:00 2009 +0000
+++ b/tools/libxl/libxl_exec.c  Tue Dec 01 14:03:42 2009 +0000
@@ -99,7 +99,7 @@ pid_t libxl_waitpid_instead_default(pid_
 
 
 int libxl_spawn_spawn(struct libxl_ctx *ctx,
-                      struct libxl_spawn_starting *for_spawn,
+                      libxl_device_model_starting *starting,
                       const char *what,
                       void (*intermediate_hook)(struct libxl_ctx *ctx,
                                                 void *for_spawn,
@@ -107,9 +107,10 @@ int libxl_spawn_spawn(struct libxl_ctx *
     pid_t child, got;
     int status;
     pid_t intermediate;
+    struct libxl_spawn_starting *for_spawn = starting->for_spawn;
 
     if (for_spawn) {
-        for_spawn->what= strdup(what);
+        for_spawn->what= libxl_sprintf(ctx, "%s", what);
         if (!for_spawn->what) return ERROR_NOMEM;
     }
 
@@ -130,7 +131,7 @@ int libxl_spawn_spawn(struct libxl_ctx *
     if (!child) return 0; /* caller runs child code */
     if (child<0) exit(255);
 
-    intermediate_hook(ctx, for_spawn, child);
+    intermediate_hook(ctx, starting, child);
 
     if (!for_spawn) _exit(0); /* just detach then */
 
diff -r 14d9fb7a3262 -r fef6d531f04f tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h      Tue Dec 01 14:02:00 2009 +0000
+++ b/tools/libxl/libxl_internal.h      Tue Dec 01 14:03:42 2009 +0000
@@ -133,8 +133,14 @@ struct libxl_spawn_starting {
     char *what; /* malloc'd in spawn_spawn */
 };
 
+struct libxl_device_model_starting {
+    struct libxl_spawn_starting *for_spawn; /* first! */
+    char *dom_path; /* from libxl_malloc, only for dm_xenstore_record_pid */
+    int domid;
+};
+
 int libxl_spawn_spawn(struct libxl_ctx *ctx,
-                      struct libxl_spawn_starting *for_spawn,
+                      libxl_device_model_starting *starting,
                       const char *what,
                       void (*intermediate_hook)(struct libxl_ctx *ctx,
                                                 void *for_spawn,

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


 


Rackspace

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