[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |