diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/libxl/libxl.h | 19 | ||||
-rw-r--r-- | tools/libxl/libxl_pci.c | 40 | ||||
-rw-r--r-- | tools/libxl/xl_cmdimpl.c | 6 | ||||
-rw-r--r-- | tools/ocaml/libs/xl/xenlight_stubs.c | 4 | ||||
-rw-r--r-- | tools/python/xen/lowlevel/xl/xl.c | 6 |
5 files changed, 46 insertions, 29 deletions
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 5ec2d749f7..cc74e1359f 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -757,10 +757,21 @@ int libxl_device_vfb_destroy(libxl_ctx *ctx, uint32_t domid, LIBXL_EXTERNAL_CALLERS_ONLY; /* PCI Passthrough */ -int libxl_device_pci_add(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev); -int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev); -int libxl_device_pci_destroy(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev); -libxl_device_pci *libxl_device_pci_list(libxl_ctx *ctx, uint32_t domid, int *num); +int libxl_device_pci_add(libxl_ctx *ctx, uint32_t domid, + libxl_device_pci *pcidev, + const libxl_asyncop_how *ao_how) + LIBXL_EXTERNAL_CALLERS_ONLY; +int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid, + libxl_device_pci *pcidev, + const libxl_asyncop_how *ao_how) + LIBXL_EXTERNAL_CALLERS_ONLY; +int libxl_device_pci_destroy(libxl_ctx *ctx, uint32_t domid, + libxl_device_pci *pcidev, + const libxl_asyncop_how *ao_how) + LIBXL_EXTERNAL_CALLERS_ONLY; + +libxl_device_pci *libxl_device_pci_list(libxl_ctx *ctx, uint32_t domid, + int *num); /* * Functions related to making devices assignable -- that is, bound to diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c index 9c92ae61a5..48986f3fa8 100644 --- a/tools/libxl/libxl_pci.c +++ b/tools/libxl/libxl_pci.c @@ -1010,13 +1010,15 @@ int libxl__device_pci_setdefault(libxl__gc *gc, libxl_device_pci *pci) return 0; } -int libxl_device_pci_add(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev) +int libxl_device_pci_add(libxl_ctx *ctx, uint32_t domid, + libxl_device_pci *pcidev, + const libxl_asyncop_how *ao_how) { - GC_INIT(ctx); + AO_CREATE(ctx, domid, ao_how); int rc; rc = libxl__device_pci_add(gc, domid, pcidev, 0); - GC_FREE; - return rc; + libxl__ao_complete(egc, ao, rc); + return AO_INPROGRESS; } static int libxl_pcidev_assignable(libxl_ctx *ctx, libxl_device_pci *pcidev) @@ -1150,6 +1152,9 @@ static int qemu_pci_remove_xenstore(libxl__gc *gc, uint32_t domid, return 0; } +static int libxl__device_pci_remove_common(libxl__gc *gc, uint32_t domid, + libxl_device_pci *pcidev, int force); + static int do_pci_remove(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int force) { @@ -1263,10 +1268,7 @@ out: stubdomid = libxl_get_stubdom_id(ctx, domid); if (stubdomid != 0) { libxl_device_pci pcidev_s = *pcidev; - if (force) - libxl_device_pci_destroy(ctx, stubdomid, &pcidev_s); - else - libxl_device_pci_remove(ctx, stubdomid, &pcidev_s); + libxl__device_pci_remove_common(gc, stubdomid, &pcidev_s, force); } libxl__device_pci_remove_xenstore(gc, domid, pcidev); @@ -1313,27 +1315,31 @@ out: return rc; } -int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev) +int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid, + libxl_device_pci *pcidev, + const libxl_asyncop_how *ao_how) + { - GC_INIT(ctx); + AO_CREATE(ctx, domid, ao_how); int rc; rc = libxl__device_pci_remove_common(gc, domid, pcidev, 0); - GC_FREE; - return rc; + libxl__ao_complete(egc, ao, rc); + return AO_INPROGRESS; } int libxl_device_pci_destroy(libxl_ctx *ctx, uint32_t domid, - libxl_device_pci *pcidev) + libxl_device_pci *pcidev, + const libxl_asyncop_how *ao_how) { - GC_INIT(ctx); + AO_CREATE(ctx, domid, ao_how); int rc; rc = libxl__device_pci_remove_common(gc, domid, pcidev, 1); - GC_FREE; - return rc; + libxl__ao_complete(egc, ao, rc); + return AO_INPROGRESS; } static void libxl__device_pci_from_xs_be(libxl__gc *gc, @@ -1415,7 +1421,7 @@ int libxl__device_pci_destroy_all(libxl__gc *gc, uint32_t domid) * respond to SCI interrupt because the guest kernel has shut down the * devices by the time we even get here! */ - if (libxl_device_pci_destroy(ctx, domid, pcidevs + i) < 0) + if (libxl__device_pci_remove_common(gc, domid, pcidevs + i, 1) < 0) rc = ERROR_FAIL; } diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index a7dc3403d1..138cd72b80 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -2389,9 +2389,9 @@ static void pcidetach(const char *dom, const char *bdf, int force) exit(2); } if (force) - libxl_device_pci_destroy(ctx, domid, &pcidev); + libxl_device_pci_destroy(ctx, domid, &pcidev, 0); else - libxl_device_pci_remove(ctx, domid, &pcidev); + libxl_device_pci_remove(ctx, domid, &pcidev, 0); libxl_device_pci_dispose(&pcidev); xlu_cfg_destroy(config); @@ -2435,7 +2435,7 @@ static void pciattach(const char *dom, const char *bdf, const char *vs) fprintf(stderr, "pci-attach: malformed BDF specification \"%s\"\n", bdf); exit(2); } - libxl_device_pci_add(ctx, domid, &pcidev); + libxl_device_pci_add(ctx, domid, &pcidev, 0); libxl_device_pci_dispose(&pcidev); xlu_cfg_destroy(config); diff --git a/tools/ocaml/libs/xl/xenlight_stubs.c b/tools/ocaml/libs/xl/xenlight_stubs.c index adda67f54f..5f19a82c8b 100644 --- a/tools/ocaml/libs/xl/xenlight_stubs.c +++ b/tools/ocaml/libs/xl/xenlight_stubs.c @@ -423,7 +423,7 @@ value stub_xl_device_pci_add(value info, value domid) device_pci_val(&gc, &lg, &c_info, info); INIT_CTX(); - ret = libxl_device_pci_add(ctx, Int_val(domid), &c_info); + ret = libxl_device_pci_add(ctx, Int_val(domid), &c_info, 0); if (ret != 0) failwith_xl("pci_add", &lg); FREE_CTX(); @@ -441,7 +441,7 @@ value stub_xl_device_pci_remove(value info, value domid) device_pci_val(&gc, &lg, &c_info, info); INIT_CTX(); - ret = libxl_device_pci_remove(ctx, Int_val(domid), &c_info); + ret = libxl_device_pci_remove(ctx, Int_val(domid), &c_info, 0); if (ret != 0) failwith_xl("pci_remove", &lg); FREE_CTX(); diff --git a/tools/python/xen/lowlevel/xl/xl.c b/tools/python/xen/lowlevel/xl/xl.c index 553fc58871..0551c7636f 100644 --- a/tools/python/xen/lowlevel/xl/xl.c +++ b/tools/python/xen/lowlevel/xl/xl.c @@ -497,7 +497,7 @@ static PyObject *pyxl_pci_add(XlObject *self, PyObject *args) return NULL; } pci = (Py_device_pci *)obj; - if ( libxl_device_pci_add(self->ctx, domid, &pci->obj) ) { + if ( libxl_device_pci_add(self->ctx, domid, &pci->obj, 0) ) { PyErr_SetString(xl_error_obj, "cannot add pci device"); return NULL; } @@ -519,12 +519,12 @@ static PyObject *pyxl_pci_del(XlObject *self, PyObject *args) } pci = (Py_device_pci *)obj; if ( force ) { - if ( libxl_device_pci_destroy(self->ctx, domid, &pci->obj) ) { + if ( libxl_device_pci_destroy(self->ctx, domid, &pci->obj, 0) ) { PyErr_SetString(xl_error_obj, "cannot remove pci device"); return NULL; } } else { - if ( libxl_device_pci_remove(self->ctx, domid, &pci->obj) ) { + if ( libxl_device_pci_remove(self->ctx, domid, &pci->obj, 0) ) { PyErr_SetString(xl_error_obj, "cannot remove pci device"); return NULL; } |