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

[Xen-devel] [PATCH 5 of 9] libxl: wait for devices to initialize upon addition to the domain



# HG changeset patch
# User Roger Pau Monne <roger.pau@xxxxxxxxxxxxx>
# Date 1318592310 -7200
# Node ID d14479efe33c3955dcf41783a1b02c8d2bb572e6
# Parent  0235e192a519e29ac3d77e91fe59b38e6a6f06ef
libxl: wait for devices to initialize upon addition to the domain.

Block waiting for devices to initialize (switch to state 2).

Signed-off-by: Roger Pau Monne <roger.pau@xxxxxxxxxxxxx>

diff -r 0235e192a519 -r d14479efe33c tools/libxl/libxl.c
--- a/tools/libxl/libxl.c       Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/libxl/libxl.c       Fri Oct 14 13:38:30 2011 +0200
@@ -1070,6 +1070,11 @@ int libxl_device_disk_add(libxl_ctx *ctx
                              libxl__xs_kvs_of_flexarray(&gc, back, 
back->count),
                              libxl__xs_kvs_of_flexarray(&gc, front, 
front->count));
 
+    if (libxl__wait_for_device_initialization(&gc, &device) < 0) {
+        rc = -1;
+        goto out_free;
+    }
+
     rc = 0;
 
 out_free:
@@ -1513,7 +1518,11 @@ int libxl_device_nic_add(libxl_ctx *ctx,
                              libxl__xs_kvs_of_flexarray(&gc, back, 
back->count),
                              libxl__xs_kvs_of_flexarray(&gc, front, 
front->count));
 
-    /* FIXME: wait for plug */
+    if (libxl__wait_for_device_initialization(&gc, &device) < 0) {
+        rc = -1;
+        goto out_free;
+    }
+
     rc = 0;
 out_free:
     flexarray_free(back);
diff -r 0235e192a519 -r d14479efe33c tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c        Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/libxl/libxl_device.c        Fri Oct 14 13:38:30 2011 +0200
@@ -366,6 +366,38 @@ int libxl__device_disk_dev_number(const 
     return -1;
 }
 
+int libxl__wait_for_device_initialization(libxl__gc *gc, libxl__device *device)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    char *be_path = libxl__device_backend_path(gc, device);
+    char *state_path = libxl__sprintf(gc, "%s/state", be_path);
+    char *state = libxl__xs_read(gc, XBT_NULL, state_path);
+    int rc = -1;
+    char **l1 = NULL;
+    unsigned int n;
+    
+    if (atoi(state) == 2) {
+        rc = 0;
+        goto out;
+    }
+
+    xs_watch(ctx->xsh, state_path, be_path);
+    while (atoi(state) != 2) {
+        l1 = xs_read_watch(ctx->xsh, &n);
+        if (l1 == NULL) {
+            goto out;
+        }
+        state = libxl__xs_read(gc, XBT_NULL, l1[XS_WATCH_PATH]);
+        if (state == NULL) {
+            goto out;
+        }
+    }
+    rc = 0;
+
+out:
+    return rc;
+}
+
 static int wait_for_dev_destroy(libxl__gc *gc, struct timeval *tv)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
diff -r 0235e192a519 -r d14479efe33c tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h      Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/libxl/libxl_internal.h      Fri Oct 14 13:38:30 2011 +0200
@@ -231,7 +231,7 @@ _hidden int libxl__device_disk_set_backe
 _hidden int libxl__device_physdisk_major_minor(const char *physpath, int 
*major, int *minor);
 _hidden int libxl__device_disk_dev_number(const char *virtpath,
                                           int *pdisk, int *ppartition);
-
+_hidden int libxl__wait_for_device_initialization(libxl__gc *gc, libxl__device 
*device);
 _hidden int libxl__device_console_add(libxl__gc *gc, uint32_t domid,
                                       libxl_device_console *console,
                                       libxl__domain_build_state *state);

_______________________________________________
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®.