From d82a726d153bdd9de98cdab27ed2f4e1d8eb47a1 Mon Sep 17 00:00:00 2001 From: Roger Pau Monne Date: Thu, 26 Jul 2012 16:47:37 +0100 Subject: libxl: convert libxl_device_vfb_add to an async operation Split libxl_device_vfb_add into libxl__device_vfb_add (to be used inside already running ao's), and make libxl_device_vfb_add a stub to call libxl__device_vfb_add. Signed-off-by: Roger Pau Monne Acked-by: Ian Jackson Committed-by: Ian Campbell --- tools/libxl/libxl.c | 21 ++++++++++++++++++--- tools/libxl/libxl.h | 3 ++- tools/libxl/libxl_create.c | 3 +-- tools/libxl/libxl_dm.c | 2 +- tools/libxl/libxl_internal.h | 4 ++++ tools/ocaml/libs/xl/xenlight_stubs.c | 2 +- 6 files changed, 27 insertions(+), 8 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 5a2c6e1974..00ddc0ec80 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -3019,9 +3019,25 @@ static int libxl__device_from_vfb(libxl__gc *gc, uint32_t domid, return 0; } -int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb) +int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb, + const libxl_asyncop_how *ao_how) +{ + AO_CREATE(ctx, domid, ao_how); + int rc; + + rc = libxl__device_vfb_add(gc, domid, vfb); + if (rc) { + LOG(ERROR, "unable to add vfb device"); + goto out; + } + +out: + libxl__ao_complete(egc, ao, rc); + return AO_INPROGRESS; +} + +int libxl__device_vfb_add(libxl__gc *gc, uint32_t domid, libxl_device_vfb *vfb) { - GC_INIT(ctx); flexarray_t *front; flexarray_t *back; libxl__device device; @@ -3079,7 +3095,6 @@ out_free: flexarray_free(front); flexarray_free(back); out: - GC_FREE; return rc; } diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 70a1e78199..e1a729693b 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -721,7 +721,8 @@ int libxl_device_vkb_destroy(libxl_ctx *ctx, uint32_t domid, const libxl_asyncop_how *ao_how); /* Framebuffer */ -int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb); +int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb, + const libxl_asyncop_how *ao_how); int libxl_device_vfb_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb, const libxl_asyncop_how *ao_how); diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index a9704dee65..aafacd8c85 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -932,7 +932,6 @@ static void domcreate_launch_dm(libxl__egc *egc, libxl__ao_devices *aodevs, const uint32_t domid = dcs->guest_domid; libxl_domain_config *const d_config = dcs->guest_config; libxl__domain_build_state *const state = &dcs->build_state; - libxl_ctx *const ctx = CTX; if (ret) { LOG(ERROR, "unable to add disk devices"); @@ -976,7 +975,7 @@ static void domcreate_launch_dm(libxl__egc *egc, libxl__ao_devices *aodevs, libxl__device_console console; for (i = 0; i < d_config->num_vfbs; i++) { - libxl_device_vfb_add(ctx, domid, &d_config->vfbs[i]); + libxl__device_vfb_add(gc, domid, &d_config->vfbs[i]); libxl__device_vkb_add(gc, domid, &d_config->vkbs[i]); } diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c index 47a812fd62..f2e9572bfa 100644 --- a/tools/libxl/libxl_dm.c +++ b/tools/libxl/libxl_dm.c @@ -902,7 +902,7 @@ static void spawn_stub_launch_dm(libxl__egc *egc, if (ret) goto out; } - ret = libxl_device_vfb_add(ctx, dm_domid, &dm_config->vfbs[0]); + ret = libxl__device_vfb_add(gc, dm_domid, &dm_config->vfbs[0]); if (ret) goto out; ret = libxl__device_vkb_add(gc, dm_domid, &dm_config->vkbs[0]); diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index b617df0482..cfb35ab4a9 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1953,6 +1953,10 @@ _hidden void libxl__device_nic_add(libxl__egc *egc, uint32_t domid, _hidden int libxl__device_vkb_add(libxl__gc *gc, uint32_t domid, libxl_device_vkb *vkb); +/* Internal function to connect a vfb device */ +_hidden int libxl__device_vfb_add(libxl__gc *gc, uint32_t domid, + libxl_device_vfb *vfb); + /* Waits for the passed device to reach state XenbusStateInitWait. * This is not really useful by itself, but is important when executing * hotplug scripts, since we need to be sure the device is in the correct diff --git a/tools/ocaml/libs/xl/xenlight_stubs.c b/tools/ocaml/libs/xl/xenlight_stubs.c index 3d2493bfc0..adda67f54f 100644 --- a/tools/ocaml/libs/xl/xenlight_stubs.c +++ b/tools/ocaml/libs/xl/xenlight_stubs.c @@ -369,7 +369,7 @@ value stub_xl_device_vfb_add(value info, value domid) device_vfb_val(&gc, &lg, &c_info, info); INIT_CTX(); - ret = libxl_device_vfb_add(ctx, Int_val(domid), &c_info); + ret = libxl_device_vfb_add(ctx, Int_val(domid), &c_info, 0); if (ret != 0) failwith_xl("vfb_add", &lg); FREE_CTX(); -- cgit v1.2.3