[Xen-devel] [PATCH V2] bind_usbintf: do not reuse 'path'
To avoid confusion, use "intf_path" to indicate driver/interface path, and "bind_path" indicate driver/bind path. Signed-off-by: Chunyan Liu <cy...@suse.com> CC: Simon Cao <caobosi...@gmail.com> CC: George Dunlap <george.dun...@citrix.com> CC: Ian Jackson <ian.jack...@eu.citrix.com> --- tools/libxl/libxl_pvusb.c | 14 +++--- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tools/libxl/libxl_pvusb.c b/tools/libxl/libxl_pvusb.c index 6447639..4c1967d 100644 --- a/tools/libxl/libxl_pvusb.c +++ b/tools/libxl/libxl_pvusb.c @@ -1035,33 +1035,33 @@ out: static int bind_usbintf(libxl__gc *gc, const char *intf, const char *drvpath) { -char *path; +char *bind_path, *intf_path; struct stat st; int fd = -1; int rc, r; -path = GCSPRINTF("%s/%s", drvpath, intf); +intf_path = GCSPRINTF("%s/%s", drvpath, intf); /* check through lstat, if intf already exists under drvpath, * it's already bound, return directly; if it doesn't exist, * continue to do bind work; otherwise, return error. */ -r = lstat(path, ); +r = lstat(intf_path, ); if (r == 0) return 0; if (r < 0 && errno != ENOENT) return ERROR_FAIL; -path = GCSPRINTF("%s/bind", drvpath); +bind_path = GCSPRINTF("%s/bind", drvpath); -fd = open(path, O_WRONLY); +fd = open(bind_path, O_WRONLY); if (fd < 0) { -LOGE(ERROR, "open file failed: '%s'", path); +LOGE(ERROR, "open file failed: '%s'", bind_path); rc = ERROR_FAIL; goto out; } -if (libxl_write_exactly(CTX, fd, intf, strlen(intf), path, intf)) { +if (libxl_write_exactly(CTX, fd, intf, strlen(intf), bind_path, intf)) { rc = ERROR_FAIL; goto out; } -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH] bind_usbintf: do not reuse 'path'
To avoid confusion, add a new variable "intf_path" to indicate driver/interface path, let "path" indicate driver/bind path only. CID: 1358111 Signed-off-by: Chunyan Liu <cy...@suse.com> CC: Simon Cao <caobosi...@gmail.com> CC: George Dunlap <george.dun...@citrix.com> CC: Ian Jackson <ian.jack...@eu.citrix.com> --- tools/libxl/libxl_pvusb.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/libxl/libxl_pvusb.c b/tools/libxl/libxl_pvusb.c index 6447639..8cf3ddc 100644 --- a/tools/libxl/libxl_pvusb.c +++ b/tools/libxl/libxl_pvusb.c @@ -1035,18 +1035,18 @@ out: static int bind_usbintf(libxl__gc *gc, const char *intf, const char *drvpath) { -char *path; +char *path, *intf_path; struct stat st; int fd = -1; int rc, r; -path = GCSPRINTF("%s/%s", drvpath, intf); +intf_path = GCSPRINTF("%s/%s", drvpath, intf); /* check through lstat, if intf already exists under drvpath, * it's already bound, return directly; if it doesn't exist, * continue to do bind work; otherwise, return error. */ -r = lstat(path, ); +r = lstat(intf_path, ); if (r == 0) return 0; if (r < 0 && errno != ENOENT) -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH 1/4] a fix in libxl_device_usbdev_list
In testing with libvirt pvusb functionality, found a rc check error in libxl_device_usbdev_list. Correct it. This function is not used by xl. Signed-off-by: Chunyan Liu <cy...@suse.com> CC: Simon Cao <caobosi...@gmail.com> CC: George Dunlap <george.dun...@citrix.com> CC: Ian Jackson <ian.jack...@eu.citrix.com> --- tools/libxl/libxl_pvusb.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/libxl/libxl_pvusb.c b/tools/libxl/libxl_pvusb.c index 5f92628..04e41b4 100644 --- a/tools/libxl/libxl_pvusb.c +++ b/tools/libxl/libxl_pvusb.c @@ -701,13 +701,13 @@ libxl_device_usbdev_list(libxl_ctx *ctx, uint32_t domid, int *num) usbctrls = libxl__xs_directory(gc, XBT_NULL, path, ); for (i = 0; i < nc; i++) { -int r, nd = 0; +int rc, nd = 0; libxl_device_usbdev *tmp = NULL; -r = libxl__device_usbdev_list_for_usbctrl(gc, domid, +rc = libxl__device_usbdev_list_for_usbctrl(gc, domid, atoi(usbctrls[i]), , ); -if (!r || !nd) continue; +if (rc || !nd) continue; usbdevs = libxl__realloc(NOGC, usbdevs, sizeof(*usbdevs) * (*num + nd)); -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH 2/4] correct libxl_write_exactly sizeof
sizeof is wrongly used in libxl_write_exactly function, using strlen instead. CID: 1358110 CID: 1358109 Signed-off-by: Chunyan Liu <cy...@suse.com> CC: Simon Cao <caobosi...@gmail.com> CC: George Dunlap <george.dun...@citrix.com> CC: Ian Jackson <ian.jack...@eu.citrix.com> --- tools/libxl/libxl_pvusb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/libxl/libxl_pvusb.c b/tools/libxl/libxl_pvusb.c index 04e41b4..45117cf 100644 --- a/tools/libxl/libxl_pvusb.c +++ b/tools/libxl/libxl_pvusb.c @@ -1025,7 +1025,7 @@ static int unbind_usbintf(libxl__gc *gc, const char *intf) goto out; } -if (libxl_write_exactly(CTX, fd, intf, sizeof(intf), path, intf)) { +if (libxl_write_exactly(CTX, fd, intf, strlen(intf), path, intf)) { rc = ERROR_FAIL; goto out; } @@ -1065,7 +1065,7 @@ static int bind_usbintf(libxl__gc *gc, const char *intf, const char *drvpath) goto out; } -if (libxl_write_exactly(CTX, fd, intf, sizeof(intf), path, intf)) { +if (libxl_write_exactly(CTX, fd, intf, strlen(intf), path, intf)) { rc = ERROR_FAIL; goto out; } -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH 0/4] pvusb fixes
Patch series of pvusb fixes. Chunyan Liu (4): a fix in libxl_device_usbdev_list correct libxl_write_exactly sizeof cleanup redundant lstat in libxl_pvusb.c fix a pvusb type check tools/libxl/libxl_pvusb.c | 38 +- 1 file changed, 17 insertions(+), 21 deletions(-) -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH 3/4] cleanup redundant lstat in libxl_pvusb.c
CID: 1358112 Signed-off-by: Chunyan Liu <cy...@suse.com> CC: Simon Cao <caobosi...@gmail.com> CC: George Dunlap <george.dun...@citrix.com> CC: Ian Jackson <ian.jack...@eu.citrix.com> --- tools/libxl/libxl_pvusb.c | 21 + 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/tools/libxl/libxl_pvusb.c b/tools/libxl/libxl_pvusb.c index 45117cf..02d3e55 100644 --- a/tools/libxl/libxl_pvusb.c +++ b/tools/libxl/libxl_pvusb.c @@ -983,25 +983,14 @@ static char *usbdev_busid_from_ctrlport(libxl__gc *gc, uint32_t domid, static int usbintf_get_drvpath(libxl__gc *gc, const char *intf, char **drvpath) { char *spath, *dp = NULL; -struct stat st; -int r; spath = GCSPRINTF(SYSFS_USB_DEV "/%s/driver", intf); -r = lstat(spath, ); -if (r == 0) { -/* Find the canonical path to the driver. */ -dp = libxl__zalloc(gc, PATH_MAX); -dp = realpath(spath, dp); -if (!dp) { -LOGE(ERROR, "get realpath failed: '%s'", spath); -return ERROR_FAIL; -} -} else if (errno == ENOENT) { -/* driver path doesn't exist */ -dp = NULL; -} else { -LOGE(ERROR, "lstat failed: '%s'", spath); +/* Find the canonical path to the driver. */ +dp = libxl__zalloc(gc, PATH_MAX); +dp = realpath(spath, dp); +if (!dp && errno != ENOENT) { +LOGE(ERROR, "get realpath failed: '%s'", spath); return ERROR_FAIL; } -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH 4/4] fix a pvusb type check
Missing a check of controller type. Signed-off-by: Chunyan Liu <cy...@suse.com> CC: Simon Cao <caobosi...@gmail.com> CC: George Dunlap <george.dun...@citrix.com> CC: Ian Jackson <ian.jack...@eu.citrix.com> CC: Juergen Gross <jgr...@suse.com> --- This affects Juergen's qusb patch too. Fix that together. This patch could be applied on top of Juergen's qusb backend patch. tools/libxl/libxl_pvusb.c | 7 +++ 1 file changed, 7 insertions(+) diff --git a/tools/libxl/libxl_pvusb.c b/tools/libxl/libxl_pvusb.c index 02d3e55..6447639 100644 --- a/tools/libxl/libxl_pvusb.c +++ b/tools/libxl/libxl_pvusb.c @@ -811,6 +811,13 @@ static int libxl__device_usbdev_setdefault(libxl__gc *gc, } } +if (usbctrl->type != LIBXL_USBCTRL_TYPE_PV && +usbctrl->type != LIBXL_USBCTRL_TYPE_QUSB) { +LOG(ERROR, "Unsupported USB controller type"); +rc = ERROR_FAIL; +goto out; +} + rc = libxl__device_usbctrl_add_xenstore(gc, domid, usbctrl, update_json); if (rc) goto out; -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V17 5/6] domcreate: support pvusb in configuration file
Add code to support pvusb in domain config file. One could specify usbctrl and usb in domain's configuration file and create domain, then usb controllers will be created and usb device would be attached to guest automatically. One could specify usb controllers and usb devices in config file like this: usbctrl=['version=2,ports=4', 'version=1, ports=4', ] usbdev=['hostbus=2, hostaddr=1, controller=0,port=1', ] Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: George Dunlap <george.dun...@citrix.com> Acked-by: Ian Jackson <ian.jack...@eu.citrix.com> --- docs/man/xl.cfg.pod.5| 84 + tools/libxl/libxl_create.c | 73 +++-- tools/libxl/libxl_device.c | 4 ++ tools/libxl/libxl_internal.h | 8 tools/libxl/xl_cmdimpl.c | 107 ++- 5 files changed, 272 insertions(+), 4 deletions(-) diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 index 56b1117..b156caa 100644 --- a/docs/man/xl.cfg.pod.5 +++ b/docs/man/xl.cfg.pod.5 @@ -722,6 +722,90 @@ Note this may be overridden by rdm_policy option in PCI device configuration. =back +=item B
[Xen-devel] [PATCH V17 6/6] xl: add pvusb commands
Add pvusb commands: usbctrl-attach, usbctrl-detach, usb-list, usbdev-attach and usbdev-detach. To attach a usb device to guest through pvusb, one could follow following example: #xl usbctrl-attach test_vm version=1 ports=8 #xl usb-list test_vm will show the usb controllers and port usage under the domain. #xl usbdev-attach test_vm hostbus=1 hostaddr=2 will find the first usable controller:port, and attach usb device whose busnum is 1 and devnum is 6. One could also specify which and which . #xl usbdev-detach test_vm 0 1 will detach USB device under controller 0 port 1. #xl usbctrl-detach test_vm dev_id will destroy the controller with specified dev_id. Dev_id can be traced in usb-list info. Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: George Dunlap <george.dun...@citrix.com> --- docs/man/xl.pod.1 | 37 + tools/libxl/xl.h | 5 ++ tools/libxl/xl_cmdimpl.c | 190 ++ tools/libxl/xl_cmdtable.c | 25 ++ 4 files changed, 257 insertions(+) diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1 index 4279c7c..dc6213e 100644 --- a/docs/man/xl.pod.1 +++ b/docs/man/xl.pod.1 @@ -1345,6 +1345,43 @@ List pass-through pci devices for a domain. =back +=head1 USB PASS-THROUGH + +=over 4 + +=item B I I + +Create a new USB controller in the domain specified by I, +I describes the device to attach, using form +C
[Xen-devel] [PATCH V17 0/6] xen pvusb toolstack work
te a USB controller. e.g. xl usbctrl-attach domain [version=1|2] [ports=value] By default, it will create a USB2.0 controller with 8 ports. Then you could attach a USB device. e.g. xl usbdev-attach domain hostbus=1 hostaddr=6 [controller=index port=number] By default, it will find the 1st available controller:port to attach the USB device. You could view USB device status of the domain by usb-list. e.g. xl usb-list domain It will list USB controllers and USB devices under each controller. You could detach a USB device with usbdev-detach command by giving controller:port e.g. xl usbdev-detach domain 0 1 You can also remove the whole USB controller by usbctrl-detach command. e.g. xl usbctrl-detach domain 0 It will remove the USB controller with index 0 and all USB devices under it. 4. PVUSB Libxl implementation * usbctrl-attach To create a usb controller, we need: 1) generate usb controler related information 2) write usb controller frontend/backend info to xenstore PVUSB frontend and backend driver will probe xenstore paths and build connection between frontend and backend. * usbctrl-detach To remove a usb controller, we need: 1) check if the usb controller exists or not 2) remove all usb devices under controller 3) remove usb controller info from xenstore * usbdev-attach To attach a usb device, we need: 1) check if the usb device type is assignable 2) check if the usb device is already assigned to a domain 3) add 'busid' of the usb device to xenstore contoller/port/. PVUSB driver watches the xenstore changes and detects that, and needs to use 'busid' to do following work. 4) unbind usb device from original driver and bind to usbback. If usb device has many interfaces, then: - unbind each interface from its original driver and bind to usbback. - store the original driver to xenstore for later rebinding when detaching the device. * usbdev-detach To detach a usb device, we need: 1) check if the usb device is assigned to the domain 2) remove the usb device from xenstore controller/port. 3) unbind usb device from usbback and rebind to its original driver. If usb device has many interfaces, do it to each interface. * usb-list List all USB controllers and USB devices under each controller. 5. PVUSB xenstore information PVUSB xenstore information includes three parts: frontend, backend and /libxl part. A USB controller is corresponding to a "vusb" device in xenstore. Adding a USB controller will add a new "vusb" device, removing a USB controller will delete the related "vusb" device. Following is an example xenstore values of a USB controller. Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "" 2 = "" 3 = "" 4 = "" Frontend: device = "" vusb = "" 0 = "" backend = "/local/domain/0/backend/vusb/1/0" backend-id = "0" state = "4" urb-ring-ref = "348" conn-ring-ref = "346" event-channel = "20" Adding a USB device won't create a new "vusb" device, but only write the USB device busid to one port of USB controller. For example, attaching a USB device (busid is 2-1.6) to above USB controller port 1, it only need write 2-1.6 to port 1 of this USB controller: Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "2-1.6" 2 = "" 3 = "" 4 = "" Frontend doesn't change. Since assign a host USB device to guest, we'll unbind USB interfaces from their original drivers and bind them to usbback. After detaching this USB device from guest, one would hope the USB interfaces could be rebind to their original drivers, so there should some place to get the original driver info. To support that, when attaching a USB device to guest, we'll save the original driver info in xenstore too, the place is /libxl/usbback, for example: libxl = "" 1 = "" dm-version = "qemu_xen" usbback = "" 3-11 = "" 3-11@1_0 = "" driver_path = "/sys/bus/usb/drivers/btusb" In this example, USB device (busid is 3-11, /sys/bus/usb/devices/3-11). It has interface 3-11:1.0, wh
[Xen-devel] [PATCH V17 3/6] refactor DEFINE_DEVICE_REMOVE to fit for more device types
For some device type, device removal operation needs to be handled specially, like usbctrl, it needs to remove all usb devices under it first, then remove usbctrl. Extend DEFINE_DEVICE_REMOVE to support generic and custom way For those need to be handled specially, call DEFINE_DEVICE_REMOVE_CUSTOM, it requires user defined libxl__initiate_device_##type##_remove. Otherwise, just call DEFINE_DEVICE_REMOVE as before. Signed-off-by: George Dunlap <george.dun...@citrix.com> Signed-off-by: Chunyan Liu <cy...@suse.com> Reviewed-by: George Dunlap <george.dun...@citrix.com> --- tools/libxl/libxl.c | 18 +- tools/libxl/libxl_device.c | 10 +- tools/libxl/libxl_internal.h | 4 ++-- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 2ac9c0f..2ab5ad3 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -3134,7 +3134,7 @@ void libxl__device_disk_local_initiate_detach(libxl__egc *egc, aodev->dev = device; aodev->callback = local_device_detach_cb; aodev->force = 0; -libxl__initiate_device_remove(egc, aodev); +libxl__initiate_device_generic_remove(egc, aodev); return; } @@ -4103,7 +4103,7 @@ out: * libxl_device_vfb_remove * libxl_device_vfb_destroy */ -#define DEFINE_DEVICE_REMOVE(type, removedestroy, f)\ +#define DEFINE_DEVICE_REMOVE_EXT(type, remtype, removedestroy, f)\ int libxl_device_##type##_##removedestroy(libxl_ctx *ctx, \ uint32_t domid, libxl_device_##type *type, \ const libxl_asyncop_how *ao_how)\ @@ -4123,13 +4123,19 @@ out: aodev->dev = device;\ aodev->callback = device_addrm_aocomplete; \ aodev->force = f; \ -libxl__initiate_device_remove(egc, aodev); \ +libxl__initiate_device_##remtype##_remove(egc, aodev); \ \ out:\ -if (rc) return AO_CREATE_FAIL(rc);\ +if (rc) return AO_CREATE_FAIL(rc); \ return AO_INPROGRESS; \ } +#define DEFINE_DEVICE_REMOVE(type, removedestroy, f) \ +DEFINE_DEVICE_REMOVE_EXT(type, generic, removedestroy, f) + +#define DEFINE_DEVICE_REMOVE_CUSTOM(type, removedestroy, f) \ +DEFINE_DEVICE_REMOVE_EXT(type, type, removedestroy, f) + /* Define all remove/destroy functions and undef the macro */ /* disk */ @@ -4158,6 +4164,8 @@ DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) * 2. dynamically add/remove qemu chardevs via qmp messages. */ #undef DEFINE_DEVICE_REMOVE +#undef DEFINE_DEVICE_REMOVE_CUSTOM +#undef DEFINE_DEVICE_REMOVE_EXT /**/ @@ -4362,7 +4370,7 @@ static int remove_device(libxl__egc *egc, libxl__ao *ao, aodev->dev = dev; aodev->action = LIBXL__DEVICE_ACTION_REMOVE; aodev->callback = device_complete; -libxl__initiate_device_remove(egc, aodev); +libxl__initiate_device_generic_remove(egc, aodev); break; case LIBXL__DEVICE_KIND_QDISK: if (--dguest->num_qdisks == 0) { diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c index 8bb5e93..a356e2a 100644 --- a/tools/libxl/libxl_device.c +++ b/tools/libxl/libxl_device.c @@ -676,7 +676,7 @@ void libxl__devices_destroy(libxl__egc *egc, libxl__devices_remove_state *drs) aodev->action = LIBXL__DEVICE_ACTION_REMOVE; aodev->dev = dev; aodev->force = drs->force; -libxl__initiate_device_remove(egc, aodev); +libxl__initiate_device_generic_remove(egc, aodev); } } } @@ -775,8 +775,8 @@ out: return; } -void libxl__initiate_device_remove(libxl__egc *egc, - libxl__ao_device *aodev) +void libxl__initiate_device_generic_remove(libxl__egc *egc, + libxl__ao_device *aodev) { STATE_AO_GC(aodev->ao); xs_transaction_t t = 0; @@ -806,7 +806,7 @@ void libxl__initiate_device_remove(libxl__egc *egc, (info.paused || info.dying || info.shutdown)) { /* * TODO: 4.2 Bodge due to QEMU, see comment on top of - * libxl__initiate_device_remove in libxl_internal.h + * libxl__initiate_device_generic_remove in libxl_internal.h */ rc = libxl__ev_time_register_rel(ao, >timeout,
[Xen-devel] [PATCH V17 1/6] libxl: export some functions for pvusb use
Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: Wei Liu <wei.l...@citrix.com> Acked-by: Ian Jackson <ian.jack...@eu.citrix.com> --- tools/libxl/libxl.c | 5 ++--- tools/libxl/libxl_internal.h | 3 +++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 833fd40..2ac9c0f 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -1966,7 +1966,7 @@ out: } /* common function to get next device id */ -static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) +int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) { char *dompath, **l; unsigned int nb; @@ -1985,8 +1985,7 @@ static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) return nextid; } -static int libxl__resolve_domid(libxl__gc *gc, const char *name, -uint32_t *domid) +int libxl__resolve_domid(libxl__gc *gc, const char *name, uint32_t *domid) { if (!name) return 0; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index cb9790b..9c8519a 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1180,6 +1180,9 @@ _hidden int libxl__init_console_from_channel(libxl__gc *gc, libxl__device_console *console, int dev_num, libxl_device_channel *channel); +_hidden int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device); +_hidden int libxl__resolve_domid(libxl__gc *gc, const char *name, + uint32_t *domid); /* * For each aggregate type which can be used as an input we provide: -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V17 2/6] libxl_utils: add internal function to read sysfs file contents
Add a new function libxl_read_sysfs_file_contents to handle sysfs file specially. It would be used in later pvusb work. Signed-off-by: Chunyan Liu <cy...@suse.com> Acked-by: Ian Jackson <ian.jack...@eu.citrix.com> --- tools/libxl/libxl_internal.h | 4 +++ tools/libxl/libxl_utils.c| 74 2 files changed, 78 insertions(+) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 9c8519a..429ea32 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -4078,6 +4078,10 @@ void libxl__bitmap_copy_best_effort(libxl__gc *gc, libxl_bitmap *dptr, int libxl__count_physical_sockets(libxl__gc *gc, int *sockets); +_hidden int libxl__read_sysfs_file_contents(libxl__gc *gc, +const char *filename, +void **data_r, +int *datalen_r); #define LIBXL_QEMU_USER_PREFIX "xen-qemuuser" #define LIBXL_QEMU_USER_BASE LIBXL_QEMU_USER_PREFIX"-domid" diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index 672d3f8..b0cb9e1 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -396,6 +396,80 @@ int libxl_read_file_contents(libxl_ctx *ctx, const char *filename, return e; } +int libxl__read_sysfs_file_contents(libxl__gc *gc, const char *filename, +void **data_r, int *datalen_r) +{ +FILE *f = 0; +uint8_t *data = 0; +int datalen = 0; +int e; +struct stat stab; +ssize_t rs; + +f = fopen(filename, "r"); +if (!f) { +if (errno == ENOENT) return ENOENT; +LOGE(ERROR, "failed to open %s", filename); +goto xe; +} + +if (fstat(fileno(f), )) { +LOGE(ERROR, "failed to fstat %s", filename); +goto xe; +} + +if (!S_ISREG(stab.st_mode)) { +LOGE(ERROR, "%s is not a plain file", filename); +errno = ENOTTY; +goto xe; +} + +if (stab.st_size > INT_MAX) { +LOG(ERROR, "file %s is far too large", filename); +errno = EFBIG; +goto xe; +} + +datalen = stab.st_size; + +if (stab.st_size && data_r) { +data = libxl__malloc(gc, datalen); + +/* For sysfs file, datalen is always PAGE_SIZE. 'read' + * will return the number of bytes of the actual content, + * rs <= datalen is expected. + */ +rs = fread(data, 1, datalen, f); +if (rs < datalen) { +if (ferror(f)) { +LOGE(ERROR, "failed to read %s", filename); +goto xe; +} + +datalen = rs; +data = libxl__realloc(gc, data, datalen); +} +} + +if (fclose(f)) { +f = 0; +LOGE(ERROR, "failed to close %s", filename); +goto xe; +} + +if (data_r) *data_r = data; +if (datalen_r) *datalen_r = datalen; + +return 0; + + xe: +e = errno; +assert(e != ENOENT); +if (f) fclose(f); +return e; +} + + #define READ_WRITE_EXACTLY(rw, zero_is_eof, constdata)\ \ int libxl_##rw##_exactly(libxl_ctx *ctx, int fd, \ -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V17 4/6] libxl: add pvusb API
Add pvusb APIs, including: - attach/detach (create/destroy) virtual usb controller. - attach/detach usb device - list usb controller and usb devices - some other helper functions Signed-off-by: Simon Cao <caobosi...@gmail.com> Signed-off-by: George Dunlap <george.dun...@citrix.com> Signed-off-by: Chunyan Liu <cy...@suse.com> Reviewed-by: George Dunlap <george.dun...@citrix.com> --- tools/libxl/Makefile |3 +- tools/libxl/libxl.c | 18 + tools/libxl/libxl.h | 77 ++ tools/libxl/libxl_device.c |5 +- tools/libxl/libxl_internal.h | 18 + tools/libxl/libxl_osdeps.h | 13 + tools/libxl/libxl_pvusb.c| 1620 ++ tools/libxl/libxl_types.idl | 46 + tools/libxl/libxl_types_internal.idl |1 + tools/libxl/libxl_utils.c| 18 + tools/libxl/libxl_utils.h|5 + 11 files changed, 1822 insertions(+), 2 deletions(-) create mode 100644 tools/libxl/libxl_pvusb.c diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile index 789a12e..8fa7b87 100644 --- a/tools/libxl/Makefile +++ b/tools/libxl/Makefile @@ -105,7 +105,8 @@ LIBXL_OBJS = flexarray.o libxl.o libxl_create.o libxl_dm.o libxl_pci.o \ libxl_stream_read.o libxl_stream_write.o \ libxl_save_callout.o _libxl_save_msgs_callout.o \ libxl_qmp.o libxl_event.o libxl_fork.o \ - libxl_dom_suspend.o libxl_dom_save.o $(LIBXL_OBJS-y) + libxl_dom_suspend.o libxl_dom_save.o libxl_pvusb.o \ +$(LIBXL_OBJS-y) LIBXL_OBJS += libxl_genid.o LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 2ab5ad3..1e68688 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -4102,6 +4102,8 @@ out: * libxl_device_vkb_destroy * libxl_device_vfb_remove * libxl_device_vfb_destroy + * libxl_device_usbctrl_remove + * libxl_device_usbctrl_destroy */ #define DEFINE_DEVICE_REMOVE_EXT(type, remtype, removedestroy, f)\ int libxl_device_##type##_##removedestroy(libxl_ctx *ctx, \ @@ -4159,6 +4161,10 @@ DEFINE_DEVICE_REMOVE(vfb, destroy, 1) DEFINE_DEVICE_REMOVE(vtpm, remove, 0) DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) +/* usbctrl */ +DEFINE_DEVICE_REMOVE_CUSTOM(usbctrl, remove, 0) +DEFINE_DEVICE_REMOVE_CUSTOM(usbctrl, destroy, 1) + /* channel/console hotunplug is not implemented. There are 2 possibilities: * 1. add support for secondary consoles to xenconsoled * 2. dynamically add/remove qemu chardevs via qmp messages. */ @@ -4174,6 +4180,8 @@ DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) * libxl_device_disk_add * libxl_device_nic_add * libxl_device_vtpm_add + * libxl_device_usbctrl_add + * libxl_device_usbdev_add */ #define DEFINE_DEVICE_ADD(type) \ @@ -4205,6 +4213,12 @@ DEFINE_DEVICE_ADD(nic) /* vtpm */ DEFINE_DEVICE_ADD(vtpm) +/* usbctrl */ +DEFINE_DEVICE_ADD(usbctrl) + +/* usb */ +DEFINE_DEVICE_ADD(usbdev) + #undef DEFINE_DEVICE_ADD /**/ @@ -6750,6 +6764,10 @@ int libxl_retrieve_domain_configuration(libxl_ctx *ctx, uint32_t domid, MERGE(pci, pcidevs, COMPARE_PCI, {}); +MERGE(usbctrl, usbctrls, COMPARE_USBCTRL, {}); + +MERGE(usbdev, usbdevs, COMPARE_USB, {}); + /* Take care of removable device. We maintain invariant in the * insert / remove operation so that: * 1. if xenstore is "empty" while JSON is not, the result diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 0859383..5cc3ce3 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -123,6 +123,12 @@ #define LIBXL_HAVE_DOMAIN_NODEAFFINITY 1 /* + * LIBXL_HAVE_PVUSB indicates functions for plugging in USB devices + * through pvusb -- both hotplug and at domain creation time.. + */ +#define LIBXL_HAVE_PVUSB 1 + +/* * LIBXL_HAVE_BUILDINFO_HVM_VENDOR_DEVICE indicates that the * libxl_vendor_device field is present in the hvm sections of * libxl_domain_build_info. This field tells libxl which @@ -1536,6 +1542,77 @@ int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk, const libxl_asyncop_how *ao_how) LIBXL_EXTERNAL_CALLERS_ONLY; +/* + * USB + * + * For each device removed or added, one of these protocols is available: + * - PV (i.e., PVUSB) + * - DEVICEMODEL (i.e, qemu) + * + * PV is available for either PV or HVM domains. DEVICEMODEL is only + * available for HVM domains. The caller can additionally specify + * "AUTO", in which case the library will try to determine the best + * protocol automatically. + * + * At the moment, the only protocol implemented is PV. + * + * One can add/remove USB controllers to/f
[Xen-devel] [RESEND][PATCH V16 4/6] libxl: add pvusb API
Add pvusb APIs, including: - attach/detach (create/destroy) virtual usb controller. - attach/detach usb device - list usb controller and usb devices - some other helper functions Signed-off-by: Simon Cao <caobosi...@gmail.com> Signed-off-by: George Dunlap <george.dun...@citrix.com> Signed-off-by: Chunyan Liu <cy...@suse.com> --- Changes: * Address George's comments tools/libxl/Makefile |3 +- tools/libxl/libxl.c | 18 + tools/libxl/libxl.h | 77 ++ tools/libxl/libxl_device.c |5 +- tools/libxl/libxl_internal.h | 18 + tools/libxl/libxl_osdeps.h | 13 + tools/libxl/libxl_pvusb.c| 1620 ++ tools/libxl/libxl_types.idl | 46 + tools/libxl/libxl_types_internal.idl |1 + tools/libxl/libxl_utils.c| 18 + tools/libxl/libxl_utils.h|5 + 11 files changed, 1822 insertions(+), 2 deletions(-) create mode 100644 tools/libxl/libxl_pvusb.c diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile index 789a12e..8fa7b87 100644 --- a/tools/libxl/Makefile +++ b/tools/libxl/Makefile @@ -105,7 +105,8 @@ LIBXL_OBJS = flexarray.o libxl.o libxl_create.o libxl_dm.o libxl_pci.o \ libxl_stream_read.o libxl_stream_write.o \ libxl_save_callout.o _libxl_save_msgs_callout.o \ libxl_qmp.o libxl_event.o libxl_fork.o \ - libxl_dom_suspend.o libxl_dom_save.o $(LIBXL_OBJS-y) + libxl_dom_suspend.o libxl_dom_save.o libxl_pvusb.o \ +$(LIBXL_OBJS-y) LIBXL_OBJS += libxl_genid.o LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 2ab5ad3..1e68688 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -4102,6 +4102,8 @@ out: * libxl_device_vkb_destroy * libxl_device_vfb_remove * libxl_device_vfb_destroy + * libxl_device_usbctrl_remove + * libxl_device_usbctrl_destroy */ #define DEFINE_DEVICE_REMOVE_EXT(type, remtype, removedestroy, f)\ int libxl_device_##type##_##removedestroy(libxl_ctx *ctx, \ @@ -4159,6 +4161,10 @@ DEFINE_DEVICE_REMOVE(vfb, destroy, 1) DEFINE_DEVICE_REMOVE(vtpm, remove, 0) DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) +/* usbctrl */ +DEFINE_DEVICE_REMOVE_CUSTOM(usbctrl, remove, 0) +DEFINE_DEVICE_REMOVE_CUSTOM(usbctrl, destroy, 1) + /* channel/console hotunplug is not implemented. There are 2 possibilities: * 1. add support for secondary consoles to xenconsoled * 2. dynamically add/remove qemu chardevs via qmp messages. */ @@ -4174,6 +4180,8 @@ DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) * libxl_device_disk_add * libxl_device_nic_add * libxl_device_vtpm_add + * libxl_device_usbctrl_add + * libxl_device_usbdev_add */ #define DEFINE_DEVICE_ADD(type) \ @@ -4205,6 +4213,12 @@ DEFINE_DEVICE_ADD(nic) /* vtpm */ DEFINE_DEVICE_ADD(vtpm) +/* usbctrl */ +DEFINE_DEVICE_ADD(usbctrl) + +/* usb */ +DEFINE_DEVICE_ADD(usbdev) + #undef DEFINE_DEVICE_ADD /**/ @@ -6750,6 +6764,10 @@ int libxl_retrieve_domain_configuration(libxl_ctx *ctx, uint32_t domid, MERGE(pci, pcidevs, COMPARE_PCI, {}); +MERGE(usbctrl, usbctrls, COMPARE_USBCTRL, {}); + +MERGE(usbdev, usbdevs, COMPARE_USB, {}); + /* Take care of removable device. We maintain invariant in the * insert / remove operation so that: * 1. if xenstore is "empty" while JSON is not, the result diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 0859383..5cc3ce3 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -123,6 +123,12 @@ #define LIBXL_HAVE_DOMAIN_NODEAFFINITY 1 /* + * LIBXL_HAVE_PVUSB indicates functions for plugging in USB devices + * through pvusb -- both hotplug and at domain creation time.. + */ +#define LIBXL_HAVE_PVUSB 1 + +/* * LIBXL_HAVE_BUILDINFO_HVM_VENDOR_DEVICE indicates that the * libxl_vendor_device field is present in the hvm sections of * libxl_domain_build_info. This field tells libxl which @@ -1536,6 +1542,77 @@ int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk, const libxl_asyncop_how *ao_how) LIBXL_EXTERNAL_CALLERS_ONLY; +/* + * USB + * + * For each device removed or added, one of these protocols is available: + * - PV (i.e., PVUSB) + * - DEVICEMODEL (i.e, qemu) + * + * PV is available for either PV or HVM domains. DEVICEMODEL is only + * available for HVM domains. The caller can additionally specify + * "AUTO", in which case the library will try to determine the best + * protocol automatically. + * + * At the moment, the only protocol implemented is PV. + * + * One can add/remove USB controllers to/from guest, and att
[Xen-devel] [RESEND][PATCH V16 5/6] domcreate: support pvusb in configuration file
Add code to support pvusb in domain config file. One could specify usbctrl and usb in domain's configuration file and create domain, then usb controllers will be created and usb device would be attached to guest automatically. One could specify usb controllers and usb devices in config file like this: usbctrl=['version=2,ports=4', 'version=1, ports=4', ] usbdev=['hostbus=2, hostaddr=1, controller=0,port=1', ] Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: George Dunlap <george.dun...@citrix.com> Acked-by: Ian Jackson <ian.jack...@eu.citrix.com> --- docs/man/xl.cfg.pod.5| 84 + tools/libxl/libxl_create.c | 73 +++-- tools/libxl/libxl_device.c | 4 ++ tools/libxl/libxl_internal.h | 8 tools/libxl/xl_cmdimpl.c | 107 ++- 5 files changed, 272 insertions(+), 4 deletions(-) diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 index 56b1117..b156caa 100644 --- a/docs/man/xl.cfg.pod.5 +++ b/docs/man/xl.cfg.pod.5 @@ -722,6 +722,90 @@ Note this may be overridden by rdm_policy option in PCI device configuration. =back +=item B
[Xen-devel] [RESEND][PATCH V16 2/6] libxl_utils: add internal function to read sysfs file contents
Add a new function libxl_read_sysfs_file_contents to handle sysfs file specially. It would be used in later pvusb work. Signed-off-by: Chunyan Liu <cy...@suse.com> Acked-by: Ian Jackson <ian.jack...@eu.citrix.com> --- tools/libxl/libxl_internal.h | 4 +++ tools/libxl/libxl_utils.c| 74 2 files changed, 78 insertions(+) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 9c8519a..429ea32 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -4078,6 +4078,10 @@ void libxl__bitmap_copy_best_effort(libxl__gc *gc, libxl_bitmap *dptr, int libxl__count_physical_sockets(libxl__gc *gc, int *sockets); +_hidden int libxl__read_sysfs_file_contents(libxl__gc *gc, +const char *filename, +void **data_r, +int *datalen_r); #define LIBXL_QEMU_USER_PREFIX "xen-qemuuser" #define LIBXL_QEMU_USER_BASE LIBXL_QEMU_USER_PREFIX"-domid" diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index 672d3f8..b0cb9e1 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -396,6 +396,80 @@ int libxl_read_file_contents(libxl_ctx *ctx, const char *filename, return e; } +int libxl__read_sysfs_file_contents(libxl__gc *gc, const char *filename, +void **data_r, int *datalen_r) +{ +FILE *f = 0; +uint8_t *data = 0; +int datalen = 0; +int e; +struct stat stab; +ssize_t rs; + +f = fopen(filename, "r"); +if (!f) { +if (errno == ENOENT) return ENOENT; +LOGE(ERROR, "failed to open %s", filename); +goto xe; +} + +if (fstat(fileno(f), )) { +LOGE(ERROR, "failed to fstat %s", filename); +goto xe; +} + +if (!S_ISREG(stab.st_mode)) { +LOGE(ERROR, "%s is not a plain file", filename); +errno = ENOTTY; +goto xe; +} + +if (stab.st_size > INT_MAX) { +LOG(ERROR, "file %s is far too large", filename); +errno = EFBIG; +goto xe; +} + +datalen = stab.st_size; + +if (stab.st_size && data_r) { +data = libxl__malloc(gc, datalen); + +/* For sysfs file, datalen is always PAGE_SIZE. 'read' + * will return the number of bytes of the actual content, + * rs <= datalen is expected. + */ +rs = fread(data, 1, datalen, f); +if (rs < datalen) { +if (ferror(f)) { +LOGE(ERROR, "failed to read %s", filename); +goto xe; +} + +datalen = rs; +data = libxl__realloc(gc, data, datalen); +} +} + +if (fclose(f)) { +f = 0; +LOGE(ERROR, "failed to close %s", filename); +goto xe; +} + +if (data_r) *data_r = data; +if (datalen_r) *datalen_r = datalen; + +return 0; + + xe: +e = errno; +assert(e != ENOENT); +if (f) fclose(f); +return e; +} + + #define READ_WRITE_EXACTLY(rw, zero_is_eof, constdata)\ \ int libxl_##rw##_exactly(libxl_ctx *ctx, int fd, \ -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [RESEND][PATCH V16 0/6] xen pvusb toolstack work
B2.0 controller with 8 ports. Then you could attach a USB device. e.g. xl usbdev-attach domain hostbus=1 hostaddr=6 [controller=index port=number] By default, it will find the 1st available controller:port to attach the USB device. You could view USB device status of the domain by usb-list. e.g. xl usb-list domain It will list USB controllers and USB devices under each controller. You could detach a USB device with usbdev-detach command by giving controller:port e.g. xl usbdev-detach domain 0 1 You can also remove the whole USB controller by usbctrl-detach command. e.g. xl usbctrl-detach domain 0 It will remove the USB controller with index 0 and all USB devices under it. 4. PVUSB Libxl implementation * usbctrl-attach To create a usb controller, we need: 1) generate usb controler related information 2) write usb controller frontend/backend info to xenstore PVUSB frontend and backend driver will probe xenstore paths and build connection between frontend and backend. * usbctrl-detach To remove a usb controller, we need: 1) check if the usb controller exists or not 2) remove all usb devices under controller 3) remove usb controller info from xenstore * usbdev-attach To attach a usb device, we need: 1) check if the usb device type is assignable 2) check if the usb device is already assigned to a domain 3) add 'busid' of the usb device to xenstore contoller/port/. PVUSB driver watches the xenstore changes and detects that, and needs to use 'busid' to do following work. 4) unbind usb device from original driver and bind to usbback. If usb device has many interfaces, then: - unbind each interface from its original driver and bind to usbback. - store the original driver to xenstore for later rebinding when detaching the device. * usbdev-detach To detach a usb device, we need: 1) check if the usb device is assigned to the domain 2) remove the usb device from xenstore controller/port. 3) unbind usb device from usbback and rebind to its original driver. If usb device has many interfaces, do it to each interface. * usb-list List all USB controllers and USB devices under each controller. 5. PVUSB xenstore information PVUSB xenstore information includes three parts: frontend, backend and /libxl part. A USB controller is corresponding to a "vusb" device in xenstore. Adding a USB controller will add a new "vusb" device, removing a USB controller will delete the related "vusb" device. Following is an example xenstore values of a USB controller. Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "" 2 = "" 3 = "" 4 = "" Frontend: device = "" vusb = "" 0 = "" backend = "/local/domain/0/backend/vusb/1/0" backend-id = "0" state = "4" urb-ring-ref = "348" conn-ring-ref = "346" event-channel = "20" Adding a USB device won't create a new "vusb" device, but only write the USB device busid to one port of USB controller. For example, attaching a USB device (busid is 2-1.6) to above USB controller port 1, it only need write 2-1.6 to port 1 of this USB controller: Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "2-1.6" 2 = "" 3 = "" 4 = "" Frontend doesn't change. Since assign a host USB device to guest, we'll unbind USB interfaces from their original drivers and bind them to usbback. After detaching this USB device from guest, one would hope the USB interfaces could be rebind to their original drivers, so there should some place to get the original driver info. To support that, when attaching a USB device to guest, we'll save the original driver info in xenstore too, the place is /libxl/usbback, for example: libxl = "" 1 = "" dm-version = "qemu_xen" usbback = "" 3-11 = "" 3-11@1_0 = "" driver_path = "/sys/bus/usb/drivers/btusb" In this example, USB device (busid is 3-11, /sys/bus/usb/devices/3-11). It has interface 3-11:1.0, whose original dirver is btusb. Since xenstore doesn't allow ':' and '.' in a key, so we encode the interface by changing ':' to
[Xen-devel] [RESEND][PATCH V16 3/6] refactor DEFINE_DEVICE_REMOVE to fit for more device types
For some device type, device removal operation needs to be handled specially, like usbctrl, it needs to remove all usb devices under it first, then remove usbctrl. Extend DEFINE_DEVICE_REMOVE to support generic and custom way For those need to be handled specially, call DEFINE_DEVICE_REMOVE_CUSTOM, it requires user defined libxl__initiate_device_##type##_remove. Otherwise, just call DEFINE_DEVICE_REMOVE as before. Signed-off-by: George Dunlap <george.dun...@citrix.com> Signed-off-by: Chunyan Liu <cy...@suse.com> --- tools/libxl/libxl.c | 18 +- tools/libxl/libxl_device.c | 10 +- tools/libxl/libxl_internal.h | 4 ++-- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 2ac9c0f..2ab5ad3 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -3134,7 +3134,7 @@ void libxl__device_disk_local_initiate_detach(libxl__egc *egc, aodev->dev = device; aodev->callback = local_device_detach_cb; aodev->force = 0; -libxl__initiate_device_remove(egc, aodev); +libxl__initiate_device_generic_remove(egc, aodev); return; } @@ -4103,7 +4103,7 @@ out: * libxl_device_vfb_remove * libxl_device_vfb_destroy */ -#define DEFINE_DEVICE_REMOVE(type, removedestroy, f)\ +#define DEFINE_DEVICE_REMOVE_EXT(type, remtype, removedestroy, f)\ int libxl_device_##type##_##removedestroy(libxl_ctx *ctx, \ uint32_t domid, libxl_device_##type *type, \ const libxl_asyncop_how *ao_how)\ @@ -4123,13 +4123,19 @@ out: aodev->dev = device;\ aodev->callback = device_addrm_aocomplete; \ aodev->force = f; \ -libxl__initiate_device_remove(egc, aodev); \ +libxl__initiate_device_##remtype##_remove(egc, aodev); \ \ out:\ -if (rc) return AO_CREATE_FAIL(rc);\ +if (rc) return AO_CREATE_FAIL(rc); \ return AO_INPROGRESS; \ } +#define DEFINE_DEVICE_REMOVE(type, removedestroy, f) \ +DEFINE_DEVICE_REMOVE_EXT(type, generic, removedestroy, f) + +#define DEFINE_DEVICE_REMOVE_CUSTOM(type, removedestroy, f) \ +DEFINE_DEVICE_REMOVE_EXT(type, type, removedestroy, f) + /* Define all remove/destroy functions and undef the macro */ /* disk */ @@ -4158,6 +4164,8 @@ DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) * 2. dynamically add/remove qemu chardevs via qmp messages. */ #undef DEFINE_DEVICE_REMOVE +#undef DEFINE_DEVICE_REMOVE_CUSTOM +#undef DEFINE_DEVICE_REMOVE_EXT /**/ @@ -4362,7 +4370,7 @@ static int remove_device(libxl__egc *egc, libxl__ao *ao, aodev->dev = dev; aodev->action = LIBXL__DEVICE_ACTION_REMOVE; aodev->callback = device_complete; -libxl__initiate_device_remove(egc, aodev); +libxl__initiate_device_generic_remove(egc, aodev); break; case LIBXL__DEVICE_KIND_QDISK: if (--dguest->num_qdisks == 0) { diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c index 8bb5e93..a356e2a 100644 --- a/tools/libxl/libxl_device.c +++ b/tools/libxl/libxl_device.c @@ -676,7 +676,7 @@ void libxl__devices_destroy(libxl__egc *egc, libxl__devices_remove_state *drs) aodev->action = LIBXL__DEVICE_ACTION_REMOVE; aodev->dev = dev; aodev->force = drs->force; -libxl__initiate_device_remove(egc, aodev); +libxl__initiate_device_generic_remove(egc, aodev); } } } @@ -775,8 +775,8 @@ out: return; } -void libxl__initiate_device_remove(libxl__egc *egc, - libxl__ao_device *aodev) +void libxl__initiate_device_generic_remove(libxl__egc *egc, + libxl__ao_device *aodev) { STATE_AO_GC(aodev->ao); xs_transaction_t t = 0; @@ -806,7 +806,7 @@ void libxl__initiate_device_remove(libxl__egc *egc, (info.paused || info.dying || info.shutdown)) { /* * TODO: 4.2 Bodge due to QEMU, see comment on top of - * libxl__initiate_device_remove in libxl_internal.h + * libxl__initiate_device_generic_remove in libxl_internal.h */ rc = libxl__ev_time_register_rel(ao, >timeout, device_qemu_timeout, @@ -942,7 +942,7 @@ static void
[Xen-devel] [RESEND][PATCH V16 6/6] xl: add pvusb commands
Add pvusb commands: usbctrl-attach, usbctrl-detach, usb-list, usbdev-attach and usbdev-detach. To attach a usb device to guest through pvusb, one could follow following example: #xl usbctrl-attach test_vm version=1 ports=8 #xl usb-list test_vm will show the usb controllers and port usage under the domain. #xl usbdev-attach test_vm hostbus=1 hostaddr=2 will find the first usable controller:port, and attach usb device whose busnum is 1 and devnum is 6. One could also specify which and which . #xl usbdev-detach test_vm 0 1 will detach USB device under controller 0 port 1. #xl usbctrl-detach test_vm dev_id will destroy the controller with specified dev_id. Dev_id can be traced in usb-list info. Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: George Dunlap <george.dun...@citrix.com> --- docs/man/xl.pod.1 | 37 + tools/libxl/xl.h | 5 ++ tools/libxl/xl_cmdimpl.c | 190 ++ tools/libxl/xl_cmdtable.c | 25 ++ 4 files changed, 257 insertions(+) diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1 index 4279c7c..dc6213e 100644 --- a/docs/man/xl.pod.1 +++ b/docs/man/xl.pod.1 @@ -1345,6 +1345,43 @@ List pass-through pci devices for a domain. =back +=head1 USB PASS-THROUGH + +=over 4 + +=item B I I + +Create a new USB controller in the domain specified by I, +I describes the device to attach, using form +C
[Xen-devel] [RESEND][PATCH V16 1/6] libxl: export some functions for pvusb use
Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: Wei Liu <wei.l...@citrix.com> Acked-by: Ian Jackson <ian.jack...@eu.citrix.com> --- tools/libxl/libxl.c | 5 ++--- tools/libxl/libxl_internal.h | 3 +++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 833fd40..2ac9c0f 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -1966,7 +1966,7 @@ out: } /* common function to get next device id */ -static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) +int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) { char *dompath, **l; unsigned int nb; @@ -1985,8 +1985,7 @@ static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) return nextid; } -static int libxl__resolve_domid(libxl__gc *gc, const char *name, -uint32_t *domid) +int libxl__resolve_domid(libxl__gc *gc, const char *name, uint32_t *domid) { if (!name) return 0; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index cb9790b..9c8519a 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1180,6 +1180,9 @@ _hidden int libxl__init_console_from_channel(libxl__gc *gc, libxl__device_console *console, int dev_num, libxl_device_channel *channel); +_hidden int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device); +_hidden int libxl__resolve_domid(libxl__gc *gc, const char *name, + uint32_t *domid); /* * For each aggregate type which can be used as an input we provide: -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V16 5/6] domcreate: support pvusb in configuration file
Add code to support pvusb in domain config file. One could specify usbctrl and usb in domain's configuration file and create domain, then usb controllers will be created and usb device would be attached to guest automatically. One could specify usb controllers and usb devices in config file like this: usbctrl=['version=2,ports=4', 'version=1, ports=4', ] usbdev=['hostbus=2, hostaddr=1, controller=0,port=1', ] Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: George Dunlap <george.dun...@citrix.com> Acked-by: Ian Jackson <ian.jack...@eu.citrix.com> --- docs/man/xl.cfg.pod.5| 84 + tools/libxl/libxl_create.c | 73 +++-- tools/libxl/libxl_device.c | 4 ++ tools/libxl/libxl_internal.h | 8 tools/libxl/xl_cmdimpl.c | 107 ++- 5 files changed, 272 insertions(+), 4 deletions(-) diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 index 56b1117..b156caa 100644 --- a/docs/man/xl.cfg.pod.5 +++ b/docs/man/xl.cfg.pod.5 @@ -722,6 +722,90 @@ Note this may be overridden by rdm_policy option in PCI device configuration. =back +=item B
[Xen-devel] [PATCH V16 6/6] xl: add pvusb commands
Add pvusb commands: usbctrl-attach, usbctrl-detach, usb-list, usbdev-attach and usbdev-detach. To attach a usb device to guest through pvusb, one could follow following example: #xl usbctrl-attach test_vm version=1 ports=8 #xl usb-list test_vm will show the usb controllers and port usage under the domain. #xl usbdev-attach test_vm hostbus=1 hostaddr=2 will find the first usable controller:port, and attach usb device whose busnum is 1 and devnum is 6. One could also specify which and which . #xl usbdev-detach test_vm 0 1 will detach USB device under controller 0 port 1. #xl usbctrl-detach test_vm dev_id will destroy the controller with specified dev_id. Dev_id can be traced in usb-list info. Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: George Dunlap <george.dun...@citrix.com> --- docs/man/xl.pod.1 | 37 + tools/libxl/xl.h | 5 ++ tools/libxl/xl_cmdimpl.c | 190 ++ tools/libxl/xl_cmdtable.c | 25 ++ 4 files changed, 257 insertions(+) diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1 index 4279c7c..dc6213e 100644 --- a/docs/man/xl.pod.1 +++ b/docs/man/xl.pod.1 @@ -1345,6 +1345,43 @@ List pass-through pci devices for a domain. =back +=head1 USB PASS-THROUGH + +=over 4 + +=item B I I + +Create a new USB controller in the domain specified by I, +I describes the device to attach, using form +C
[Xen-devel] [PATCH V16 4/6] libxl: add pvusb API
Add pvusb APIs, including: - attach/detach (create/destroy) virtual usb controller. - attach/detach usb device - list usb controller and usb devices - some other helper functions Signed-off-by: Simon Cao <caobosi...@gmail.com> Signed-off-by: George Dunlap <george.dun...@citrix.com> Signed-off-by: Chunyan Liu <cy...@suse.com> --- Changes: * Address George's comments tools/libxl/Makefile |3 +- tools/libxl/libxl.c | 18 + tools/libxl/libxl.h | 77 ++ tools/libxl/libxl_device.c |5 +- tools/libxl/libxl_internal.h | 18 + tools/libxl/libxl_osdeps.h | 13 + tools/libxl/libxl_pvusb.c| 1620 ++ tools/libxl/libxl_types.idl | 46 + tools/libxl/libxl_types_internal.idl |1 + tools/libxl/libxl_utils.c| 18 + tools/libxl/libxl_utils.h|5 + 11 files changed, 1822 insertions(+), 2 deletions(-) create mode 100644 tools/libxl/libxl_pvusb.c diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile index 789a12e..8fa7b87 100644 --- a/tools/libxl/Makefile +++ b/tools/libxl/Makefile @@ -105,7 +105,8 @@ LIBXL_OBJS = flexarray.o libxl.o libxl_create.o libxl_dm.o libxl_pci.o \ libxl_stream_read.o libxl_stream_write.o \ libxl_save_callout.o _libxl_save_msgs_callout.o \ libxl_qmp.o libxl_event.o libxl_fork.o \ - libxl_dom_suspend.o libxl_dom_save.o $(LIBXL_OBJS-y) + libxl_dom_suspend.o libxl_dom_save.o libxl_pvusb.o \ +$(LIBXL_OBJS-y) LIBXL_OBJS += libxl_genid.o LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 2ab5ad3..1e68688 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -4102,6 +4102,8 @@ out: * libxl_device_vkb_destroy * libxl_device_vfb_remove * libxl_device_vfb_destroy + * libxl_device_usbctrl_remove + * libxl_device_usbctrl_destroy */ #define DEFINE_DEVICE_REMOVE_EXT(type, remtype, removedestroy, f)\ int libxl_device_##type##_##removedestroy(libxl_ctx *ctx, \ @@ -4159,6 +4161,10 @@ DEFINE_DEVICE_REMOVE(vfb, destroy, 1) DEFINE_DEVICE_REMOVE(vtpm, remove, 0) DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) +/* usbctrl */ +DEFINE_DEVICE_REMOVE_CUSTOM(usbctrl, remove, 0) +DEFINE_DEVICE_REMOVE_CUSTOM(usbctrl, destroy, 1) + /* channel/console hotunplug is not implemented. There are 2 possibilities: * 1. add support for secondary consoles to xenconsoled * 2. dynamically add/remove qemu chardevs via qmp messages. */ @@ -4174,6 +4180,8 @@ DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) * libxl_device_disk_add * libxl_device_nic_add * libxl_device_vtpm_add + * libxl_device_usbctrl_add + * libxl_device_usbdev_add */ #define DEFINE_DEVICE_ADD(type) \ @@ -4205,6 +4213,12 @@ DEFINE_DEVICE_ADD(nic) /* vtpm */ DEFINE_DEVICE_ADD(vtpm) +/* usbctrl */ +DEFINE_DEVICE_ADD(usbctrl) + +/* usb */ +DEFINE_DEVICE_ADD(usbdev) + #undef DEFINE_DEVICE_ADD /**/ @@ -6750,6 +6764,10 @@ int libxl_retrieve_domain_configuration(libxl_ctx *ctx, uint32_t domid, MERGE(pci, pcidevs, COMPARE_PCI, {}); +MERGE(usbctrl, usbctrls, COMPARE_USBCTRL, {}); + +MERGE(usbdev, usbdevs, COMPARE_USB, {}); + /* Take care of removable device. We maintain invariant in the * insert / remove operation so that: * 1. if xenstore is "empty" while JSON is not, the result diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 0859383..5cc3ce3 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -123,6 +123,12 @@ #define LIBXL_HAVE_DOMAIN_NODEAFFINITY 1 /* + * LIBXL_HAVE_PVUSB indicates functions for plugging in USB devices + * through pvusb -- both hotplug and at domain creation time.. + */ +#define LIBXL_HAVE_PVUSB 1 + +/* * LIBXL_HAVE_BUILDINFO_HVM_VENDOR_DEVICE indicates that the * libxl_vendor_device field is present in the hvm sections of * libxl_domain_build_info. This field tells libxl which @@ -1536,6 +1542,77 @@ int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk, const libxl_asyncop_how *ao_how) LIBXL_EXTERNAL_CALLERS_ONLY; +/* + * USB + * + * For each device removed or added, one of these protocols is available: + * - PV (i.e., PVUSB) + * - DEVICEMODEL (i.e, qemu) + * + * PV is available for either PV or HVM domains. DEVICEMODEL is only + * available for HVM domains. The caller can additionally specify + * "AUTO", in which case the library will try to determine the best + * protocol automatically. + * + * At the moment, the only protocol implemented is PV. + * + * One can add/remove USB controllers to/from guest, and att
[Xen-devel] [PATCH V16 2/6] libxl_utils: add internal function to read sysfs file contents
Add a new function libxl_read_sysfs_file_contents to handle sysfs file specially. It would be used in later pvusb work. Signed-off-by: Chunyan Liu <cy...@suse.com> Acked-by: Ian Jackson <ian.jack...@eu.citrix.com> --- tools/libxl/libxl_internal.h | 4 +++ tools/libxl/libxl_utils.c| 74 2 files changed, 78 insertions(+) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 9c8519a..429ea32 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -4078,6 +4078,10 @@ void libxl__bitmap_copy_best_effort(libxl__gc *gc, libxl_bitmap *dptr, int libxl__count_physical_sockets(libxl__gc *gc, int *sockets); +_hidden int libxl__read_sysfs_file_contents(libxl__gc *gc, +const char *filename, +void **data_r, +int *datalen_r); #define LIBXL_QEMU_USER_PREFIX "xen-qemuuser" #define LIBXL_QEMU_USER_BASE LIBXL_QEMU_USER_PREFIX"-domid" diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index 672d3f8..b0cb9e1 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -396,6 +396,80 @@ int libxl_read_file_contents(libxl_ctx *ctx, const char *filename, return e; } +int libxl__read_sysfs_file_contents(libxl__gc *gc, const char *filename, +void **data_r, int *datalen_r) +{ +FILE *f = 0; +uint8_t *data = 0; +int datalen = 0; +int e; +struct stat stab; +ssize_t rs; + +f = fopen(filename, "r"); +if (!f) { +if (errno == ENOENT) return ENOENT; +LOGE(ERROR, "failed to open %s", filename); +goto xe; +} + +if (fstat(fileno(f), )) { +LOGE(ERROR, "failed to fstat %s", filename); +goto xe; +} + +if (!S_ISREG(stab.st_mode)) { +LOGE(ERROR, "%s is not a plain file", filename); +errno = ENOTTY; +goto xe; +} + +if (stab.st_size > INT_MAX) { +LOG(ERROR, "file %s is far too large", filename); +errno = EFBIG; +goto xe; +} + +datalen = stab.st_size; + +if (stab.st_size && data_r) { +data = libxl__malloc(gc, datalen); + +/* For sysfs file, datalen is always PAGE_SIZE. 'read' + * will return the number of bytes of the actual content, + * rs <= datalen is expected. + */ +rs = fread(data, 1, datalen, f); +if (rs < datalen) { +if (ferror(f)) { +LOGE(ERROR, "failed to read %s", filename); +goto xe; +} + +datalen = rs; +data = libxl__realloc(gc, data, datalen); +} +} + +if (fclose(f)) { +f = 0; +LOGE(ERROR, "failed to close %s", filename); +goto xe; +} + +if (data_r) *data_r = data; +if (datalen_r) *datalen_r = datalen; + +return 0; + + xe: +e = errno; +assert(e != ENOENT); +if (f) fclose(f); +return e; +} + + #define READ_WRITE_EXACTLY(rw, zero_is_eof, constdata)\ \ int libxl_##rw##_exactly(libxl_ctx *ctx, int fd, \ -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V16 3/6] refactor DEFINE_DEVICE_REMOVE to fit for more device types
For some device type, device removal operation needs to be handled specially, like usbctrl, it needs to remove all usb devices under it first, then remove usbctrl. Extend DEFINE_DEVICE_REMOVE to support generic and custom way For those need to be handled specially, call DEFINE_DEVICE_REMOVE_CUSTOM, it requires user defined libxl__initiate_device_##type##_remove. Otherwise, just call DEFINE_DEVICE_REMOVE as before. Signed-off-by: George Dunlap <george.dun...@citrix.com> Signed-off-by: Chunyan Liu <cy...@suse.com> --- tools/libxl/libxl.c | 18 +- tools/libxl/libxl_device.c | 10 +- tools/libxl/libxl_internal.h | 4 ++-- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 2ac9c0f..2ab5ad3 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -3134,7 +3134,7 @@ void libxl__device_disk_local_initiate_detach(libxl__egc *egc, aodev->dev = device; aodev->callback = local_device_detach_cb; aodev->force = 0; -libxl__initiate_device_remove(egc, aodev); +libxl__initiate_device_generic_remove(egc, aodev); return; } @@ -4103,7 +4103,7 @@ out: * libxl_device_vfb_remove * libxl_device_vfb_destroy */ -#define DEFINE_DEVICE_REMOVE(type, removedestroy, f)\ +#define DEFINE_DEVICE_REMOVE_EXT(type, remtype, removedestroy, f)\ int libxl_device_##type##_##removedestroy(libxl_ctx *ctx, \ uint32_t domid, libxl_device_##type *type, \ const libxl_asyncop_how *ao_how)\ @@ -4123,13 +4123,19 @@ out: aodev->dev = device;\ aodev->callback = device_addrm_aocomplete; \ aodev->force = f; \ -libxl__initiate_device_remove(egc, aodev); \ +libxl__initiate_device_##remtype##_remove(egc, aodev); \ \ out:\ -if (rc) return AO_CREATE_FAIL(rc);\ +if (rc) return AO_CREATE_FAIL(rc); \ return AO_INPROGRESS; \ } +#define DEFINE_DEVICE_REMOVE(type, removedestroy, f) \ +DEFINE_DEVICE_REMOVE_EXT(type, generic, removedestroy, f) + +#define DEFINE_DEVICE_REMOVE_CUSTOM(type, removedestroy, f) \ +DEFINE_DEVICE_REMOVE_EXT(type, type, removedestroy, f) + /* Define all remove/destroy functions and undef the macro */ /* disk */ @@ -4158,6 +4164,8 @@ DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) * 2. dynamically add/remove qemu chardevs via qmp messages. */ #undef DEFINE_DEVICE_REMOVE +#undef DEFINE_DEVICE_REMOVE_CUSTOM +#undef DEFINE_DEVICE_REMOVE_EXT /**/ @@ -4362,7 +4370,7 @@ static int remove_device(libxl__egc *egc, libxl__ao *ao, aodev->dev = dev; aodev->action = LIBXL__DEVICE_ACTION_REMOVE; aodev->callback = device_complete; -libxl__initiate_device_remove(egc, aodev); +libxl__initiate_device_generic_remove(egc, aodev); break; case LIBXL__DEVICE_KIND_QDISK: if (--dguest->num_qdisks == 0) { diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c index 8bb5e93..a356e2a 100644 --- a/tools/libxl/libxl_device.c +++ b/tools/libxl/libxl_device.c @@ -676,7 +676,7 @@ void libxl__devices_destroy(libxl__egc *egc, libxl__devices_remove_state *drs) aodev->action = LIBXL__DEVICE_ACTION_REMOVE; aodev->dev = dev; aodev->force = drs->force; -libxl__initiate_device_remove(egc, aodev); +libxl__initiate_device_generic_remove(egc, aodev); } } } @@ -775,8 +775,8 @@ out: return; } -void libxl__initiate_device_remove(libxl__egc *egc, - libxl__ao_device *aodev) +void libxl__initiate_device_generic_remove(libxl__egc *egc, + libxl__ao_device *aodev) { STATE_AO_GC(aodev->ao); xs_transaction_t t = 0; @@ -806,7 +806,7 @@ void libxl__initiate_device_remove(libxl__egc *egc, (info.paused || info.dying || info.shutdown)) { /* * TODO: 4.2 Bodge due to QEMU, see comment on top of - * libxl__initiate_device_remove in libxl_internal.h + * libxl__initiate_device_generic_remove in libxl_internal.h */ rc = libxl__ev_time_register_rel(ao, >timeout, device_qemu_timeout, @@ -942,7 +942,7 @@ static void
[Xen-devel] [PATCH V16 0/6] xen pvusb toolstack work
USB device status of the domain by usb-list. e.g. xl usb-list domain It will list USB controllers and USB devices under each controller. You could detach a USB device with usbdev-detach command by giving controller:port e.g. xl usbdev-detach domain 0 1 You can also remove the whole USB controller by usbctrl-detach command. e.g. xl usbctrl-detach domain 0 It will remove the USB controller with index 0 and all USB devices under it. 4. PVUSB Libxl implementation * usbctrl-attach To create a usb controller, we need: 1) generate usb controler related information 2) write usb controller frontend/backend info to xenstore PVUSB frontend and backend driver will probe xenstore paths and build connection between frontend and backend. * usbctrl-detach To remove a usb controller, we need: 1) check if the usb controller exists or not 2) remove all usb devices under controller 3) remove usb controller info from xenstore * usbdev-attach To attach a usb device, we need: 1) check if the usb device type is assignable 2) check if the usb device is already assigned to a domain 3) add 'busid' of the usb device to xenstore contoller/port/. PVUSB driver watches the xenstore changes and detects that, and needs to use 'busid' to do following work. 4) unbind usb device from original driver and bind to usbback. If usb device has many interfaces, then: - unbind each interface from its original driver and bind to usbback. - store the original driver to xenstore for later rebinding when detaching the device. * usbdev-detach To detach a usb device, we need: 1) check if the usb device is assigned to the domain 2) remove the usb device from xenstore controller/port. 3) unbind usb device from usbback and rebind to its original driver. If usb device has many interfaces, do it to each interface. * usb-list List all USB controllers and USB devices under each controller. 5. PVUSB xenstore information PVUSB xenstore information includes three parts: frontend, backend and /libxl part. A USB controller is corresponding to a "vusb" device in xenstore. Adding a USB controller will add a new "vusb" device, removing a USB controller will delete the related "vusb" device. Following is an example xenstore values of a USB controller. Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "" 2 = "" 3 = "" 4 = "" Frontend: device = "" vusb = "" 0 = "" backend = "/local/domain/0/backend/vusb/1/0" backend-id = "0" state = "4" urb-ring-ref = "348" conn-ring-ref = "346" event-channel = "20" Adding a USB device won't create a new "vusb" device, but only write the USB device busid to one port of USB controller. For example, attaching a USB device (busid is 2-1.6) to above USB controller port 1, it only need write 2-1.6 to port 1 of this USB controller: Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "2-1.6" 2 = "" 3 = "" 4 = "" Frontend doesn't change. Since assign a host USB device to guest, we'll unbind USB interfaces from their original drivers and bind them to usbback. After detaching this USB device from guest, one would hope the USB interfaces could be rebind to their original drivers, so there should some place to get the original driver info. To support that, when attaching a USB device to guest, we'll save the original driver info in xenstore too, the place is /libxl/usbback, for example: libxl = "" 1 = "" dm-version = "qemu_xen" usbback = "" 3-11 = "" 3-11@1_0 = "" driver_path = "/sys/bus/usb/drivers/btusb" In this example, USB device (busid is 3-11, /sys/bus/usb/devices/3-11). It has interface 3-11:1.0, whose original dirver is btusb. Since xenstore doesn't allow ':' and '.' in a key, so we encode the interface by changing ':' to '@' and changing '.' to '_'. When detaching the USB device from guest, we can rebind 3-11:1.0 to btusb driver. Chunyan Liu (6): libxl: export some functions for pvusb use libxl_utils: add internal function to read sysfs file contents
[Xen-devel] [PATCH V16 1/6] libxl: export some functions for pvusb use
Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: Wei Liu <wei.l...@citrix.com> Acked-by: Ian Jackson <ian.jack...@eu.citrix.com> --- tools/libxl/libxl.c | 5 ++--- tools/libxl/libxl_internal.h | 3 +++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 833fd40..2ac9c0f 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -1966,7 +1966,7 @@ out: } /* common function to get next device id */ -static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) +int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) { char *dompath, **l; unsigned int nb; @@ -1985,8 +1985,7 @@ static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) return nextid; } -static int libxl__resolve_domid(libxl__gc *gc, const char *name, -uint32_t *domid) +int libxl__resolve_domid(libxl__gc *gc, const char *name, uint32_t *domid) { if (!name) return 0; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index cb9790b..9c8519a 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1180,6 +1180,9 @@ _hidden int libxl__init_console_from_channel(libxl__gc *gc, libxl__device_console *console, int dev_num, libxl_device_channel *channel); +_hidden int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device); +_hidden int libxl__resolve_domid(libxl__gc *gc, const char *name, + uint32_t *domid); /* * For each aggregate type which can be used as an input we provide: -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V16 3/6] refactor DEFINE_DEVICE_REMOVE to fit for more device types
For some device type, device removal operation needs to be handled specially, like usbctrl, it needs to remove all usb devices under it first, then remove usbctrl. Extend DEFINE_DEVICE_REMOVE to support generic and custom way For those need to be handled specially, call DEFINE_DEVICE_REMOVE_CUSTOM, it requires user defined libxl__initiate_device_##type##_remove. Otherwise, just call DEFINE_DEVICE_REMOVE as before. Signed-off-by: George Dunlap <george.dun...@citrix.com> Signed-off-by: Chunyan Liu <cy...@suse.com> --- tools/libxl/libxl.c | 18 +- tools/libxl/libxl_device.c | 10 +- tools/libxl/libxl_internal.h | 4 ++-- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 2ac9c0f..2ab5ad3 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -3134,7 +3134,7 @@ void libxl__device_disk_local_initiate_detach(libxl__egc *egc, aodev->dev = device; aodev->callback = local_device_detach_cb; aodev->force = 0; -libxl__initiate_device_remove(egc, aodev); +libxl__initiate_device_generic_remove(egc, aodev); return; } @@ -4103,7 +4103,7 @@ out: * libxl_device_vfb_remove * libxl_device_vfb_destroy */ -#define DEFINE_DEVICE_REMOVE(type, removedestroy, f)\ +#define DEFINE_DEVICE_REMOVE_EXT(type, remtype, removedestroy, f)\ int libxl_device_##type##_##removedestroy(libxl_ctx *ctx, \ uint32_t domid, libxl_device_##type *type, \ const libxl_asyncop_how *ao_how)\ @@ -4123,13 +4123,19 @@ out: aodev->dev = device;\ aodev->callback = device_addrm_aocomplete; \ aodev->force = f; \ -libxl__initiate_device_remove(egc, aodev); \ +libxl__initiate_device_##remtype##_remove(egc, aodev); \ \ out:\ -if (rc) return AO_CREATE_FAIL(rc);\ +if (rc) return AO_CREATE_FAIL(rc); \ return AO_INPROGRESS; \ } +#define DEFINE_DEVICE_REMOVE(type, removedestroy, f) \ +DEFINE_DEVICE_REMOVE_EXT(type, generic, removedestroy, f) + +#define DEFINE_DEVICE_REMOVE_CUSTOM(type, removedestroy, f) \ +DEFINE_DEVICE_REMOVE_EXT(type, type, removedestroy, f) + /* Define all remove/destroy functions and undef the macro */ /* disk */ @@ -4158,6 +4164,8 @@ DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) * 2. dynamically add/remove qemu chardevs via qmp messages. */ #undef DEFINE_DEVICE_REMOVE +#undef DEFINE_DEVICE_REMOVE_CUSTOM +#undef DEFINE_DEVICE_REMOVE_EXT /**/ @@ -4362,7 +4370,7 @@ static int remove_device(libxl__egc *egc, libxl__ao *ao, aodev->dev = dev; aodev->action = LIBXL__DEVICE_ACTION_REMOVE; aodev->callback = device_complete; -libxl__initiate_device_remove(egc, aodev); +libxl__initiate_device_generic_remove(egc, aodev); break; case LIBXL__DEVICE_KIND_QDISK: if (--dguest->num_qdisks == 0) { diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c index 8bb5e93..a356e2a 100644 --- a/tools/libxl/libxl_device.c +++ b/tools/libxl/libxl_device.c @@ -676,7 +676,7 @@ void libxl__devices_destroy(libxl__egc *egc, libxl__devices_remove_state *drs) aodev->action = LIBXL__DEVICE_ACTION_REMOVE; aodev->dev = dev; aodev->force = drs->force; -libxl__initiate_device_remove(egc, aodev); +libxl__initiate_device_generic_remove(egc, aodev); } } } @@ -775,8 +775,8 @@ out: return; } -void libxl__initiate_device_remove(libxl__egc *egc, - libxl__ao_device *aodev) +void libxl__initiate_device_generic_remove(libxl__egc *egc, + libxl__ao_device *aodev) { STATE_AO_GC(aodev->ao); xs_transaction_t t = 0; @@ -806,7 +806,7 @@ void libxl__initiate_device_remove(libxl__egc *egc, (info.paused || info.dying || info.shutdown)) { /* * TODO: 4.2 Bodge due to QEMU, see comment on top of - * libxl__initiate_device_remove in libxl_internal.h + * libxl__initiate_device_generic_remove in libxl_internal.h */ rc = libxl__ev_time_register_rel(ao, >timeout, device_qemu_timeout, @@ -942,7 +942,7 @@ static void
[Xen-devel] [PATCH V16 2/6] libxl_utils: add internal function to read sysfs file contents
Add a new function libxl_read_sysfs_file_contents to handle sysfs file specially. It would be used in later pvusb work. Signed-off-by: Chunyan Liu <cy...@suse.com> Acked-by: Ian Jackson <ian.jack...@eu.citrix.com> --- tools/libxl/libxl_internal.h | 4 +++ tools/libxl/libxl_utils.c| 74 2 files changed, 78 insertions(+) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 9c8519a..429ea32 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -4078,6 +4078,10 @@ void libxl__bitmap_copy_best_effort(libxl__gc *gc, libxl_bitmap *dptr, int libxl__count_physical_sockets(libxl__gc *gc, int *sockets); +_hidden int libxl__read_sysfs_file_contents(libxl__gc *gc, +const char *filename, +void **data_r, +int *datalen_r); #define LIBXL_QEMU_USER_PREFIX "xen-qemuuser" #define LIBXL_QEMU_USER_BASE LIBXL_QEMU_USER_PREFIX"-domid" diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index 672d3f8..b0cb9e1 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -396,6 +396,80 @@ int libxl_read_file_contents(libxl_ctx *ctx, const char *filename, return e; } +int libxl__read_sysfs_file_contents(libxl__gc *gc, const char *filename, +void **data_r, int *datalen_r) +{ +FILE *f = 0; +uint8_t *data = 0; +int datalen = 0; +int e; +struct stat stab; +ssize_t rs; + +f = fopen(filename, "r"); +if (!f) { +if (errno == ENOENT) return ENOENT; +LOGE(ERROR, "failed to open %s", filename); +goto xe; +} + +if (fstat(fileno(f), )) { +LOGE(ERROR, "failed to fstat %s", filename); +goto xe; +} + +if (!S_ISREG(stab.st_mode)) { +LOGE(ERROR, "%s is not a plain file", filename); +errno = ENOTTY; +goto xe; +} + +if (stab.st_size > INT_MAX) { +LOG(ERROR, "file %s is far too large", filename); +errno = EFBIG; +goto xe; +} + +datalen = stab.st_size; + +if (stab.st_size && data_r) { +data = libxl__malloc(gc, datalen); + +/* For sysfs file, datalen is always PAGE_SIZE. 'read' + * will return the number of bytes of the actual content, + * rs <= datalen is expected. + */ +rs = fread(data, 1, datalen, f); +if (rs < datalen) { +if (ferror(f)) { +LOGE(ERROR, "failed to read %s", filename); +goto xe; +} + +datalen = rs; +data = libxl__realloc(gc, data, datalen); +} +} + +if (fclose(f)) { +f = 0; +LOGE(ERROR, "failed to close %s", filename); +goto xe; +} + +if (data_r) *data_r = data; +if (datalen_r) *datalen_r = datalen; + +return 0; + + xe: +e = errno; +assert(e != ENOENT); +if (f) fclose(f); +return e; +} + + #define READ_WRITE_EXACTLY(rw, zero_is_eof, constdata)\ \ int libxl_##rw##_exactly(libxl_ctx *ctx, int fd, \ -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V16 1/6] libxl: export some functions for pvusb use
Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: Wei Liu <wei.l...@citrix.com> Acked-by: Ian Jackson <ian.jack...@eu.citrix.com> --- tools/libxl/libxl.c | 5 ++--- tools/libxl/libxl_internal.h | 3 +++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 833fd40..2ac9c0f 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -1966,7 +1966,7 @@ out: } /* common function to get next device id */ -static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) +int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) { char *dompath, **l; unsigned int nb; @@ -1985,8 +1985,7 @@ static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) return nextid; } -static int libxl__resolve_domid(libxl__gc *gc, const char *name, -uint32_t *domid) +int libxl__resolve_domid(libxl__gc *gc, const char *name, uint32_t *domid) { if (!name) return 0; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index cb9790b..9c8519a 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1180,6 +1180,9 @@ _hidden int libxl__init_console_from_channel(libxl__gc *gc, libxl__device_console *console, int dev_num, libxl_device_channel *channel); +_hidden int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device); +_hidden int libxl__resolve_domid(libxl__gc *gc, const char *name, + uint32_t *domid); /* * For each aggregate type which can be used as an input we provide: -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V16 0/6] xen pvusb toolstack work
USB device status of the domain by usb-list. e.g. xl usb-list domain It will list USB controllers and USB devices under each controller. You could detach a USB device with usbdev-detach command by giving controller:port e.g. xl usbdev-detach domain 0 1 You can also remove the whole USB controller by usbctrl-detach command. e.g. xl usbctrl-detach domain 0 It will remove the USB controller with index 0 and all USB devices under it. 4. PVUSB Libxl implementation * usbctrl-attach To create a usb controller, we need: 1) generate usb controler related information 2) write usb controller frontend/backend info to xenstore PVUSB frontend and backend driver will probe xenstore paths and build connection between frontend and backend. * usbctrl-detach To remove a usb controller, we need: 1) check if the usb controller exists or not 2) remove all usb devices under controller 3) remove usb controller info from xenstore * usbdev-attach To attach a usb device, we need: 1) check if the usb device type is assignable 2) check if the usb device is already assigned to a domain 3) add 'busid' of the usb device to xenstore contoller/port/. PVUSB driver watches the xenstore changes and detects that, and needs to use 'busid' to do following work. 4) unbind usb device from original driver and bind to usbback. If usb device has many interfaces, then: - unbind each interface from its original driver and bind to usbback. - store the original driver to xenstore for later rebinding when detaching the device. * usbdev-detach To detach a usb device, we need: 1) check if the usb device is assigned to the domain 2) remove the usb device from xenstore controller/port. 3) unbind usb device from usbback and rebind to its original driver. If usb device has many interfaces, do it to each interface. * usb-list List all USB controllers and USB devices under each controller. 5. PVUSB xenstore information PVUSB xenstore information includes three parts: frontend, backend and /libxl part. A USB controller is corresponding to a "vusb" device in xenstore. Adding a USB controller will add a new "vusb" device, removing a USB controller will delete the related "vusb" device. Following is an example xenstore values of a USB controller. Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "" 2 = "" 3 = "" 4 = "" Frontend: device = "" vusb = "" 0 = "" backend = "/local/domain/0/backend/vusb/1/0" backend-id = "0" state = "4" urb-ring-ref = "348" conn-ring-ref = "346" event-channel = "20" Adding a USB device won't create a new "vusb" device, but only write the USB device busid to one port of USB controller. For example, attaching a USB device (busid is 2-1.6) to above USB controller port 1, it only need write 2-1.6 to port 1 of this USB controller: Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "2-1.6" 2 = "" 3 = "" 4 = "" Frontend doesn't change. Since assign a host USB device to guest, we'll unbind USB interfaces from their original drivers and bind them to usbback. After detaching this USB device from guest, one would hope the USB interfaces could be rebind to their original drivers, so there should some place to get the original driver info. To support that, when attaching a USB device to guest, we'll save the original driver info in xenstore too, the place is /libxl/usbback, for example: libxl = "" 1 = "" dm-version = "qemu_xen" usbback = "" 3-11 = "" 3-11@1_0 = "" driver_path = "/sys/bus/usb/drivers/btusb" In this example, USB device (busid is 3-11, /sys/bus/usb/devices/3-11). It has interface 3-11:1.0, whose original dirver is btusb. Since xenstore doesn't allow ':' and '.' in a key, so we encode the interface by changing ':' to '@' and changing '.' to '_'. When detaching the USB device from guest, we can rebind 3-11:1.0 to btusb driver. Chunyan Liu (6): libxl: export some functions for pvusb use libxl_utils: add internal function to read sysfs file contents
[Xen-devel] [PATCH V15 1/6] libxl: export some functions for pvusb use
Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: Wei Liu <wei.l...@citrix.com> Acked-by: Ian Jackson <ian.jack...@eu.citrix.com> --- tools/libxl/libxl.c | 5 ++--- tools/libxl/libxl_internal.h | 3 +++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 833fd40..2ac9c0f 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -1966,7 +1966,7 @@ out: } /* common function to get next device id */ -static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) +int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) { char *dompath, **l; unsigned int nb; @@ -1985,8 +1985,7 @@ static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) return nextid; } -static int libxl__resolve_domid(libxl__gc *gc, const char *name, -uint32_t *domid) +int libxl__resolve_domid(libxl__gc *gc, const char *name, uint32_t *domid) { if (!name) return 0; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 3da6427..9ea62e8 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1180,6 +1180,9 @@ _hidden int libxl__init_console_from_channel(libxl__gc *gc, libxl__device_console *console, int dev_num, libxl_device_channel *channel); +_hidden int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device); +_hidden int libxl__resolve_domid(libxl__gc *gc, const char *name, + uint32_t *domid); /* * For each aggregate type which can be used as an input we provide: -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V15 0/6] xen pvusb toolstack work
USB device status of the domain by usb-list. e.g. xl usb-list domain It will list USB controllers and USB devices under each controller. You could detach a USB device with usbdev-detach command by giving controller:port e.g. xl usbdev-detach domain 0 1 You can also remove the whole USB controller by usbctrl-detach command. e.g. xl usbctrl-detach domain 0 It will remove the USB controller with index 0 and all USB devices under it. 4. PVUSB Libxl implementation * usbctrl-attach To create a usb controller, we need: 1) generate usb controler related information 2) write usb controller frontend/backend info to xenstore PVUSB frontend and backend driver will probe xenstore paths and build connection between frontend and backend. * usbctrl-detach To remove a usb controller, we need: 1) check if the usb controller exists or not 2) remove all usb devices under controller 3) remove usb controller info from xenstore * usbdev-attach To attach a usb device, we need: 1) check if the usb device type is assignable 2) check if the usb device is already assigned to a domain 3) add 'busid' of the usb device to xenstore contoller/port/. PVUSB driver watches the xenstore changes and detects that, and needs to use 'busid' to do following work. 4) unbind usb device from original driver and bind to usbback. If usb device has many interfaces, then: - unbind each interface from its original driver and bind to usbback. - store the original driver to xenstore for later rebinding when detaching the device. * usbdev-detach To detach a usb device, we need: 1) check if the usb device is assigned to the domain 2) remove the usb device from xenstore controller/port. 3) unbind usb device from usbback and rebind to its original driver. If usb device has many interfaces, do it to each interface. * usb-list List all USB controllers and USB devices under each controller. 5. PVUSB xenstore information PVUSB xenstore information includes three parts: frontend, backend and /libxl part. A USB controller is corresponding to a "vusb" device in xenstore. Adding a USB controller will add a new "vusb" device, removing a USB controller will delete the related "vusb" device. Following is an example xenstore values of a USB controller. Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "" 2 = "" 3 = "" 4 = "" Frontend: device = "" vusb = "" 0 = "" backend = "/local/domain/0/backend/vusb/1/0" backend-id = "0" state = "4" urb-ring-ref = "348" conn-ring-ref = "346" event-channel = "20" Adding a USB device won't create a new "vusb" device, but only write the USB device busid to one port of USB controller. For example, attaching a USB device (busid is 2-1.6) to above USB controller port 1, it only need write 2-1.6 to port 1 of this USB controller: Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "2-1.6" 2 = "" 3 = "" 4 = "" Frontend doesn't change. Since assign a host USB device to guest, we'll unbind USB interfaces from their original drivers and bind them to usbback. After detaching this USB device from guest, one would hope the USB interfaces could be rebind to their original drivers, so there should some place to get the original driver info. To support that, when attaching a USB device to guest, we'll save the original driver info in xenstore too, the place is /libxl/usbback, for example: libxl = "" 1 = "" dm-version = "qemu_xen" usbback = "" 3-11 = "" 3-11@1_0 = "" driver_path = "/sys/bus/usb/drivers/btusb" In this example, USB device (busid is 3-11, /sys/bus/usb/devices/3-11). It has interface 3-11:1.0, whose original dirver is btusb. Since xenstore doesn't allow ':' and '.' in a key, so we encode the interface by changing ':' to '@' and changing '.' to '_'. When detaching the USB device from guest, we can rebind 3-11:1.0 to btusb driver. Chunyan Liu (6): libxl: export some functions for pvusb use libxl_utils: add internal function to read sysfs file contents refactor
[Xen-devel] [PATCH V15 4/6] libxl: add pvusb API
Add pvusb APIs, including: - attach/detach (create/destroy) virtual usb controller. - attach/detach usb device - list usb controller and usb devices - some other helper functions Signed-off-by: Simon Cao <caobosi...@gmail.com> Signed-off-by: George Dunlap <george.dun...@citrix.com> Signed-off-by: Chunyan Liu <cy...@suse.com> --- Changes: reorder usbdev_remove to following three steps: 1. Unassign all interfaces from usbback, stopping and returning an error as soon as one attempt fails 2. Remove the pvusb xenstore nodes, stopping and returning an error if it fails 3. Attempt to re-assign all interfaces to the original drivers, stopping and returning an error as soon as one attempt fails. tools/libxl/Makefile |3 +- tools/libxl/libxl.c | 18 + tools/libxl/libxl.h | 77 ++ tools/libxl/libxl_device.c |5 +- tools/libxl/libxl_internal.h | 18 + tools/libxl/libxl_osdeps.h | 13 + tools/libxl/libxl_pvusb.c| 1596 ++ tools/libxl/libxl_types.idl | 46 + tools/libxl/libxl_types_internal.idl |1 + tools/libxl/libxl_utils.c| 18 + tools/libxl/libxl_utils.h|5 + 11 files changed, 1798 insertions(+), 2 deletions(-) create mode 100644 tools/libxl/libxl_pvusb.c diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile index 789a12e..8fa7b87 100644 --- a/tools/libxl/Makefile +++ b/tools/libxl/Makefile @@ -105,7 +105,8 @@ LIBXL_OBJS = flexarray.o libxl.o libxl_create.o libxl_dm.o libxl_pci.o \ libxl_stream_read.o libxl_stream_write.o \ libxl_save_callout.o _libxl_save_msgs_callout.o \ libxl_qmp.o libxl_event.o libxl_fork.o \ - libxl_dom_suspend.o libxl_dom_save.o $(LIBXL_OBJS-y) + libxl_dom_suspend.o libxl_dom_save.o libxl_pvusb.o \ +$(LIBXL_OBJS-y) LIBXL_OBJS += libxl_genid.o LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 2ab5ad3..1e68688 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -4102,6 +4102,8 @@ out: * libxl_device_vkb_destroy * libxl_device_vfb_remove * libxl_device_vfb_destroy + * libxl_device_usbctrl_remove + * libxl_device_usbctrl_destroy */ #define DEFINE_DEVICE_REMOVE_EXT(type, remtype, removedestroy, f)\ int libxl_device_##type##_##removedestroy(libxl_ctx *ctx, \ @@ -4159,6 +4161,10 @@ DEFINE_DEVICE_REMOVE(vfb, destroy, 1) DEFINE_DEVICE_REMOVE(vtpm, remove, 0) DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) +/* usbctrl */ +DEFINE_DEVICE_REMOVE_CUSTOM(usbctrl, remove, 0) +DEFINE_DEVICE_REMOVE_CUSTOM(usbctrl, destroy, 1) + /* channel/console hotunplug is not implemented. There are 2 possibilities: * 1. add support for secondary consoles to xenconsoled * 2. dynamically add/remove qemu chardevs via qmp messages. */ @@ -4174,6 +4180,8 @@ DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) * libxl_device_disk_add * libxl_device_nic_add * libxl_device_vtpm_add + * libxl_device_usbctrl_add + * libxl_device_usbdev_add */ #define DEFINE_DEVICE_ADD(type) \ @@ -4205,6 +4213,12 @@ DEFINE_DEVICE_ADD(nic) /* vtpm */ DEFINE_DEVICE_ADD(vtpm) +/* usbctrl */ +DEFINE_DEVICE_ADD(usbctrl) + +/* usb */ +DEFINE_DEVICE_ADD(usbdev) + #undef DEFINE_DEVICE_ADD /**/ @@ -6750,6 +6764,10 @@ int libxl_retrieve_domain_configuration(libxl_ctx *ctx, uint32_t domid, MERGE(pci, pcidevs, COMPARE_PCI, {}); +MERGE(usbctrl, usbctrls, COMPARE_USBCTRL, {}); + +MERGE(usbdev, usbdevs, COMPARE_USB, {}); + /* Take care of removable device. We maintain invariant in the * insert / remove operation so that: * 1. if xenstore is "empty" while JSON is not, the result diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 0859383..5cc3ce3 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -123,6 +123,12 @@ #define LIBXL_HAVE_DOMAIN_NODEAFFINITY 1 /* + * LIBXL_HAVE_PVUSB indicates functions for plugging in USB devices + * through pvusb -- both hotplug and at domain creation time.. + */ +#define LIBXL_HAVE_PVUSB 1 + +/* * LIBXL_HAVE_BUILDINFO_HVM_VENDOR_DEVICE indicates that the * libxl_vendor_device field is present in the hvm sections of * libxl_domain_build_info. This field tells libxl which @@ -1536,6 +1542,77 @@ int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk, const libxl_asyncop_how *ao_how) LIBXL_EXTERNAL_CALLERS_ONLY; +/* + * USB + * + * For each device removed or added, one of these protocols is available: + * - PV (i.e., PVUSB) + * - DEVICEMODEL (i.e, qemu) + * + * PV is available
[Xen-devel] [PATCH V15 3/6] refactor DEFINE_DEVICE_REMOVE to fit for more device types
For some device type, device removal operation needs to be handled specially, like usbctrl, it needs to remove all usb devices under it first, then remove usbctrl. Extend DEFINE_DEVICE_REMOVE to support generic and custom way For those need to be handled specially, call DEFINE_DEVICE_REMOVE_CUSTOM, it requires user defined libxl__initiate_device_##type##_remove. Otherwise, just call DEFINE_DEVICE_REMOVE as before. Signed-off-by: George Dunlap <george.dun...@citrix.com> Signed-off-by: Chunyan Liu <cy...@suse.com> --- tools/libxl/libxl.c | 18 +- tools/libxl/libxl_device.c | 10 +- tools/libxl/libxl_internal.h | 4 ++-- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 2ac9c0f..2ab5ad3 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -3134,7 +3134,7 @@ void libxl__device_disk_local_initiate_detach(libxl__egc *egc, aodev->dev = device; aodev->callback = local_device_detach_cb; aodev->force = 0; -libxl__initiate_device_remove(egc, aodev); +libxl__initiate_device_generic_remove(egc, aodev); return; } @@ -4103,7 +4103,7 @@ out: * libxl_device_vfb_remove * libxl_device_vfb_destroy */ -#define DEFINE_DEVICE_REMOVE(type, removedestroy, f)\ +#define DEFINE_DEVICE_REMOVE_EXT(type, remtype, removedestroy, f)\ int libxl_device_##type##_##removedestroy(libxl_ctx *ctx, \ uint32_t domid, libxl_device_##type *type, \ const libxl_asyncop_how *ao_how)\ @@ -4123,13 +4123,19 @@ out: aodev->dev = device;\ aodev->callback = device_addrm_aocomplete; \ aodev->force = f; \ -libxl__initiate_device_remove(egc, aodev); \ +libxl__initiate_device_##remtype##_remove(egc, aodev); \ \ out:\ -if (rc) return AO_CREATE_FAIL(rc);\ +if (rc) return AO_CREATE_FAIL(rc); \ return AO_INPROGRESS; \ } +#define DEFINE_DEVICE_REMOVE(type, removedestroy, f) \ +DEFINE_DEVICE_REMOVE_EXT(type, generic, removedestroy, f) + +#define DEFINE_DEVICE_REMOVE_CUSTOM(type, removedestroy, f) \ +DEFINE_DEVICE_REMOVE_EXT(type, type, removedestroy, f) + /* Define all remove/destroy functions and undef the macro */ /* disk */ @@ -4158,6 +4164,8 @@ DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) * 2. dynamically add/remove qemu chardevs via qmp messages. */ #undef DEFINE_DEVICE_REMOVE +#undef DEFINE_DEVICE_REMOVE_CUSTOM +#undef DEFINE_DEVICE_REMOVE_EXT /**/ @@ -4362,7 +4370,7 @@ static int remove_device(libxl__egc *egc, libxl__ao *ao, aodev->dev = dev; aodev->action = LIBXL__DEVICE_ACTION_REMOVE; aodev->callback = device_complete; -libxl__initiate_device_remove(egc, aodev); +libxl__initiate_device_generic_remove(egc, aodev); break; case LIBXL__DEVICE_KIND_QDISK: if (--dguest->num_qdisks == 0) { diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c index 8bb5e93..a356e2a 100644 --- a/tools/libxl/libxl_device.c +++ b/tools/libxl/libxl_device.c @@ -676,7 +676,7 @@ void libxl__devices_destroy(libxl__egc *egc, libxl__devices_remove_state *drs) aodev->action = LIBXL__DEVICE_ACTION_REMOVE; aodev->dev = dev; aodev->force = drs->force; -libxl__initiate_device_remove(egc, aodev); +libxl__initiate_device_generic_remove(egc, aodev); } } } @@ -775,8 +775,8 @@ out: return; } -void libxl__initiate_device_remove(libxl__egc *egc, - libxl__ao_device *aodev) +void libxl__initiate_device_generic_remove(libxl__egc *egc, + libxl__ao_device *aodev) { STATE_AO_GC(aodev->ao); xs_transaction_t t = 0; @@ -806,7 +806,7 @@ void libxl__initiate_device_remove(libxl__egc *egc, (info.paused || info.dying || info.shutdown)) { /* * TODO: 4.2 Bodge due to QEMU, see comment on top of - * libxl__initiate_device_remove in libxl_internal.h + * libxl__initiate_device_generic_remove in libxl_internal.h */ rc = libxl__ev_time_register_rel(ao, >timeout, device_qemu_timeout, @@ -942,7 +942,7 @@ static void
[Xen-devel] [PATCH V15 5/6] domcreate: support pvusb in configuration file
Add code to support pvusb in domain config file. One could specify usbctrl and usb in domain's configuration file and create domain, then usb controllers will be created and usb device would be attached to guest automatically. One could specify usb controllers and usb devices in config file like this: usbctrl=['version=2,ports=4', 'version=1, ports=4', ] usbdev=['hostbus=2, hostaddr=1, controller=0,port=1', ] Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: George Dunlap <george.dun...@citrix.com> Acked-by: Ian Jackson <ian.jack...@eu.citrix.com> --- docs/man/xl.cfg.pod.5| 84 + tools/libxl/libxl_create.c | 73 +++-- tools/libxl/libxl_device.c | 4 ++ tools/libxl/libxl_internal.h | 8 tools/libxl/xl_cmdimpl.c | 107 ++- 5 files changed, 272 insertions(+), 4 deletions(-) diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 index 40690bd..7eecdc1 100644 --- a/docs/man/xl.cfg.pod.5 +++ b/docs/man/xl.cfg.pod.5 @@ -722,6 +722,90 @@ Note this may be overridden by rdm_policy option in PCI device configuration. =back +=item B
[Xen-devel] [PATCH V15 2/6] libxl_utils: add internal function to read sysfs file contents
Add a new function libxl_read_sysfs_file_contents to handle sysfs file specially. It would be used in later pvusb work. Signed-off-by: Chunyan Liu <cy...@suse.com> Acked-by: Ian Jackson <ian.jack...@eu.citrix.com> --- tools/libxl/libxl_internal.h | 4 +++ tools/libxl/libxl_utils.c| 74 2 files changed, 78 insertions(+) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 9ea62e8..21b9b8c 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -4078,6 +4078,10 @@ void libxl__bitmap_copy_best_effort(libxl__gc *gc, libxl_bitmap *dptr, int libxl__count_physical_sockets(libxl__gc *gc, int *sockets); +_hidden int libxl__read_sysfs_file_contents(libxl__gc *gc, +const char *filename, +void **data_r, +int *datalen_r); #define LIBXL_QEMU_USER_PREFIX "xen-qemuuser" #define LIBXL_QEMU_USER_BASE LIBXL_QEMU_USER_PREFIX"-domid" diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index 672d3f8..b0cb9e1 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -396,6 +396,80 @@ int libxl_read_file_contents(libxl_ctx *ctx, const char *filename, return e; } +int libxl__read_sysfs_file_contents(libxl__gc *gc, const char *filename, +void **data_r, int *datalen_r) +{ +FILE *f = 0; +uint8_t *data = 0; +int datalen = 0; +int e; +struct stat stab; +ssize_t rs; + +f = fopen(filename, "r"); +if (!f) { +if (errno == ENOENT) return ENOENT; +LOGE(ERROR, "failed to open %s", filename); +goto xe; +} + +if (fstat(fileno(f), )) { +LOGE(ERROR, "failed to fstat %s", filename); +goto xe; +} + +if (!S_ISREG(stab.st_mode)) { +LOGE(ERROR, "%s is not a plain file", filename); +errno = ENOTTY; +goto xe; +} + +if (stab.st_size > INT_MAX) { +LOG(ERROR, "file %s is far too large", filename); +errno = EFBIG; +goto xe; +} + +datalen = stab.st_size; + +if (stab.st_size && data_r) { +data = libxl__malloc(gc, datalen); + +/* For sysfs file, datalen is always PAGE_SIZE. 'read' + * will return the number of bytes of the actual content, + * rs <= datalen is expected. + */ +rs = fread(data, 1, datalen, f); +if (rs < datalen) { +if (ferror(f)) { +LOGE(ERROR, "failed to read %s", filename); +goto xe; +} + +datalen = rs; +data = libxl__realloc(gc, data, datalen); +} +} + +if (fclose(f)) { +f = 0; +LOGE(ERROR, "failed to close %s", filename); +goto xe; +} + +if (data_r) *data_r = data; +if (datalen_r) *datalen_r = datalen; + +return 0; + + xe: +e = errno; +assert(e != ENOENT); +if (f) fclose(f); +return e; +} + + #define READ_WRITE_EXACTLY(rw, zero_is_eof, constdata)\ \ int libxl_##rw##_exactly(libxl_ctx *ctx, int fd, \ -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V15 6/6] xl: add pvusb commands
Add pvusb commands: usbctrl-attach, usbctrl-detach, usb-list, usbdev-attach and usbdev-detach. To attach a usb device to guest through pvusb, one could follow following example: #xl usbctrl-attach test_vm version=1 ports=8 #xl usb-list test_vm will show the usb controllers and port usage under the domain. #xl usbdev-attach test_vm hostbus=1 hostaddr=2 will find the first usable controller:port, and attach usb device whose busnum is 1 and devnum is 6. One could also specify which and which . #xl usbdev-detach test_vm 0 1 will detach USB device under controller 0 port 1. #xl usbctrl-detach test_vm dev_id will destroy the controller with specified dev_id. Dev_id can be traced in usb-list info. Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: George Dunlap <george.dun...@citrix.com> --- docs/man/xl.pod.1 | 37 + tools/libxl/xl.h | 5 ++ tools/libxl/xl_cmdimpl.c | 190 ++ tools/libxl/xl_cmdtable.c | 25 ++ 4 files changed, 257 insertions(+) diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1 index 4279c7c..dc6213e 100644 --- a/docs/man/xl.pod.1 +++ b/docs/man/xl.pod.1 @@ -1345,6 +1345,43 @@ List pass-through pci devices for a domain. =back +=head1 USB PASS-THROUGH + +=over 4 + +=item B I I + +Create a new USB controller in the domain specified by I, +I describes the device to attach, using form +C
[Xen-devel] [PATCH V14 4/6] libxl: add pvusb API
Add pvusb APIs, including: - attach/detach (create/destroy) virtual usb controller. - attach/detach usb device - list usb controller and usb devices - some other helper functions Signed-off-by: Simon Cao <caobosi...@gmail.com> Signed-off-by: George Dunlap <george.dun...@citrix.com> Signed-off-by: Chunyan Liu <cy...@suse.com> --- changes: Address Olaf's comments: * move DEFINE_DEVICE_REMOVE changes to a separate patch Address Ian's comments: * adjust order of removing xenstore and bind/unbind driver in usb_remove. * reuse libxl_write_exactly in usbintf_bind/unbind * several coding style fix tools/libxl/Makefile |2 +- tools/libxl/libxl.c | 18 + tools/libxl/libxl.h | 77 ++ tools/libxl/libxl_device.c |5 +- tools/libxl/libxl_internal.h | 18 + tools/libxl/libxl_osdeps.h | 13 + tools/libxl/libxl_pvusb.c| 1567 ++ tools/libxl/libxl_types.idl | 46 + tools/libxl/libxl_types_internal.idl |1 + tools/libxl/libxl_utils.c| 18 + tools/libxl/libxl_utils.h|5 + 11 files changed, 1768 insertions(+), 2 deletions(-) create mode 100644 tools/libxl/libxl_pvusb.c diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile index 620720e..459fc51 100644 --- a/tools/libxl/Makefile +++ b/tools/libxl/Makefile @@ -105,7 +105,7 @@ LIBXL_OBJS = flexarray.o libxl.o libxl_create.o libxl_dm.o libxl_pci.o \ libxl_stream_read.o libxl_stream_write.o \ libxl_save_callout.o _libxl_save_msgs_callout.o \ libxl_qmp.o libxl_event.o libxl_fork.o \ - libxl_dom_suspend.o $(LIBXL_OBJS-y) + libxl_dom_suspend.o libxl_pvusb.o $(LIBXL_OBJS-y) LIBXL_OBJS += libxl_genid.o LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index f385134..aa879d2 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -4167,6 +4167,8 @@ out: * libxl_device_vkb_destroy * libxl_device_vfb_remove * libxl_device_vfb_destroy + * libxl_device_usbctrl_remove + * libxl_device_usbctrl_destroy */ #define DEFINE_DEVICE_REMOVE_EXT(type, remtype, removedestroy, f)\ int libxl_device_##type##_##removedestroy(libxl_ctx *ctx, \ @@ -4224,6 +4226,10 @@ DEFINE_DEVICE_REMOVE(vfb, destroy, 1) DEFINE_DEVICE_REMOVE(vtpm, remove, 0) DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) +/* usbctrl */ +DEFINE_DEVICE_REMOVE_CUSTOM(usbctrl, remove, 0) +DEFINE_DEVICE_REMOVE_CUSTOM(usbctrl, destroy, 1) + /* channel/console hotunplug is not implemented. There are 2 possibilities: * 1. add support for secondary consoles to xenconsoled * 2. dynamically add/remove qemu chardevs via qmp messages. */ @@ -4239,6 +4245,8 @@ DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) * libxl_device_disk_add * libxl_device_nic_add * libxl_device_vtpm_add + * libxl_device_usbctrl_add + * libxl_device_usbdev_add */ #define DEFINE_DEVICE_ADD(type) \ @@ -4270,6 +4278,12 @@ DEFINE_DEVICE_ADD(nic) /* vtpm */ DEFINE_DEVICE_ADD(vtpm) +/* usbctrl */ +DEFINE_DEVICE_ADD(usbctrl) + +/* usb */ +DEFINE_DEVICE_ADD(usbdev) + #undef DEFINE_DEVICE_ADD /**/ @@ -6815,6 +6829,10 @@ int libxl_retrieve_domain_configuration(libxl_ctx *ctx, uint32_t domid, MERGE(pci, pcidevs, COMPARE_PCI, {}); +MERGE(usbctrl, usbctrls, COMPARE_USBCTRL, {}); + +MERGE(usbdev, usbdevs, COMPARE_USB, {}); + /* Take care of removable device. We maintain invariant in the * insert / remove operation so that: * 1. if xenstore is "empty" while JSON is not, the result diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index ea7a4b8..e72d001 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -123,6 +123,12 @@ #define LIBXL_HAVE_DOMAIN_NODEAFFINITY 1 /* + * LIBXL_HAVE_PVUSB indicates functions for plugging in USB devices + * through pvusb -- both hotplug and at domain creation time.. + */ +#define LIBXL_HAVE_PVUSB 1 + +/* * LIBXL_HAVE_BUILDINFO_HVM_VENDOR_DEVICE indicates that the * libxl_vendor_device field is present in the hvm sections of * libxl_domain_build_info. This field tells libxl which @@ -1517,6 +1523,77 @@ int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk, const libxl_asyncop_how *ao_how) LIBXL_EXTERNAL_CALLERS_ONLY; +/* + * USB + * + * For each device removed or added, one of these protocols is available: + * - PV (i.e., PVUSB) + * - DEVICEMODEL (i.e, qemu) + * + * PV is available for either PV or HVM domains. DEVICEMODEL is only + * available for HVM domains. The caller can additionally specify + * "AUTO", in which case the library will
[Xen-devel] [PATCH V14 6/6] xl: add pvusb commands
Add pvusb commands: usbctrl-attach, usbctrl-detach, usb-list, usbdev-attach and usbdev-detach. To attach a usb device to guest through pvusb, one could follow following example: #xl usbctrl-attach test_vm version=1 ports=8 #xl usb-list test_vm will show the usb controllers and port usage under the domain. #xl usbdev-attach test_vm hostbus=1 hostaddr=2 will find the first usable controller:port, and attach usb device whose busnum is 1 and devnum is 6. One could also specify which and which . #xl usbdev-detach test_vm 0 1 will detach USB device under controller 0 port 1. #xl usbctrl-detach test_vm dev_id will destroy the controller with specified dev_id. Dev_id can be traced in usb-list info. Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: George Dunlap <george.dun...@citrix.com> --- changes: * update usbctrl-attach and usbdev-attach device_string description. docs/man/xl.pod.1 | 37 + tools/libxl/xl.h | 5 ++ tools/libxl/xl_cmdimpl.c | 190 ++ tools/libxl/xl_cmdtable.c | 25 ++ 4 files changed, 257 insertions(+) diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1 index 4279c7c..dc6213e 100644 --- a/docs/man/xl.pod.1 +++ b/docs/man/xl.pod.1 @@ -1345,6 +1345,43 @@ List pass-through pci devices for a domain. =back +=head1 USB PASS-THROUGH + +=over 4 + +=item B I I + +Create a new USB controller in the domain specified by I, +I describes the device to attach, using form +C
[Xen-devel] [PATCH V14 5/6] domcreate: support pvusb in configuration file
Add code to support pvusb in domain config file. One could specify usbctrl and usb in domain's configuration file and create domain, then usb controllers will be created and usb device would be attached to guest automatically. One could specify usb controllers and usb devices in config file like this: usbctrl=['version=2,ports=4', 'version=1, ports=4', ] usbdev=['hostbus=2, hostaddr=1, controller=0,port=1', ] Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: George Dunlap <george.dun...@citrix.com> Acked-by: Ian Jackson <ian.jack...@eu.citrix.com> --- docs/man/xl.cfg.pod.5| 84 + tools/libxl/libxl_create.c | 73 +++-- tools/libxl/libxl_device.c | 4 ++ tools/libxl/libxl_internal.h | 8 tools/libxl/xl_cmdimpl.c | 107 ++- 5 files changed, 272 insertions(+), 4 deletions(-) diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 index 40690bd..7eecdc1 100644 --- a/docs/man/xl.cfg.pod.5 +++ b/docs/man/xl.cfg.pod.5 @@ -722,6 +722,90 @@ Note this may be overridden by rdm_policy option in PCI device configuration. =back +=item B
[Xen-devel] [PATCH V14 0/6] xen pvusb toolstack work
You could view USB device status of the domain by usb-list. e.g. xl usb-list domain It will list USB controllers and USB devices under each controller. You could detach a USB device with usb-detach command. e.g. xl usb-detach domain 1.6 You can also remove the whole USB controller by usb-ctrl-detach command. e.g. xl usb-ctrl-detach domain 0 It will remove the USB controller with index 0 and all USB devices under it. 4. PVUSB Libxl implementation * usb-ctrl-attach To create a usb controller, we need: 1) generate usb controler related information 2) write usb controller frontend/backend info to xenstore PVUSB frontend and backend driver will probe xenstore paths and build connection between frontend and backend. * usb-ctrl-detach To remove a usb controller, we need: 1) check if the usb controller exists or not 2) remove all usb devices under controller 3) remove usb controller info from xenstore * usb-attach To attach a usb device, we need: 1) check if the usb device type is assignable 2) check if the usb device is already assigned to a domain 3) add 'busid' of the usb device to xenstore contoller/port/. PVUSB driver watches the xenstore changes and detects that, and needs to use 'busid' to do following work. 4) unbind usb device from original driver and bind to usbback. If usb device has many interfaces, then: - unbind each interface from its original driver and bind to usbback. - store the original driver to xenstore for later rebinding when detaching the device. * usb-detach To detach a usb device, we need: 1) check if the usb device is assigned to the domain 2) remove the usb device from xenstore controller/port. 3) unbind usb device from usbback and rebind to its original driver. If usb device has many interfaces, do it to each interface. * usb-list List all USB controllers and USB devices under each controller. 5. PVUSB xenstore information PVUSB xenstore information includes three parts: frontend, backend and /libxl part. A USB controller is corresponding to a "vusb" device in xenstore. Adding a USB controller will add a new "vusb" device, removing a USB controller will delete the related "vusb" device. Following is an example xenstore values of a USB controller. Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "" 2 = "" 3 = "" 4 = "" Frontend: device = "" vusb = "" 0 = "" backend = "/local/domain/0/backend/vusb/1/0" backend-id = "0" state = "4" urb-ring-ref = "348" conn-ring-ref = "346" event-channel = "20" Adding a USB device won't create a new "vusb" device, but only write the USB device busid to one port of USB controller. For example, attaching a USB device (busid is 2-1.6) to above USB controller port 1, it only need write 2-1.6 to port 1 of this USB controller: Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "2-1.6" 2 = "" 3 = "" 4 = "" Frontend doesn't change. Since assign a host USB device to guest, we'll unbind USB interfaces from their original drivers and bind them to usbback. After detaching this USB device from guest, one would hope the USB interfaces could be rebind to their original drivers, so there should some place to get the original driver info. To support that, when attaching a USB device to guest, we'll save the original driver info in xenstore too, the place is /libxl/usbback, for example: libxl = "" 1 = "" dm-version = "qemu_xen" usbback = "" 3-11 = "" 3-11@1_0 = "" driver_path = "/sys/bus/usb/drivers/btusb" In this example, USB device (busid is 3-11, /sys/bus/usb/devices/3-11). It has interface 3-11:1.0, whose original dirver is btusb. Since xenstore doesn't allow ':' and '.' in a key, so we encode the interface by changing ':' to '@' and changing '.' to '_'. When detaching the USB device from guest, we can rebind 3-11:1.0 to btusb driver. Chunyan Liu (6): libxl: export some functions for pvusb use libxl_utils: add internal function to read sysfs file contents refactor DEFIN
[Xen-devel] [PATCH V14 1/6] libxl: export some functions for pvusb use
Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: Wei Liu <wei.l...@citrix.com> Acked-by: Ian Jackson <ian.jack...@eu.citrix.com> --- tools/libxl/libxl.c | 5 ++--- tools/libxl/libxl_internal.h | 3 +++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index c451b65..98743cd 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -2031,7 +2031,7 @@ out: } /* common function to get next device id */ -static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) +int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) { char *dompath, **l; unsigned int nb; @@ -2050,8 +2050,7 @@ static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) return nextid; } -static int libxl__resolve_domid(libxl__gc *gc, const char *name, -uint32_t *domid) +int libxl__resolve_domid(libxl__gc *gc, const char *name, uint32_t *domid) { if (!name) return 0; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index c1290b2..f61810d 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1180,6 +1180,9 @@ _hidden int libxl__init_console_from_channel(libxl__gc *gc, libxl__device_console *console, int dev_num, libxl_device_channel *channel); +_hidden int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device); +_hidden int libxl__resolve_domid(libxl__gc *gc, const char *name, + uint32_t *domid); /* * For each aggregate type which can be used as an input we provide: -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V14 2/6] libxl_utils: add internal function to read sysfs file contents
Add a new function libxl_read_sysfs_file_contents to handle sysfs file specially. It would be used in later pvusb work. Signed-off-by: Chunyan Liu <cy...@suse.com> Acked-by: Ian Jackson <ian.jack...@eu.citrix.com> --- tools/libxl/libxl_internal.h | 4 +++ tools/libxl/libxl_utils.c| 74 2 files changed, 78 insertions(+) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index f61810d..10eb9fd 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -4037,6 +4037,10 @@ void libxl__bitmap_copy_best_effort(libxl__gc *gc, libxl_bitmap *dptr, int libxl__count_physical_sockets(libxl__gc *gc, int *sockets); +_hidden int libxl__read_sysfs_file_contents(libxl__gc *gc, +const char *filename, +void **data_r, +int *datalen_r); #define LIBXL_QEMU_USER_PREFIX "xen-qemuuser" #define LIBXL_QEMU_USER_BASE LIBXL_QEMU_USER_PREFIX"-domid" diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index e42422a..e64f301 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -396,6 +396,80 @@ int libxl_read_file_contents(libxl_ctx *ctx, const char *filename, return e; } +int libxl__read_sysfs_file_contents(libxl__gc *gc, const char *filename, +void **data_r, int *datalen_r) +{ +FILE *f = 0; +uint8_t *data = 0; +int datalen = 0; +int e; +struct stat stab; +ssize_t rs; + +f = fopen(filename, "r"); +if (!f) { +if (errno == ENOENT) return ENOENT; +LOGE(ERROR, "failed to open %s", filename); +goto xe; +} + +if (fstat(fileno(f), )) { +LOGE(ERROR, "failed to fstat %s", filename); +goto xe; +} + +if (!S_ISREG(stab.st_mode)) { +LOGE(ERROR, "%s is not a plain file", filename); +errno = ENOTTY; +goto xe; +} + +if (stab.st_size > INT_MAX) { +LOG(ERROR, "file %s is far too large", filename); +errno = EFBIG; +goto xe; +} + +datalen = stab.st_size; + +if (stab.st_size && data_r) { +data = libxl__malloc(gc, datalen); + +/* For sysfs file, datalen is always PAGE_SIZE. 'read' + * will return the number of bytes of the actual content, + * rs <= datalen is expected. + */ +rs = fread(data, 1, datalen, f); +if (rs < datalen) { +if (ferror(f)) { +LOGE(ERROR, "failed to read %s", filename); +goto xe; +} + +datalen = rs; +data = libxl__realloc(gc, data, datalen); +} +} + +if (fclose(f)) { +f = 0; +LOGE(ERROR, "failed to close %s", filename); +goto xe; +} + +if (data_r) *data_r = data; +if (datalen_r) *datalen_r = datalen; + +return 0; + + xe: +e = errno; +assert(e != ENOENT); +if (f) fclose(f); +return e; +} + + #define READ_WRITE_EXACTLY(rw, zero_is_eof, constdata)\ \ int libxl_##rw##_exactly(libxl_ctx *ctx, int fd, \ -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V14 3/6] refactor DEFINE_DEVICE_REMOVE to fit for more device types
For some device type, device removal operation needs to be handled specially, like usbctrl, it needs to remove all usb devices under it first, then remove usbctrl. Extend DEFINE_DEVICE_REMOVE to support generic and custom way For those need to be handled specially, call DEFINE_DEVICE_REMOVE_CUSTOM, it requires user defined libxl__initiate_device_##type##_remove. Otherwise, just call DEFINE_DEVICE_REMOVE as before. Signed-off-by: George Dunlap <george.dun...@citrix.com> Signed-off-by: Chunyan Liu <cy...@suse.com> --- Address Olaf's suggestion: * split from "libxl: add pvusb API" patch, since it is common refactor work, not pvusb specific. tools/libxl/libxl.c | 18 +- tools/libxl/libxl_device.c | 10 +- tools/libxl/libxl_internal.h | 4 ++-- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 98743cd..f385134 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -3199,7 +3199,7 @@ void libxl__device_disk_local_initiate_detach(libxl__egc *egc, aodev->dev = device; aodev->callback = local_device_detach_cb; aodev->force = 0; -libxl__initiate_device_remove(egc, aodev); +libxl__initiate_device_generic_remove(egc, aodev); return; } @@ -4168,7 +4168,7 @@ out: * libxl_device_vfb_remove * libxl_device_vfb_destroy */ -#define DEFINE_DEVICE_REMOVE(type, removedestroy, f)\ +#define DEFINE_DEVICE_REMOVE_EXT(type, remtype, removedestroy, f)\ int libxl_device_##type##_##removedestroy(libxl_ctx *ctx, \ uint32_t domid, libxl_device_##type *type, \ const libxl_asyncop_how *ao_how)\ @@ -4188,13 +4188,19 @@ out: aodev->dev = device;\ aodev->callback = device_addrm_aocomplete; \ aodev->force = f; \ -libxl__initiate_device_remove(egc, aodev); \ +libxl__initiate_device_##remtype##_remove(egc, aodev); \ \ out:\ -if (rc) return AO_CREATE_FAIL(rc);\ +if (rc) return AO_CREATE_FAIL(rc); \ return AO_INPROGRESS; \ } +#define DEFINE_DEVICE_REMOVE(type, removedestroy, f) \ +DEFINE_DEVICE_REMOVE_EXT(type, generic, removedestroy, f) + +#define DEFINE_DEVICE_REMOVE_CUSTOM(type, removedestroy, f) \ +DEFINE_DEVICE_REMOVE_EXT(type, type, removedestroy, f) + /* Define all remove/destroy functions and undef the macro */ /* disk */ @@ -4223,6 +4229,8 @@ DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) * 2. dynamically add/remove qemu chardevs via qmp messages. */ #undef DEFINE_DEVICE_REMOVE +#undef DEFINE_DEVICE_REMOVE_CUSTOM +#undef DEFINE_DEVICE_REMOVE_EXT /**/ @@ -4427,7 +4435,7 @@ static int remove_device(libxl__egc *egc, libxl__ao *ao, aodev->dev = dev; aodev->action = LIBXL__DEVICE_ACTION_REMOVE; aodev->callback = device_complete; -libxl__initiate_device_remove(egc, aodev); +libxl__initiate_device_generic_remove(egc, aodev); break; case LIBXL__DEVICE_KIND_QDISK: if (--dguest->num_qdisks == 0) { diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c index 8bb5e93..a356e2a 100644 --- a/tools/libxl/libxl_device.c +++ b/tools/libxl/libxl_device.c @@ -676,7 +676,7 @@ void libxl__devices_destroy(libxl__egc *egc, libxl__devices_remove_state *drs) aodev->action = LIBXL__DEVICE_ACTION_REMOVE; aodev->dev = dev; aodev->force = drs->force; -libxl__initiate_device_remove(egc, aodev); +libxl__initiate_device_generic_remove(egc, aodev); } } } @@ -775,8 +775,8 @@ out: return; } -void libxl__initiate_device_remove(libxl__egc *egc, - libxl__ao_device *aodev) +void libxl__initiate_device_generic_remove(libxl__egc *egc, + libxl__ao_device *aodev) { STATE_AO_GC(aodev->ao); xs_transaction_t t = 0; @@ -806,7 +806,7 @@ void libxl__initiate_device_remove(libxl__egc *egc, (info.paused || info.dying || info.shutdown)) { /* * TODO: 4.2 Bodge due to QEMU, see comment on top of - * libxl__initiate_device_remove in libxl_internal.h + * libxl__initiate_device_generic_remove in libxl_internal.h
[Xen-devel] [PATCH V13 5/5] xl: add pvusb commands
Add pvusb commands: usbctrl-attach, usbctrl-detach, usb-list, usbdev-attach and usbdev-detach. To attach a usb device to guest through pvusb, one could follow following example: #xl usbctrl-attach test_vm version=1 ports=8 #xl usb-list test_vm will show the usb controllers and port usage under the domain. #xl usbdev-attach test_vm hostbus=1 hostaddr=2 will find the first usable controller:port, and attach usb device whose busnum is 1 and devnum is 6. One could also specify which and which . #xl usbdev-detach test_vm 0 1 will detach USB device under controller 0 port 1. #xl usbctrl-detach test_vm dev_id will destroy the controller with specified dev_id. Dev_id can be traced in usb-list info. Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: George Dunlap <george.dun...@citrix.com> --- changes: * update docs to reuse documentation in xl.cfg * remove backend patch information from usb-list docs/man/xl.pod.1 | 35 + tools/libxl/xl.h | 5 ++ tools/libxl/xl_cmdimpl.c | 190 ++ tools/libxl/xl_cmdtable.c | 25 ++ 4 files changed, 255 insertions(+) diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1 index 4279c7c..7e0a380 100644 --- a/docs/man/xl.pod.1 +++ b/docs/man/xl.pod.1 @@ -1345,6 +1345,41 @@ List pass-through pci devices for a domain. =back +=head1 USB PASS-THROUGH + +=over 4 + +=item B I I + +Create a new USB controller in the domain specified by I, +I describes the device to attach, using the same format +as the B string in the domain config file. See L for +more information. + +=item B I I + +Destroy a USB controller from the specified domain. +B is devid of the USB controller. + +=item B I I + +Hot-plug a new pass-through USB device to the domain specified by +I, I describes the device to attach, using +the same format as the B string in the domain config file. +See L for more information. + +=item B I I
[Xen-devel] [PATCH V13 3/5] libxl: add pvusb API
Add pvusb APIs, including: - attach/detach (create/destroy) virtual usb controller. - attach/detach usb device - list usb controller and usb devices - some other helper functions Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Signed-off-by: George Dunlap <george.dun...@citrix.com> --- changes: * address error handlings tools/libxl/Makefile |2 +- tools/libxl/libxl.c | 34 +- tools/libxl/libxl.h | 77 ++ tools/libxl/libxl_device.c | 13 +- tools/libxl/libxl_internal.h | 22 +- tools/libxl/libxl_osdeps.h | 13 + tools/libxl/libxl_pvusb.c| 1567 ++ tools/libxl/libxl_types.idl | 46 + tools/libxl/libxl_types_internal.idl |1 + tools/libxl/libxl_utils.c| 18 + tools/libxl/libxl_utils.h|5 + 11 files changed, 1785 insertions(+), 13 deletions(-) create mode 100644 tools/libxl/libxl_pvusb.c diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile index 2abae0c..e25ffa6 100644 --- a/tools/libxl/Makefile +++ b/tools/libxl/Makefile @@ -104,7 +104,7 @@ LIBXL_OBJS = flexarray.o libxl.o libxl_create.o libxl_dm.o libxl_pci.o \ libxl_stream_read.o libxl_stream_write.o \ libxl_save_callout.o _libxl_save_msgs_callout.o \ libxl_qmp.o libxl_event.o libxl_fork.o \ - libxl_dom_suspend.o $(LIBXL_OBJS-y) + libxl_dom_suspend.o libxl_pvusb.o $(LIBXL_OBJS-y) LIBXL_OBJS += libxl_genid.o LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 43d5709..920c135 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -3204,7 +3204,7 @@ void libxl__device_disk_local_initiate_detach(libxl__egc *egc, aodev->dev = device; aodev->callback = local_device_detach_cb; aodev->force = 0; -libxl__initiate_device_remove(egc, aodev); +libxl__initiate_device_generic_remove(egc, aodev); return; } @@ -4172,8 +4172,10 @@ out: * libxl_device_vkb_destroy * libxl_device_vfb_remove * libxl_device_vfb_destroy + * libxl_device_usbctrl_remove + * libxl_device_usbctrl_destroy */ -#define DEFINE_DEVICE_REMOVE(type, removedestroy, f)\ +#define DEFINE_DEVICE_REMOVE_EXT(type, remtype, removedestroy, f)\ int libxl_device_##type##_##removedestroy(libxl_ctx *ctx, \ uint32_t domid, libxl_device_##type *type, \ const libxl_asyncop_how *ao_how)\ @@ -4193,13 +4195,19 @@ out: aodev->dev = device;\ aodev->callback = device_addrm_aocomplete; \ aodev->force = f; \ -libxl__initiate_device_remove(egc, aodev); \ +libxl__initiate_device_##remtype##_remove(egc, aodev); \ \ out:\ -if (rc) return AO_CREATE_FAIL(rc);\ +if (rc) return AO_CREATE_FAIL(rc); \ return AO_INPROGRESS; \ } +#define DEFINE_DEVICE_REMOVE(type, removedestroy, f) \ +DEFINE_DEVICE_REMOVE_EXT(type, generic, removedestroy, f) + +#define DEFINE_DEVICE_REMOVE_CUSTOM(type, removedestroy, f) \ +DEFINE_DEVICE_REMOVE_EXT(type, type, removedestroy, f) + /* Define all remove/destroy functions and undef the macro */ /* disk */ @@ -4223,6 +4231,10 @@ DEFINE_DEVICE_REMOVE(vfb, destroy, 1) DEFINE_DEVICE_REMOVE(vtpm, remove, 0) DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) +/* usbctrl */ +DEFINE_DEVICE_REMOVE_CUSTOM(usbctrl, remove, 0) +DEFINE_DEVICE_REMOVE_CUSTOM(usbctrl, destroy, 1) + /* channel/console hotunplug is not implemented. There are 2 possibilities: * 1. add support for secondary consoles to xenconsoled * 2. dynamically add/remove qemu chardevs via qmp messages. */ @@ -4236,6 +4248,8 @@ DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) * libxl_device_disk_add * libxl_device_nic_add * libxl_device_vtpm_add + * libxl_device_usbctrl_add + * libxl_device_usbdev_add */ #define DEFINE_DEVICE_ADD(type) \ @@ -4267,6 +4281,12 @@ DEFINE_DEVICE_ADD(nic) /* vtpm */ DEFINE_DEVICE_ADD(vtpm) +/* usbctrl */ +DEFINE_DEVICE_ADD(usbctrl) + +/* usb */ +DEFINE_DEVICE_ADD(usbdev) + #undef DEFINE_DEVICE_ADD /**/ @@ -4432,7 +4452,7 @@ static int remove_device(libxl__egc *egc, libxl__ao *ao, aode
[Xen-devel] [PATCH V13 2/5] libxl_utils: add internal function to read sysfs file contents
Add a new function libxl_read_sysfs_file_contents to handle sysfs file specially. It would be used in later pvusb work. Signed-off-by: Chunyan Liu <cy...@suse.com> Acked-by: Ian Jackson <ian.jack...@eu.citrix.com> --- tools/libxl/libxl_internal.h | 4 +++ tools/libxl/libxl_utils.c| 74 2 files changed, 78 insertions(+) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 9e94835..d1eb18f 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -4039,6 +4039,10 @@ void libxl__bitmap_copy_best_effort(libxl__gc *gc, libxl_bitmap *dptr, int libxl__count_physical_sockets(libxl__gc *gc, int *sockets); +_hidden int libxl__read_sysfs_file_contents(libxl__gc *gc, +const char *filename, +void **data_r, +int *datalen_r); #define LIBXL_QEMU_USER_PREFIX "xen-qemuuser" #define LIBXL_QEMU_USER_BASE LIBXL_QEMU_USER_PREFIX"-domid" diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index e42422a..e64f301 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -396,6 +396,80 @@ int libxl_read_file_contents(libxl_ctx *ctx, const char *filename, return e; } +int libxl__read_sysfs_file_contents(libxl__gc *gc, const char *filename, +void **data_r, int *datalen_r) +{ +FILE *f = 0; +uint8_t *data = 0; +int datalen = 0; +int e; +struct stat stab; +ssize_t rs; + +f = fopen(filename, "r"); +if (!f) { +if (errno == ENOENT) return ENOENT; +LOGE(ERROR, "failed to open %s", filename); +goto xe; +} + +if (fstat(fileno(f), )) { +LOGE(ERROR, "failed to fstat %s", filename); +goto xe; +} + +if (!S_ISREG(stab.st_mode)) { +LOGE(ERROR, "%s is not a plain file", filename); +errno = ENOTTY; +goto xe; +} + +if (stab.st_size > INT_MAX) { +LOG(ERROR, "file %s is far too large", filename); +errno = EFBIG; +goto xe; +} + +datalen = stab.st_size; + +if (stab.st_size && data_r) { +data = libxl__malloc(gc, datalen); + +/* For sysfs file, datalen is always PAGE_SIZE. 'read' + * will return the number of bytes of the actual content, + * rs <= datalen is expected. + */ +rs = fread(data, 1, datalen, f); +if (rs < datalen) { +if (ferror(f)) { +LOGE(ERROR, "failed to read %s", filename); +goto xe; +} + +datalen = rs; +data = libxl__realloc(gc, data, datalen); +} +} + +if (fclose(f)) { +f = 0; +LOGE(ERROR, "failed to close %s", filename); +goto xe; +} + +if (data_r) *data_r = data; +if (datalen_r) *datalen_r = datalen; + +return 0; + + xe: +e = errno; +assert(e != ENOENT); +if (f) fclose(f); +return e; +} + + #define READ_WRITE_EXACTLY(rw, zero_is_eof, constdata)\ \ int libxl_##rw##_exactly(libxl_ctx *ctx, int fd, \ -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V13 0/5] xen pvusb toolstack work
h command. e.g. xl usb-detach domain 1.6 You can also remove the whole USB controller by usb-ctrl-detach command. e.g. xl usb-ctrl-detach domain 0 It will remove the USB controller with index 0 and all USB devices under it. 4. PVUSB Libxl implementation * usb-ctrl-attach To create a usb controller, we need: 1) generate usb controler related information 2) write usb controller frontend/backend info to xenstore PVUSB frontend and backend driver will probe xenstore paths and build connection between frontend and backend. * usb-ctrl-detach To remove a usb controller, we need: 1) check if the usb controller exists or not 2) remove all usb devices under controller 3) remove usb controller info from xenstore * usb-attach To attach a usb device, we need: 1) check if the usb device type is assignable 2) check if the usb device is already assigned to a domain 3) add 'busid' of the usb device to xenstore contoller/port/. PVUSB driver watches the xenstore changes and detects that, and needs to use 'busid' to do following work. 4) unbind usb device from original driver and bind to usbback. If usb device has many interfaces, then: - unbind each interface from its original driver and bind to usbback. - store the original driver to xenstore for later rebinding when detaching the device. * usb-detach To detach a usb device, we need: 1) check if the usb device is assigned to the domain 2) remove the usb device from xenstore controller/port. 3) unbind usb device from usbback and rebind to its original driver. If usb device has many interfaces, do it to each interface. * usb-list List all USB controllers and USB devices under each controller. 5. PVUSB xenstore information PVUSB xenstore information includes three parts: frontend, backend and /libxl part. A USB controller is corresponding to a "vusb" device in xenstore. Adding a USB controller will add a new "vusb" device, removing a USB controller will delete the related "vusb" device. Following is an example xenstore values of a USB controller. Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "" 2 = "" 3 = "" 4 = "" Frontend: device = "" vusb = "" 0 = "" backend = "/local/domain/0/backend/vusb/1/0" backend-id = "0" state = "4" urb-ring-ref = "348" conn-ring-ref = "346" event-channel = "20" Adding a USB device won't create a new "vusb" device, but only write the USB device busid to one port of USB controller. For example, attaching a USB device (busid is 2-1.6) to above USB controller port 1, it only need write 2-1.6 to port 1 of this USB controller: Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "2-1.6" 2 = "" 3 = "" 4 = "" Frontend doesn't change. Since assign a host USB device to guest, we'll unbind USB interfaces from their original drivers and bind them to usbback. After detaching this USB device from guest, one would hope the USB interfaces could be rebind to their original drivers, so there should some place to get the original driver info. To support that, when attaching a USB device to guest, we'll save the original driver info in xenstore too, the place is /libxl/usbback, for example: libxl = "" 1 = "" dm-version = "qemu_xen" usbback = "" 3-11 = "" 3-11@1_0 = "" driver_path = "/sys/bus/usb/drivers/btusb" In this example, USB device (busid is 3-11, /sys/bus/usb/devices/3-11). It has interface 3-11:1.0, whose original dirver is btusb. Since xenstore doesn't allow ':' and '.' in a key, so we encode the interface by changing ':' to '@' and changing '.' to '_'. When detaching the USB device from guest, we can rebind 3-11:1.0 to btusb driver. *** BLURB HERE *** Chunyan Liu (5): libxl: export some functions for pvusb use libxl_utils: add internal function to read sysfs file contents libxl: add pvusb API domcreate: support pvusb in configuration file xl: add pvusb commands docs/man/xl.cfg.pod.5| 84 ++ docs/man/xl.pod.1| 35
[Xen-devel] [PATCH V13 4/5] domcreate: support pvusb in configuration file
Add code to support pvusb in domain config file. One could specify usbctrl and usb in domain's configuration file and create domain, then usb controllers will be created and usb device would be attached to guest automatically. One could specify usb controllers and usb devices in config file like this: usbctrl=['version=2,ports=4', 'version=1, ports=4', ] usbdev=['hostbus=2, hostaddr=1, controller=0,port=1', ] Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: George Dunlap <george.dun...@citrix.com> --- Changes: * adjust patch order of this patch and next patch, so that next patch can use docs generated in this patch. docs/man/xl.cfg.pod.5| 84 + tools/libxl/libxl_create.c | 73 +++-- tools/libxl/libxl_device.c | 4 ++ tools/libxl/libxl_internal.h | 8 tools/libxl/xl_cmdimpl.c | 107 ++- 5 files changed, 272 insertions(+), 4 deletions(-) diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 index 8899f75..99ef9ca 100644 --- a/docs/man/xl.cfg.pod.5 +++ b/docs/man/xl.cfg.pod.5 @@ -722,6 +722,90 @@ Note this may be overridden by rdm_policy option in PCI device configuration. =back +=item B
[Xen-devel] [PATCH V13 1/5] libxl: export some functions for pvusb use
Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: Wei Liu <wei.l...@citrix.com> Acked-by: Ian Jackson <ian.jack...@eu.citrix.com> --- tools/libxl/libxl.c | 5 ++--- tools/libxl/libxl_internal.h | 3 +++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 00d9ec4..43d5709 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -2036,7 +2036,7 @@ out: } /* common function to get next device id */ -static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) +int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) { char *dompath, **l; unsigned int nb; @@ -2055,8 +2055,7 @@ static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) return nextid; } -static int libxl__resolve_domid(libxl__gc *gc, const char *name, -uint32_t *domid) +int libxl__resolve_domid(libxl__gc *gc, const char *name, uint32_t *domid) { if (!name) return 0; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 4c01a82..9e94835 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1176,6 +1176,9 @@ _hidden int libxl__init_console_from_channel(libxl__gc *gc, libxl__device_console *console, int dev_num, libxl_device_channel *channel); +_hidden int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device); +_hidden int libxl__resolve_domid(libxl__gc *gc, const char *name, + uint32_t *domid); /* * For each aggregate type which can be used as an input we provide: -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V12 0/5] xen pvusb toolstack work
oller with index 0 and all USB devices under it. 4. PVUSB Libxl implementation * usb-ctrl-attach To create a usb controller, we need: 1) generate usb controler related information 2) write usb controller frontend/backend info to xenstore PVUSB frontend and backend driver will probe xenstore paths and build connection between frontend and backend. * usb-ctrl-detach To remove a usb controller, we need: 1) check if the usb controller exists or not 2) remove all usb devices under controller 3) remove usb controller info from xenstore * usb-attach To attach a usb device, we need: 1) check if the usb device type is assignable 2) check if the usb device is already assigned to a domain 3) add 'busid' of the usb device to xenstore contoller/port/. PVUSB driver watches the xenstore changes and detects that, and needs to use 'busid' to do following work. 4) unbind usb device from original driver and bind to usbback. If usb device has many interfaces, then: - unbind each interface from its original driver and bind to usbback. - store the original driver to xenstore for later rebinding when detaching the device. * usb-detach To detach a usb device, we need: 1) check if the usb device is assigned to the domain 2) remove the usb device from xenstore controller/port. 3) unbind usb device from usbback and rebind to its original driver. If usb device has many interfaces, do it to each interface. * usb-list List all USB controllers and USB devices under each controller. 5. PVUSB xenstore information PVUSB xenstore information includes three parts: frontend, backend and /libxl part. A USB controller is corresponding to a "vusb" device in xenstore. Adding a USB controller will add a new "vusb" device, removing a USB controller will delete the related "vusb" device. Following is an example xenstore values of a USB controller. Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "" 2 = "" 3 = "" 4 = "" Frontend: device = "" vusb = "" 0 = "" backend = "/local/domain/0/backend/vusb/1/0" backend-id = "0" state = "4" urb-ring-ref = "348" conn-ring-ref = "346" event-channel = "20" Adding a USB device won't create a new "vusb" device, but only write the USB device busid to one port of USB controller. For example, attaching a USB device (busid is 2-1.6) to above USB controller port 1, it only need write 2-1.6 to port 1 of this USB controller: Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "2-1.6" 2 = "" 3 = "" 4 = "" Frontend doesn't change. Since assign a host USB device to guest, we'll unbind USB interfaces from their original drivers and bind them to usbback. After detaching this USB device from guest, one would hope the USB interfaces could be rebind to their original drivers, so there should some place to get the original driver info. To support that, when attaching a USB device to guest, we'll save the original driver info in xenstore too, the place is /libxl/usbback, for example: libxl = "" 1 = "" dm-version = "qemu_xen" usbback = "" 3-11 = "" 3-11@1_0 = "" driver_path = "/sys/bus/usb/drivers/btusb" In this example, USB device (busid is 3-11, /sys/bus/usb/devices/3-11). It has interface 3-11:1.0, whose original dirver is btusb. Since xenstore doesn't allow ':' and '.' in a key, so we encode the interface by changing ':' to '@' and changing '.' to '_'. When detaching the USB device from guest, we can rebind 3-11:1.0 to btusb driver. Chunyan Liu (5): libxl: export some functions for pvusb use libxl_utils: add internal function to read sysfs file contents libxl: add pvusb API xl: add pvusb commands domcreate: support pvusb in configuration file docs/man/xl.cfg.pod.5| 84 ++ docs/man/xl.pod.1| 41 + tools/libxl/Makefile |2 +- tools/libxl/libxl.c | 39 +- tools/libxl/libxl.h | 77 ++ tools/libxl/libxl_create.c | 73 +-
[Xen-devel] [PATCH V12 3/5] libxl: add pvusb API
Add pvusb APIs, including: - attach/detach (create/destroy) virtual usb controller. - attach/detach usb device - list usb controller and usb devices - some other helper functions Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Signed-off-by: George Dunlap <george.dun...@citrix.com> Reviewed-by: George Dunlap <george.dun...@citrix.com> --- tools/libxl/Makefile |2 +- tools/libxl/libxl.c | 34 +- tools/libxl/libxl.h | 77 ++ tools/libxl/libxl_device.c | 13 +- tools/libxl/libxl_internal.h | 22 +- tools/libxl/libxl_osdeps.h | 13 + tools/libxl/libxl_pvusb.c| 1548 ++ tools/libxl/libxl_types.idl | 46 + tools/libxl/libxl_types_internal.idl |1 + tools/libxl/libxl_utils.c| 18 + tools/libxl/libxl_utils.h|5 + 11 files changed, 1766 insertions(+), 13 deletions(-) create mode 100644 tools/libxl/libxl_pvusb.c diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile index 6ff5bee..a36145a 100644 --- a/tools/libxl/Makefile +++ b/tools/libxl/Makefile @@ -103,7 +103,7 @@ LIBXL_OBJS = flexarray.o libxl.o libxl_create.o libxl_dm.o libxl_pci.o \ libxl_stream_read.o libxl_stream_write.o \ libxl_save_callout.o _libxl_save_msgs_callout.o \ libxl_qmp.o libxl_event.o libxl_fork.o \ - libxl_dom_suspend.o $(LIBXL_OBJS-y) + libxl_dom_suspend.o libxl_pvusb.o $(LIBXL_OBJS-y) LIBXL_OBJS += libxl_genid.o LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 43d5709..920c135 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -3204,7 +3204,7 @@ void libxl__device_disk_local_initiate_detach(libxl__egc *egc, aodev->dev = device; aodev->callback = local_device_detach_cb; aodev->force = 0; -libxl__initiate_device_remove(egc, aodev); +libxl__initiate_device_generic_remove(egc, aodev); return; } @@ -4172,8 +4172,10 @@ out: * libxl_device_vkb_destroy * libxl_device_vfb_remove * libxl_device_vfb_destroy + * libxl_device_usbctrl_remove + * libxl_device_usbctrl_destroy */ -#define DEFINE_DEVICE_REMOVE(type, removedestroy, f)\ +#define DEFINE_DEVICE_REMOVE_EXT(type, remtype, removedestroy, f)\ int libxl_device_##type##_##removedestroy(libxl_ctx *ctx, \ uint32_t domid, libxl_device_##type *type, \ const libxl_asyncop_how *ao_how)\ @@ -4193,13 +4195,19 @@ out: aodev->dev = device;\ aodev->callback = device_addrm_aocomplete; \ aodev->force = f; \ -libxl__initiate_device_remove(egc, aodev); \ +libxl__initiate_device_##remtype##_remove(egc, aodev); \ \ out:\ -if (rc) return AO_CREATE_FAIL(rc);\ +if (rc) return AO_CREATE_FAIL(rc); \ return AO_INPROGRESS; \ } +#define DEFINE_DEVICE_REMOVE(type, removedestroy, f) \ +DEFINE_DEVICE_REMOVE_EXT(type, generic, removedestroy, f) + +#define DEFINE_DEVICE_REMOVE_CUSTOM(type, removedestroy, f) \ +DEFINE_DEVICE_REMOVE_EXT(type, type, removedestroy, f) + /* Define all remove/destroy functions and undef the macro */ /* disk */ @@ -4223,6 +4231,10 @@ DEFINE_DEVICE_REMOVE(vfb, destroy, 1) DEFINE_DEVICE_REMOVE(vtpm, remove, 0) DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) +/* usbctrl */ +DEFINE_DEVICE_REMOVE_CUSTOM(usbctrl, remove, 0) +DEFINE_DEVICE_REMOVE_CUSTOM(usbctrl, destroy, 1) + /* channel/console hotunplug is not implemented. There are 2 possibilities: * 1. add support for secondary consoles to xenconsoled * 2. dynamically add/remove qemu chardevs via qmp messages. */ @@ -4236,6 +4248,8 @@ DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) * libxl_device_disk_add * libxl_device_nic_add * libxl_device_vtpm_add + * libxl_device_usbctrl_add + * libxl_device_usbdev_add */ #define DEFINE_DEVICE_ADD(type) \ @@ -4267,6 +4281,12 @@ DEFINE_DEVICE_ADD(nic) /* vtpm */ DEFINE_DEVICE_ADD(vtpm) +/* usbctrl */ +DEFINE_DEVICE_ADD(usbctrl) + +/* usb */ +DEFINE_DEVICE_ADD(usbdev) + #undef DEFINE_DEVICE_ADD /**/ @@ -4432,7 +4452,7 @@ static int remove_device(libxl__egc *egc
[Xen-devel] [PATCH V12 1/5] libxl: export some functions for pvusb use
Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: Wei Liu <wei.l...@citrix.com> --- tools/libxl/libxl.c | 5 ++--- tools/libxl/libxl_internal.h | 3 +++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 00d9ec4..43d5709 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -2036,7 +2036,7 @@ out: } /* common function to get next device id */ -static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) +int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) { char *dompath, **l; unsigned int nb; @@ -2055,8 +2055,7 @@ static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) return nextid; } -static int libxl__resolve_domid(libxl__gc *gc, const char *name, -uint32_t *domid) +int libxl__resolve_domid(libxl__gc *gc, const char *name, uint32_t *domid) { if (!name) return 0; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 4c01a82..9e94835 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1176,6 +1176,9 @@ _hidden int libxl__init_console_from_channel(libxl__gc *gc, libxl__device_console *console, int dev_num, libxl_device_channel *channel); +_hidden int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device); +_hidden int libxl__resolve_domid(libxl__gc *gc, const char *name, + uint32_t *domid); /* * For each aggregate type which can be used as an input we provide: -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V12 4/5] xl: add pvusb commands
Add pvusb commands: usbctrl-attach, usbctrl-detach, usb-list, usbdev-attach and usbdev-detach. To attach a usb device to guest through pvusb, one could follow following example: #xl usbctrl-attach test_vm version=1 ports=8 #xl usb-list test_vm will show the usb controllers and port usage under the domain. #xl usbdev-attach test_vm hostbus=1 hostaddr=2 will find the first usable controller:port, and attach usb device whose busnum is 1 and devnum is 6. One could also specify which and which . #xl usbdev-detach test_vm 0 1 will detach USB device under controller 0 port 1. #xl usbctrl-detach test_vm dev_id will destroy the controller with specified dev_id. Dev_id can be traced in usb-list info. Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: George Dunlap <george.dun...@citrix.com> --- docs/man/xl.pod.1 | 41 tools/libxl/xl.h | 5 + tools/libxl/xl_cmdimpl.c | 243 ++ tools/libxl/xl_cmdtable.c | 25 + 4 files changed, 314 insertions(+) diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1 index 4279c7c..746f49f 100644 --- a/docs/man/xl.pod.1 +++ b/docs/man/xl.pod.1 @@ -1345,6 +1345,47 @@ List pass-through pci devices for a domain. =back +=head1 USB PASS-THROUGH + +=over 4 + +=item B I I[
[Xen-devel] [PATCH V12 5/5] domcreate: support pvusb in configuration file
Add code to support pvusb in domain config file. One could specify usbctrl and usb in domain's configuration file and create domain, then usb controllers will be created and usb device would be attached to guest automatically. One could specify usb controllers and usb devices in config file like this: usbctrl=['version=2,ports=4', 'version=1, ports=4', ] usbdev=['hostbus=2, hostaddr=1, controller=0,port=1', ] Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: George Dunlap <george.dun...@citrix.com> --- docs/man/xl.cfg.pod.5| 84 tools/libxl/libxl_create.c | 73 -- tools/libxl/libxl_device.c | 4 +++ tools/libxl/libxl_internal.h | 8 + tools/libxl/xl_cmdimpl.c | 55 - 5 files changed, 220 insertions(+), 4 deletions(-) diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 index 8899f75..99ef9ca 100644 --- a/docs/man/xl.cfg.pod.5 +++ b/docs/man/xl.cfg.pod.5 @@ -722,6 +722,90 @@ Note this may be overridden by rdm_policy option in PCI device configuration. =back +=item B
[Xen-devel] [PATCH V12 2/5] libxl_utils: add internal function to read sysfs file contents
Add a new function libxl_read_sysfs_file_contents to handle sysfs file specially. It would be used in later pvusb work. Signed-off-by: Chunyan Liu <cy...@suse.com> --- Changes: * remove unnecessary null pointer check after libxl__alloc and libxl__realloc tools/libxl/libxl_internal.h | 4 +++ tools/libxl/libxl_utils.c| 74 2 files changed, 78 insertions(+) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 9e94835..d1eb18f 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -4039,6 +4039,10 @@ void libxl__bitmap_copy_best_effort(libxl__gc *gc, libxl_bitmap *dptr, int libxl__count_physical_sockets(libxl__gc *gc, int *sockets); +_hidden int libxl__read_sysfs_file_contents(libxl__gc *gc, +const char *filename, +void **data_r, +int *datalen_r); #define LIBXL_QEMU_USER_PREFIX "xen-qemuuser" #define LIBXL_QEMU_USER_BASE LIBXL_QEMU_USER_PREFIX"-domid" diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index e42422a..e64f301 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -396,6 +396,80 @@ int libxl_read_file_contents(libxl_ctx *ctx, const char *filename, return e; } +int libxl__read_sysfs_file_contents(libxl__gc *gc, const char *filename, +void **data_r, int *datalen_r) +{ +FILE *f = 0; +uint8_t *data = 0; +int datalen = 0; +int e; +struct stat stab; +ssize_t rs; + +f = fopen(filename, "r"); +if (!f) { +if (errno == ENOENT) return ENOENT; +LOGE(ERROR, "failed to open %s", filename); +goto xe; +} + +if (fstat(fileno(f), )) { +LOGE(ERROR, "failed to fstat %s", filename); +goto xe; +} + +if (!S_ISREG(stab.st_mode)) { +LOGE(ERROR, "%s is not a plain file", filename); +errno = ENOTTY; +goto xe; +} + +if (stab.st_size > INT_MAX) { +LOG(ERROR, "file %s is far too large", filename); +errno = EFBIG; +goto xe; +} + +datalen = stab.st_size; + +if (stab.st_size && data_r) { +data = libxl__malloc(gc, datalen); + +/* For sysfs file, datalen is always PAGE_SIZE. 'read' + * will return the number of bytes of the actual content, + * rs <= datalen is expected. + */ +rs = fread(data, 1, datalen, f); +if (rs < datalen) { +if (ferror(f)) { +LOGE(ERROR, "failed to read %s", filename); +goto xe; +} + +datalen = rs; +data = libxl__realloc(gc, data, datalen); +} +} + +if (fclose(f)) { +f = 0; +LOGE(ERROR, "failed to close %s", filename); +goto xe; +} + +if (data_r) *data_r = data; +if (datalen_r) *datalen_r = datalen; + +return 0; + + xe: +e = errno; +assert(e != ENOENT); +if (f) fclose(f); +return e; +} + + #define READ_WRITE_EXACTLY(rw, zero_is_eof, constdata)\ \ int libxl_##rw##_exactly(libxl_ctx *ctx, int fd, \ -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V12 1/5] libxl: export some functions for pvusb use
Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: Wei Liu <wei.l...@citrix.com> --- tools/libxl/libxl.c | 5 ++--- tools/libxl/libxl_internal.h | 3 +++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 00d9ec4..43d5709 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -2036,7 +2036,7 @@ out: } /* common function to get next device id */ -static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) +int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) { char *dompath, **l; unsigned int nb; @@ -2055,8 +2055,7 @@ static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) return nextid; } -static int libxl__resolve_domid(libxl__gc *gc, const char *name, -uint32_t *domid) +int libxl__resolve_domid(libxl__gc *gc, const char *name, uint32_t *domid) { if (!name) return 0; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 4c01a82..9e94835 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1176,6 +1176,9 @@ _hidden int libxl__init_console_from_channel(libxl__gc *gc, libxl__device_console *console, int dev_num, libxl_device_channel *channel); +_hidden int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device); +_hidden int libxl__resolve_domid(libxl__gc *gc, const char *name, + uint32_t *domid); /* * For each aggregate type which can be used as an input we provide: -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V12 2/5] libxl_utils: add internal function to read sysfs file contents
Add a new function libxl_read_sysfs_file_contents to handle sysfs file specially. It would be used in later pvusb work. Signed-off-by: Chunyan Liu <cy...@suse.com> --- Changes: * remove unnecessary null pointer check after libxl__alloc and libxl__realloc tools/libxl/libxl_internal.h | 4 +++ tools/libxl/libxl_utils.c| 74 2 files changed, 78 insertions(+) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 9e94835..d1eb18f 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -4039,6 +4039,10 @@ void libxl__bitmap_copy_best_effort(libxl__gc *gc, libxl_bitmap *dptr, int libxl__count_physical_sockets(libxl__gc *gc, int *sockets); +_hidden int libxl__read_sysfs_file_contents(libxl__gc *gc, +const char *filename, +void **data_r, +int *datalen_r); #define LIBXL_QEMU_USER_PREFIX "xen-qemuuser" #define LIBXL_QEMU_USER_BASE LIBXL_QEMU_USER_PREFIX"-domid" diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index e42422a..e64f301 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -396,6 +396,80 @@ int libxl_read_file_contents(libxl_ctx *ctx, const char *filename, return e; } +int libxl__read_sysfs_file_contents(libxl__gc *gc, const char *filename, +void **data_r, int *datalen_r) +{ +FILE *f = 0; +uint8_t *data = 0; +int datalen = 0; +int e; +struct stat stab; +ssize_t rs; + +f = fopen(filename, "r"); +if (!f) { +if (errno == ENOENT) return ENOENT; +LOGE(ERROR, "failed to open %s", filename); +goto xe; +} + +if (fstat(fileno(f), )) { +LOGE(ERROR, "failed to fstat %s", filename); +goto xe; +} + +if (!S_ISREG(stab.st_mode)) { +LOGE(ERROR, "%s is not a plain file", filename); +errno = ENOTTY; +goto xe; +} + +if (stab.st_size > INT_MAX) { +LOG(ERROR, "file %s is far too large", filename); +errno = EFBIG; +goto xe; +} + +datalen = stab.st_size; + +if (stab.st_size && data_r) { +data = libxl__malloc(gc, datalen); + +/* For sysfs file, datalen is always PAGE_SIZE. 'read' + * will return the number of bytes of the actual content, + * rs <= datalen is expected. + */ +rs = fread(data, 1, datalen, f); +if (rs < datalen) { +if (ferror(f)) { +LOGE(ERROR, "failed to read %s", filename); +goto xe; +} + +datalen = rs; +data = libxl__realloc(gc, data, datalen); +} +} + +if (fclose(f)) { +f = 0; +LOGE(ERROR, "failed to close %s", filename); +goto xe; +} + +if (data_r) *data_r = data; +if (datalen_r) *datalen_r = datalen; + +return 0; + + xe: +e = errno; +assert(e != ENOENT); +if (f) fclose(f); +return e; +} + + #define READ_WRITE_EXACTLY(rw, zero_is_eof, constdata)\ \ int libxl_##rw##_exactly(libxl_ctx *ctx, int fd, \ -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V12 5/5] domcreate: support pvusb in configuration file
Add code to support pvusb in domain config file. One could specify usbctrl and usb in domain's configuration file and create domain, then usb controllers will be created and usb device would be attached to guest automatically. One could specify usb controllers and usb devices in config file like this: usbctrl=['version=2,ports=4', 'version=1, ports=4', ] usbdev=['hostbus=2, hostaddr=1, controller=0,port=1', ] Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: George Dunlap <george.dun...@citrix.com> --- docs/man/xl.cfg.pod.5| 84 tools/libxl/libxl_create.c | 73 -- tools/libxl/libxl_device.c | 4 +++ tools/libxl/libxl_internal.h | 8 + tools/libxl/xl_cmdimpl.c | 55 - 5 files changed, 220 insertions(+), 4 deletions(-) diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 index 8899f75..99ef9ca 100644 --- a/docs/man/xl.cfg.pod.5 +++ b/docs/man/xl.cfg.pod.5 @@ -722,6 +722,90 @@ Note this may be overridden by rdm_policy option in PCI device configuration. =back +=item B
[Xen-devel] [PATCH V12 4/5] xl: add pvusb commands
Add pvusb commands: usbctrl-attach, usbctrl-detach, usb-list, usbdev-attach and usbdev-detach. To attach a usb device to guest through pvusb, one could follow following example: #xl usbctrl-attach test_vm version=1 ports=8 #xl usb-list test_vm will show the usb controllers and port usage under the domain. #xl usbdev-attach test_vm hostbus=1 hostaddr=2 will find the first usable controller:port, and attach usb device whose busnum is 1 and devnum is 6. One could also specify which and which . #xl usbdev-detach test_vm 0 1 will detach USB device under controller 0 port 1. #xl usbctrl-detach test_vm dev_id will destroy the controller with specified dev_id. Dev_id can be traced in usb-list info. Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: George Dunlap <george.dun...@citrix.com> --- docs/man/xl.pod.1 | 41 tools/libxl/xl.h | 5 + tools/libxl/xl_cmdimpl.c | 243 ++ tools/libxl/xl_cmdtable.c | 25 + 4 files changed, 314 insertions(+) diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1 index 4279c7c..746f49f 100644 --- a/docs/man/xl.pod.1 +++ b/docs/man/xl.pod.1 @@ -1345,6 +1345,47 @@ List pass-through pci devices for a domain. =back +=head1 USB PASS-THROUGH + +=over 4 + +=item B I I[
[Xen-devel] [PATCH V12 0/5] xen pvusb toolstack work
oller with index 0 and all USB devices under it. 4. PVUSB Libxl implementation * usb-ctrl-attach To create a usb controller, we need: 1) generate usb controler related information 2) write usb controller frontend/backend info to xenstore PVUSB frontend and backend driver will probe xenstore paths and build connection between frontend and backend. * usb-ctrl-detach To remove a usb controller, we need: 1) check if the usb controller exists or not 2) remove all usb devices under controller 3) remove usb controller info from xenstore * usb-attach To attach a usb device, we need: 1) check if the usb device type is assignable 2) check if the usb device is already assigned to a domain 3) add 'busid' of the usb device to xenstore contoller/port/. PVUSB driver watches the xenstore changes and detects that, and needs to use 'busid' to do following work. 4) unbind usb device from original driver and bind to usbback. If usb device has many interfaces, then: - unbind each interface from its original driver and bind to usbback. - store the original driver to xenstore for later rebinding when detaching the device. * usb-detach To detach a usb device, we need: 1) check if the usb device is assigned to the domain 2) remove the usb device from xenstore controller/port. 3) unbind usb device from usbback and rebind to its original driver. If usb device has many interfaces, do it to each interface. * usb-list List all USB controllers and USB devices under each controller. 5. PVUSB xenstore information PVUSB xenstore information includes three parts: frontend, backend and /libxl part. A USB controller is corresponding to a "vusb" device in xenstore. Adding a USB controller will add a new "vusb" device, removing a USB controller will delete the related "vusb" device. Following is an example xenstore values of a USB controller. Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "" 2 = "" 3 = "" 4 = "" Frontend: device = "" vusb = "" 0 = "" backend = "/local/domain/0/backend/vusb/1/0" backend-id = "0" state = "4" urb-ring-ref = "348" conn-ring-ref = "346" event-channel = "20" Adding a USB device won't create a new "vusb" device, but only write the USB device busid to one port of USB controller. For example, attaching a USB device (busid is 2-1.6) to above USB controller port 1, it only need write 2-1.6 to port 1 of this USB controller: Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "2-1.6" 2 = "" 3 = "" 4 = "" Frontend doesn't change. Since assign a host USB device to guest, we'll unbind USB interfaces from their original drivers and bind them to usbback. After detaching this USB device from guest, one would hope the USB interfaces could be rebind to their original drivers, so there should some place to get the original driver info. To support that, when attaching a USB device to guest, we'll save the original driver info in xenstore too, the place is /libxl/usbback, for example: libxl = "" 1 = "" dm-version = "qemu_xen" usbback = "" 3-11 = "" 3-11@1_0 = "" driver_path = "/sys/bus/usb/drivers/btusb" In this example, USB device (busid is 3-11, /sys/bus/usb/devices/3-11). It has interface 3-11:1.0, whose original dirver is btusb. Since xenstore doesn't allow ':' and '.' in a key, so we encode the interface by changing ':' to '@' and changing '.' to '_'. When detaching the USB device from guest, we can rebind 3-11:1.0 to btusb driver. Chunyan Liu (5): libxl: export some functions for pvusb use libxl_utils: add internal function to read sysfs file contents libxl: add pvusb API xl: add pvusb commands domcreate: support pvusb in configuration file docs/man/xl.cfg.pod.5| 84 ++ docs/man/xl.pod.1| 41 + tools/libxl/Makefile |2 +- tools/libxl/libxl.c | 39 +- tools/libxl/libxl.h | 77 ++ tools/libxl/libxl_create.c | 73 +-
[Xen-devel] [PATCH V12 3/5] libxl: add pvusb API
Add pvusb APIs, including: - attach/detach (create/destroy) virtual usb controller. - attach/detach usb device - list usb controller and usb devices - some other helper functions Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Signed-off-by: George Dunlap <george.dun...@citrix.com> Reviewed-by: George Dunlap <george.dun...@citrix.com> --- tools/libxl/Makefile |2 +- tools/libxl/libxl.c | 34 +- tools/libxl/libxl.h | 77 ++ tools/libxl/libxl_device.c | 13 +- tools/libxl/libxl_internal.h | 22 +- tools/libxl/libxl_osdeps.h | 13 + tools/libxl/libxl_pvusb.c| 1548 ++ tools/libxl/libxl_types.idl | 46 + tools/libxl/libxl_types_internal.idl |1 + tools/libxl/libxl_utils.c| 18 + tools/libxl/libxl_utils.h|5 + 11 files changed, 1766 insertions(+), 13 deletions(-) create mode 100644 tools/libxl/libxl_pvusb.c diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile index 6ff5bee..a36145a 100644 --- a/tools/libxl/Makefile +++ b/tools/libxl/Makefile @@ -103,7 +103,7 @@ LIBXL_OBJS = flexarray.o libxl.o libxl_create.o libxl_dm.o libxl_pci.o \ libxl_stream_read.o libxl_stream_write.o \ libxl_save_callout.o _libxl_save_msgs_callout.o \ libxl_qmp.o libxl_event.o libxl_fork.o \ - libxl_dom_suspend.o $(LIBXL_OBJS-y) + libxl_dom_suspend.o libxl_pvusb.o $(LIBXL_OBJS-y) LIBXL_OBJS += libxl_genid.o LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 43d5709..920c135 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -3204,7 +3204,7 @@ void libxl__device_disk_local_initiate_detach(libxl__egc *egc, aodev->dev = device; aodev->callback = local_device_detach_cb; aodev->force = 0; -libxl__initiate_device_remove(egc, aodev); +libxl__initiate_device_generic_remove(egc, aodev); return; } @@ -4172,8 +4172,10 @@ out: * libxl_device_vkb_destroy * libxl_device_vfb_remove * libxl_device_vfb_destroy + * libxl_device_usbctrl_remove + * libxl_device_usbctrl_destroy */ -#define DEFINE_DEVICE_REMOVE(type, removedestroy, f)\ +#define DEFINE_DEVICE_REMOVE_EXT(type, remtype, removedestroy, f)\ int libxl_device_##type##_##removedestroy(libxl_ctx *ctx, \ uint32_t domid, libxl_device_##type *type, \ const libxl_asyncop_how *ao_how)\ @@ -4193,13 +4195,19 @@ out: aodev->dev = device;\ aodev->callback = device_addrm_aocomplete; \ aodev->force = f; \ -libxl__initiate_device_remove(egc, aodev); \ +libxl__initiate_device_##remtype##_remove(egc, aodev); \ \ out:\ -if (rc) return AO_CREATE_FAIL(rc);\ +if (rc) return AO_CREATE_FAIL(rc); \ return AO_INPROGRESS; \ } +#define DEFINE_DEVICE_REMOVE(type, removedestroy, f) \ +DEFINE_DEVICE_REMOVE_EXT(type, generic, removedestroy, f) + +#define DEFINE_DEVICE_REMOVE_CUSTOM(type, removedestroy, f) \ +DEFINE_DEVICE_REMOVE_EXT(type, type, removedestroy, f) + /* Define all remove/destroy functions and undef the macro */ /* disk */ @@ -4223,6 +4231,10 @@ DEFINE_DEVICE_REMOVE(vfb, destroy, 1) DEFINE_DEVICE_REMOVE(vtpm, remove, 0) DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) +/* usbctrl */ +DEFINE_DEVICE_REMOVE_CUSTOM(usbctrl, remove, 0) +DEFINE_DEVICE_REMOVE_CUSTOM(usbctrl, destroy, 1) + /* channel/console hotunplug is not implemented. There are 2 possibilities: * 1. add support for secondary consoles to xenconsoled * 2. dynamically add/remove qemu chardevs via qmp messages. */ @@ -4236,6 +4248,8 @@ DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) * libxl_device_disk_add * libxl_device_nic_add * libxl_device_vtpm_add + * libxl_device_usbctrl_add + * libxl_device_usbdev_add */ #define DEFINE_DEVICE_ADD(type) \ @@ -4267,6 +4281,12 @@ DEFINE_DEVICE_ADD(nic) /* vtpm */ DEFINE_DEVICE_ADD(vtpm) +/* usbctrl */ +DEFINE_DEVICE_ADD(usbctrl) + +/* usb */ +DEFINE_DEVICE_ADD(usbdev) + #undef DEFINE_DEVICE_ADD /**/ @@ -4432,7 +4452,7 @@ static int remove_device(libxl__egc *egc
[Xen-devel] [PATCH V11 3/5] libxl: add pvusb API
Add pvusb APIs, including: - attach/detach (create/destroy) virtual usb controller. - attach/detach usb device - list usb controller and usb devices - some other helper functions Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Signed-off-by: George Dunlap <george.dun...@citrix.com> --- changes: * format fix: extra white space, line > 80, etc. * return ERROR_FAILED instead of errno (>0) in sysfs_write_intf * fix an error in libxl_ctrlport_to_device_usbdev * extract a helper function for alloc_dirent tools/libxl/Makefile |2 +- tools/libxl/libxl.c | 34 +- tools/libxl/libxl.h | 77 ++ tools/libxl/libxl_device.c | 13 +- tools/libxl/libxl_internal.h | 22 +- tools/libxl/libxl_osdeps.h | 13 + tools/libxl/libxl_pvusb.c| 1548 ++ tools/libxl/libxl_types.idl | 46 + tools/libxl/libxl_types_internal.idl |1 + tools/libxl/libxl_utils.c| 18 + tools/libxl/libxl_utils.h|5 + 11 files changed, 1766 insertions(+), 13 deletions(-) create mode 100644 tools/libxl/libxl_pvusb.c diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile index 6ff5bee..a36145a 100644 --- a/tools/libxl/Makefile +++ b/tools/libxl/Makefile @@ -103,7 +103,7 @@ LIBXL_OBJS = flexarray.o libxl.o libxl_create.o libxl_dm.o libxl_pci.o \ libxl_stream_read.o libxl_stream_write.o \ libxl_save_callout.o _libxl_save_msgs_callout.o \ libxl_qmp.o libxl_event.o libxl_fork.o \ - libxl_dom_suspend.o $(LIBXL_OBJS-y) + libxl_dom_suspend.o libxl_pvusb.o $(LIBXL_OBJS-y) LIBXL_OBJS += libxl_genid.o LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index e10242d..2e4e1c3 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -3201,7 +3201,7 @@ void libxl__device_disk_local_initiate_detach(libxl__egc *egc, aodev->dev = device; aodev->callback = local_device_detach_cb; aodev->force = 0; -libxl__initiate_device_remove(egc, aodev); +libxl__initiate_device_generic_remove(egc, aodev); return; } @@ -4154,8 +4154,10 @@ out: * libxl_device_vkb_destroy * libxl_device_vfb_remove * libxl_device_vfb_destroy + * libxl_device_usbctrl_remove + * libxl_device_usbctrl_destroy */ -#define DEFINE_DEVICE_REMOVE(type, removedestroy, f)\ +#define DEFINE_DEVICE_REMOVE_EXT(type, remtype, removedestroy, f)\ int libxl_device_##type##_##removedestroy(libxl_ctx *ctx, \ uint32_t domid, libxl_device_##type *type, \ const libxl_asyncop_how *ao_how)\ @@ -4175,13 +4177,19 @@ out: aodev->dev = device;\ aodev->callback = device_addrm_aocomplete; \ aodev->force = f; \ -libxl__initiate_device_remove(egc, aodev); \ +libxl__initiate_device_##remtype##_remove(egc, aodev); \ \ out:\ -if (rc) return AO_CREATE_FAIL(rc);\ +if (rc) return AO_CREATE_FAIL(rc); \ return AO_INPROGRESS; \ } +#define DEFINE_DEVICE_REMOVE(type, removedestroy, f) \ +DEFINE_DEVICE_REMOVE_EXT(type, generic, removedestroy, f) + +#define DEFINE_DEVICE_REMOVE_CUSTOM(type, removedestroy, f) \ +DEFINE_DEVICE_REMOVE_EXT(type, type, removedestroy, f) + /* Define all remove/destroy functions and undef the macro */ /* disk */ @@ -4205,6 +4213,10 @@ DEFINE_DEVICE_REMOVE(vfb, destroy, 1) DEFINE_DEVICE_REMOVE(vtpm, remove, 0) DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) +/* usbctrl */ +DEFINE_DEVICE_REMOVE_CUSTOM(usbctrl, remove, 0) +DEFINE_DEVICE_REMOVE_CUSTOM(usbctrl, destroy, 1) + /* channel/console hotunplug is not implemented. There are 2 possibilities: * 1. add support for secondary consoles to xenconsoled * 2. dynamically add/remove qemu chardevs via qmp messages. */ @@ -4218,6 +4230,8 @@ DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) * libxl_device_disk_add * libxl_device_nic_add * libxl_device_vtpm_add + * libxl_device_usbctrl_add + * libxl_device_usbdev_add */ #define DEFINE_DEVICE_ADD(type) \ @@ -4249,6 +4263,12 @@ DEFINE_DEVICE_ADD(nic) /* vtpm */ DEFINE_DEVICE_ADD(vtpm) +/* usbctrl */ +DEFINE_DEVICE_ADD(usbctrl) + +/* usb */ +DEFINE_DEVI
[Xen-devel] [PATCH V11 2/5] libxl_utils: add internal function to read sysfs file contents
Add a new function libxl_read_sysfs_file_contents to handle sysfs file specially. It would be used in later pvusb work. Signed-off-by: Chunyan Liu <cy...@suse.com> --- tools/libxl/libxl_internal.h | 4 +++ tools/libxl/libxl_utils.c| 77 2 files changed, 81 insertions(+) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index beaef3f..6b873c7 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -4026,6 +4026,10 @@ void libxl__bitmap_copy_best_effort(libxl__gc *gc, libxl_bitmap *dptr, int libxl__count_physical_sockets(libxl__gc *gc, int *sockets); +_hidden int libxl__read_sysfs_file_contents(libxl__gc *gc, +const char *filename, +void **data_r, +int *datalen_r); #define LIBXL_QEMU_USER_PREFIX "xen-qemuuser" #define LIBXL_QEMU_USER_BASE LIBXL_QEMU_USER_PREFIX"-domid" diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index e42422a..7f612a6 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -396,6 +396,83 @@ int libxl_read_file_contents(libxl_ctx *ctx, const char *filename, return e; } +int libxl__read_sysfs_file_contents(libxl__gc *gc, const char *filename, +void **data_r, int *datalen_r) +{ +FILE *f = 0; +uint8_t *data = 0; +int datalen = 0; +int e; +struct stat stab; +ssize_t rs; + +f = fopen(filename, "r"); +if (!f) { +if (errno == ENOENT) return ENOENT; +LOGE(ERROR, "failed to open %s", filename); +goto xe; +} + +if (fstat(fileno(f), )) { +LOGE(ERROR, "failed to fstat %s", filename); +goto xe; +} + +if (!S_ISREG(stab.st_mode)) { +LOGE(ERROR, "%s is not a plain file", filename); +errno = ENOTTY; +goto xe; +} + +if (stab.st_size > INT_MAX) { +LOG(ERROR, "file %s is far too large", filename); +errno = EFBIG; +goto xe; +} + +datalen = stab.st_size; + +if (stab.st_size && data_r) { +data = libxl__malloc(gc, datalen); +if (!data) goto xe; + +/* For sysfs file, datalen is always PAGE_SIZE. 'read' + * will return the number of bytes of the actual content, + * rs <= datalen is expected. + */ +rs = fread(data, 1, datalen, f); +if (rs < datalen) { +if (ferror(f)) { +LOGE(ERROR, "failed to read %s", filename); +goto xe; +} + +datalen = rs; +data = libxl__realloc(gc, data, datalen); +if (!data) +goto xe; +} +} + +if (fclose(f)) { +f = 0; +LOGE(ERROR, "failed to close %s", filename); +goto xe; +} + +if (data_r) *data_r = data; +if (datalen_r) *datalen_r = datalen; + +return 0; + + xe: +e = errno; +assert(e != ENOENT); +if (f) fclose(f); +return e; +} + + #define READ_WRITE_EXACTLY(rw, zero_is_eof, constdata)\ \ int libxl_##rw##_exactly(libxl_ctx *ctx, int fd, \ -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V11 5/5] domcreate: support pvusb in configuration file
Add code to support pvusb in domain config file. One could specify usbctrl and usb in domain's configuration file and create domain, then usb controllers will be created and usb device would be attached to guest automatically. One could specify usb controllers and usb devices in config file like this: usbctrl=['version=2,ports=4', 'version=1, ports=4', ] usbdev=['hostbus=2, hostaddr=1, controller=0,port=1', ] Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: George Dunlap <george.dun...@citrix.com> --- docs/man/xl.cfg.pod.5| 84 tools/libxl/libxl_create.c | 73 -- tools/libxl/libxl_device.c | 4 +++ tools/libxl/libxl_internal.h | 8 + tools/libxl/xl_cmdimpl.c | 55 - 5 files changed, 220 insertions(+), 4 deletions(-) diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 index 3b695bd..db5a443 100644 --- a/docs/man/xl.cfg.pod.5 +++ b/docs/man/xl.cfg.pod.5 @@ -722,6 +722,90 @@ Note this may be overridden by rdm_policy option in PCI device configuration. =back +=item B
[Xen-devel] [PATCH V11 1/5] libxl: export some functions for pvusb use
Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: Wei Liu <wei.l...@citrix.com> --- tools/libxl/libxl.c | 5 ++--- tools/libxl/libxl_internal.h | 3 +++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 712ea5a..e10242d 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -2033,7 +2033,7 @@ out: } /* common function to get next device id */ -static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) +int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) { char *dompath, **l; unsigned int nb; @@ -2052,8 +2052,7 @@ static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) return nextid; } -static int libxl__resolve_domid(libxl__gc *gc, const char *name, -uint32_t *domid) +int libxl__resolve_domid(libxl__gc *gc, const char *name, uint32_t *domid) { if (!name) return 0; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 622c0f9..beaef3f 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1167,6 +1167,9 @@ _hidden int libxl__init_console_from_channel(libxl__gc *gc, libxl__device_console *console, int dev_num, libxl_device_channel *channel); +_hidden int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device); +_hidden int libxl__resolve_domid(libxl__gc *gc, const char *name, + uint32_t *domid); /* * For each aggregate type which can be used as an input we provide: -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V11 4/5] xl: add pvusb commands
Add pvusb commands: usbctrl-attach, usbctrl-detach, usb-list, usbdev-attach and usbdev-detach. To attach a usb device to guest through pvusb, one could follow following example: #xl usbctrl-attach test_vm version=1 ports=8 #xl usb-list test_vm will show the usb controllers and port usage under the domain. #xl usbdev-attach test_vm hostbus=1 hostaddr=2 will find the first usable controller:port, and attach usb device whose busnum is 1 and devnum is 6. One could also specify which and which . #xl usbdev-detach test_vm 0 1 will detach USB device under controller 0 port 1. #xl usbctrl-detach test_vm dev_id will destroy the controller with specified dev_id. Dev_id can be traced in usb-list info. Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: George Dunlap <george.dun...@citrix.com> --- docs/man/xl.pod.1 | 41 tools/libxl/xl.h | 5 + tools/libxl/xl_cmdimpl.c | 243 ++ tools/libxl/xl_cmdtable.c | 25 + 4 files changed, 314 insertions(+) diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1 index 4279c7c..746f49f 100644 --- a/docs/man/xl.pod.1 +++ b/docs/man/xl.pod.1 @@ -1345,6 +1345,47 @@ List pass-through pci devices for a domain. =back +=head1 USB PASS-THROUGH + +=over 4 + +=item B I I[
[Xen-devel] [PATCH V11 0/5] xen pvusb toolstack work
lementation * usb-ctrl-attach To create a usb controller, we need: 1) generate usb controler related information 2) write usb controller frontend/backend info to xenstore PVUSB frontend and backend driver will probe xenstore paths and build connection between frontend and backend. * usb-ctrl-detach To remove a usb controller, we need: 1) check if the usb controller exists or not 2) remove all usb devices under controller 3) remove usb controller info from xenstore * usb-attach To attach a usb device, we need: 1) check if the usb device type is assignable 2) check if the usb device is already assigned to a domain 3) add 'busid' of the usb device to xenstore contoller/port/. PVUSB driver watches the xenstore changes and detects that, and needs to use 'busid' to do following work. 4) unbind usb device from original driver and bind to usbback. If usb device has many interfaces, then: - unbind each interface from its original driver and bind to usbback. - store the original driver to xenstore for later rebinding when detaching the device. * usb-detach To detach a usb device, we need: 1) check if the usb device is assigned to the domain 2) remove the usb device from xenstore controller/port. 3) unbind usb device from usbback and rebind to its original driver. If usb device has many interfaces, do it to each interface. * usb-list List all USB controllers and USB devices under each controller. 5. PVUSB xenstore information PVUSB xenstore information includes three parts: frontend, backend and /libxl part. A USB controller is corresponding to a "vusb" device in xenstore. Adding a USB controller will add a new "vusb" device, removing a USB controller will delete the related "vusb" device. Following is an example xenstore values of a USB controller. Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "" 2 = "" 3 = "" 4 = "" Frontend: device = "" vusb = "" 0 = "" backend = "/local/domain/0/backend/vusb/1/0" backend-id = "0" state = "4" urb-ring-ref = "348" conn-ring-ref = "346" event-channel = "20" Adding a USB device won't create a new "vusb" device, but only write the USB device busid to one port of USB controller. For example, attaching a USB device (busid is 2-1.6) to above USB controller port 1, it only need write 2-1.6 to port 1 of this USB controller: Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "2-1.6" 2 = "" 3 = "" 4 = "" Frontend doesn't change. Since assign a host USB device to guest, we'll unbind USB interfaces from their original drivers and bind them to usbback. After detaching this USB device from guest, one would hope the USB interfaces could be rebind to their original drivers, so there should some place to get the original driver info. To support that, when attaching a USB device to guest, we'll save the original driver info in xenstore too, the place is /libxl/usbback, for example: libxl = "" 1 = "" dm-version = "qemu_xen" usbback = "" 3-11 = "" 3-11@1_0 = "" driver_path = "/sys/bus/usb/drivers/btusb" In this example, USB device (busid is 3-11, /sys/bus/usb/devices/3-11). It has interface 3-11:1.0, whose original dirver is btusb. Since xenstore doesn't allow ':' and '.' in a key, so we encode the interface by changing ':' to '@' and changing '.' to '_'. When detaching the USB device from guest, we can rebind 3-11:1.0 to btusb driver. Chunyan Liu (5): libxl: export some functions for pvusb use libxl_utils: add internal function to read sysfs file contents libxl: add pvusb API xl: add pvusb commands domcreate: support pvusb in configuration file docs/man/xl.cfg.pod.5| 84 ++ docs/man/xl.pod.1| 41 + tools/libxl/Makefile |2 +- tools/libxl/libxl.c | 39 +- tools/libxl/libxl.h | 77 ++ tools/libxl/libxl_create.c | 73 +- tools/libxl/libxl_device.c | 17 +- tools/libxl/libxl_intern
[Xen-devel] [RFC PATCH] libxl: add screendump API
Currently libvirt kvm can support domain screenshot but libxl cannot. This patch is trying to add screendump API in libxl by calling qmp 'screendump' command, so to support screenshot for domains. Signed-off-by: Chunyan Liu <cy...@suse.com> --- tools/libxl/libxl.c | 36 tools/libxl/libxl.h | 9 + tools/libxl/libxl_internal.h | 2 ++ tools/libxl/libxl_qmp.c | 8 4 files changed, 55 insertions(+) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index bd3aac8..712ea5a 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -6824,6 +6824,42 @@ out: return rc; } +int libxl_domain_screendump(libxl_ctx *ctx, uint32_t domid, +const char *filename) +{ +GC_INIT(ctx); +char *pid; +int rc, dm_present; + +switch (libxl__domain_type(gc, domid)) { +case LIBXL_DOMAIN_TYPE_HVM: +if (!libxl_get_stubdom_id(ctx, domid)) +dm_present = 1; +else +dm_present = 0; +break; +case LIBXL_DOMAIN_TYPE_PV: +pid = libxl__xs_read(gc, XBT_NULL, GCSPRINTF("/local/domain/%d/image/device-model-pid", domid)); +dm_present = (pid != NULL); +break; +case LIBXL_DOMAIN_TYPE_INVALID: +default: +rc = ERROR_FAIL; +goto out; +} + +if (dm_present) { +rc = libxl__qmp_screendump(gc, domid, filename); +} else { +LOG(ERROR, "Not supported"); +rc = ERROR_FAIL; +} + +out: +GC_FREE; +return rc; +} + /* * Local variables: * mode: C diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 6b73848..f1fb5b7 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -218,6 +218,12 @@ #define LIBXL_HAVE_SOFT_RESET 1 /* + * LIBXL_HAVE_SCREENDUMP indicates that libxl supports taking + * screenshot for domains. + */ +#define LIBXL_HAVE_SCREENDUMP 1 + +/* * libxl ABI compatibility * * The only guarantee which libxl makes regarding ABI compatibility @@ -1657,6 +1663,9 @@ int libxl_send_trigger(libxl_ctx *ctx, uint32_t domid, int libxl_send_sysrq(libxl_ctx *ctx, uint32_t domid, char sysrq); int libxl_send_debug_keys(libxl_ctx *ctx, char *keys); +int libxl_domain_screendump(libxl_ctx *ctx, uint32_t domid, +const char *filename); + typedef struct libxl__xen_console_reader libxl_xen_console_reader; libxl_xen_console_reader * diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 58d07cd..230da23 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1734,6 +1734,8 @@ typedef struct libxl__qmp_handler libxl__qmp_handler; */ _hidden libxl__qmp_handler *libxl__qmp_initialize(libxl__gc *gc, uint32_t domid); +_hidden int libxl__qmp_screendump(libxl__gc *gc, int domid, + const char *filename); /* ask to QEMU the serial port information and store it in xenstore. */ _hidden int libxl__qmp_query_serial(libxl__qmp_handler *qmp); _hidden int libxl__qmp_pci_add(libxl__gc *gc, int d, libxl_device_pci *pcidev); diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c index f798de7..835b43d 100644 --- a/tools/libxl/libxl_qmp.c +++ b/tools/libxl/libxl_qmp.c @@ -968,6 +968,14 @@ int libxl__qmp_cpu_add(libxl__gc *gc, int domid, int idx) return qmp_run_command(gc, domid, "cpu-add", args, NULL, NULL); } +int libxl__qmp_screendump(libxl__gc *gc, int domid, const char *filename) +{ +libxl__json_object *args = NULL; + +qmp_parameters_add_string(gc, , "filename", filename); +return qmp_run_command(gc, domid, "screendump", args, NULL, NULL); +} + int libxl__qmp_initializations(libxl__gc *gc, uint32_t domid, const libxl_domain_config *guest_config) { -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [RESEND][PATCH V9 0/7] xen pvusb toolstack work
by usb-ctrl-detach command. e.g. xl usb-ctrl-detach domain 0 It will remove the USB controller with index 0 and all USB devices under it. 4. PVUSB Libxl implementation * usb-ctrl-attach To create a usb controller, we need: 1) generate usb controler related information 2) write usb controller frontend/backend info to xenstore PVUSB frontend and backend driver will probe xenstore paths and build connection between frontend and backend. * usb-ctrl-detach To remove a usb controller, we need: 1) check if the usb controller exists or not 2) remove all usb devices under controller 3) remove usb controller info from xenstore * usb-attach To attach a usb device, we need: 1) check if the usb device type is assignable 2) check if the usb device is already assigned to a domain 3) add 'busid' of the usb device to xenstore contoller/port/. PVUSB driver watches the xenstore changes and detects that, and needs to use 'busid' to do following work. 4) unbind usb device from original driver and bind to usbback. If usb device has many interfaces, then: - unbind each interface from its original driver and bind to usbback. - store the original driver to xenstore for later rebinding when detaching the device. * usb-detach To detach a usb device, we need: 1) check if the usb device is assigned to the domain 2) remove the usb device from xenstore controller/port. 3) unbind usb device from usbback and rebind to its original driver. If usb device has many interfaces, do it to each interface. * usb-list List all USB controllers and USB devices under each controller. 5. PVUSB xenstore information PVUSB xenstore information includes three parts: frontend, backend and /libxl part. A USB controller is corresponding to a "vusb" device in xenstore. Adding a USB controller will add a new "vusb" device, removing a USB controller will delete the related "vusb" device. Following is an example xenstore values of a USB controller. Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "" 2 = "" 3 = "" 4 = "" Frontend: device = "" vusb = "" 0 = "" backend = "/local/domain/0/backend/vusb/1/0" backend-id = "0" state = "4" urb-ring-ref = "348" conn-ring-ref = "346" event-channel = "20" Adding a USB device won't create a new "vusb" device, but only write the USB device busid to one port of USB controller. For example, attaching a USB device (busid is 2-1.6) to above USB controller port 1, it only need write 2-1.6 to port 1 of this USB controller: Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "2-1.6" 2 = "" 3 = "" 4 = "" Frontend doesn't change. Since assign a host USB device to guest, we'll unbind USB interfaces from their original drivers and bind them to usbback. After detaching this USB device from guest, one would hope the USB interfaces could be rebind to their original drivers, so there should some place to get the original driver info. To support that, when attaching a USB device to guest, we'll save the original driver info in xenstore too, the place is /libxl/usbback, for example: libxl = "" 1 = "" dm-version = "qemu_xen" usbback = "" 3-11 = "" 3-11@1_0 = "" driver_path = "/sys/bus/usb/drivers/btusb" In this example, USB device (busid is 3-11, /sys/bus/usb/devices/3-11). It has interface 3-11:1.0, whose original dirver is btusb. Since xenstore doesn't allow ':' and '.' in a key, so we encode the interface by changing ':' to '@' and changing '.' to '_'. When detaching the USB device from guest, we can rebind 3-11:1.0 to btusb driver. Chunyan Liu (7): libxl: export some functions for pvusb use libxl_utils: add internal function to read sysfs file contents libxl: add pvusb API libxl: add libxl_device_usb_assignable_list API xl: add pvusb commands xl: add usb-assignable-list command domcreate: support pvusb in configuration file docs/man/xl.cfg.pod.5| 84 ++ docs/man/xl.pod.1| 41 + tools/libxl/Makefile
[Xen-devel] [RESEND][PATCH V9 3/7] libxl: add pvusb API
Add pvusb APIs, including: - attach/detach (create/destroy) virtual usb controller. - attach/detach usb device - list usb controller and usb devices - some other helper functions Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> --- changes: - update naming, all places indicating usb controller named as usbctrl, all places indicating usb device named as usbdev - update DEFINE_DEVICE_REMOVE instead of creating a new DEFINE_DEVICE_REMOVE_EXT - use libxl__xs_read_checked instead of libxl__xs_read - update local READ_SUBPATH(_INT) macros to include more common codes - save drvpath before unbind - get_assigned_devices: call libxl__device_usbdev_list_for_ctrl instead of doing all things from scratch - usb_interface_xenstore_encode: use special char to avoid confusion - usb readdir_r instead of readdir - check syscall errno - remove usbinfo definition - address other comments except: libxl__device_usbdev_add/remove and do_usbdev_add/remove, in previous discussion, we'd like to get usbctrlinfo once and pass usbctrlinfo to do_usbdev_add/remove. However, during update, adding usbdev process still needs to try twice to get usbctrlinfo. (Before set_default, if usbctrl doesn't exist it doesn't doing getting usbctrlinfo actually; after set_default, needs to get usbctrlinfo then). So, finally, just change codes to make adding/removing process symmetrical. tools/libxl/Makefile |2 +- tools/libxl/libxl.c | 50 +- tools/libxl/libxl.h | 77 ++ tools/libxl/libxl_device.c |5 +- tools/libxl/libxl_internal.h | 18 + tools/libxl/libxl_osdeps.h | 13 + tools/libxl/libxl_pvusb.c| 1534 ++ tools/libxl/libxl_types.idl | 46 + tools/libxl/libxl_types_internal.idl |1 + tools/libxl/libxl_utils.c| 18 + tools/libxl/libxl_utils.h|5 + 11 files changed, 1766 insertions(+), 3 deletions(-) create mode 100644 tools/libxl/libxl_pvusb.c diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile index 6ff5bee..a36145a 100644 --- a/tools/libxl/Makefile +++ b/tools/libxl/Makefile @@ -103,7 +103,7 @@ LIBXL_OBJS = flexarray.o libxl.o libxl_create.o libxl_dm.o libxl_pci.o \ libxl_stream_read.o libxl_stream_write.o \ libxl_save_callout.o _libxl_save_msgs_callout.o \ libxl_qmp.o libxl_event.o libxl_fork.o \ - libxl_dom_suspend.o $(LIBXL_OBJS-y) + libxl_dom_suspend.o libxl_pvusb.o $(LIBXL_OBJS-y) LIBXL_OBJS += libxl_genid.o LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index eaa7d75..a479465 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -4144,6 +4144,36 @@ out: return rc; } +static void libxl__initiate_device_disk_remove(libxl__egc *egc, + libxl__ao_device *aodev) +{ +return libxl__initiate_device_remove(egc, aodev); +} + +static void libxl__initiate_device_nic_remove(libxl__egc *egc, + libxl__ao_device *aodev) +{ +return libxl__initiate_device_remove(egc, aodev); +} + +static void libxl__initiate_device_vtpm_remove(libxl__egc *egc, + libxl__ao_device *aodev) +{ +return libxl__initiate_device_remove(egc, aodev); +} + +static void libxl__initiate_device_vkb_remove(libxl__egc *egc, + libxl__ao_device *aodev) +{ +return libxl__initiate_device_remove(egc, aodev); +} + +static void libxl__initiate_device_vfb_remove(libxl__egc *egc, + libxl__ao_device *aodev) +{ +return libxl__initiate_device_remove(egc, aodev); +} + /**/ /* Macro for defining device remove/destroy functions in a compact way */ @@ -4158,6 +4188,8 @@ out: * libxl_device_vkb_destroy * libxl_device_vfb_remove * libxl_device_vfb_destroy + * libxl_device_usbctrl_remove + * libxl_device_usbctrl_destroy */ #define DEFINE_DEVICE_REMOVE(type, removedestroy, f)\ int libxl_device_##type##_##removedestroy(libxl_ctx *ctx, \ @@ -4179,7 +4211,7 @@ out: aodev->dev = device;\ aodev->callback = device_addrm_aocomplete; \ aodev->force = f; \ -libxl__initiate_device_remove(egc, aodev); \ +libxl__initiate_device_##type##_remove(egc, aodev); \
[Xen-devel] [RESEND][PATCH V9 4/7] libxl: add libxl_device_usbdev_assignable_list API
Add API for listing assignable USB devices info. Assignable USB device means the USB device type is assignable and it's not assigned to any guest yet. Signed-off-by: Chunyan Liu <cy...@suse.com> --- This could be squashed with previous patch. Split because there is some dispute on this. If this is acceptable, could be squashed, otherwise could be removed. Changes: - update usb device naming tools/libxl/libxl.h | 2 ++ tools/libxl/libxl_pvusb.c | 62 +++ 2 files changed, 64 insertions(+) diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 609d068..d659ec3 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -1479,6 +1479,8 @@ int libxl_device_usbctrl_getinfo(libxl_ctx *ctx, uint32_t domid, libxl_usbctrlinfo *usbctrlinfo); /* USB Devices */ +libxl_device_usbdev * +libxl_device_usbdev_assignable_list(libxl_ctx *ctx, int *num); int libxl_device_usbdev_add(libxl_ctx *ctx, uint32_t domid, libxl_device_usbdev *usbdev, diff --git a/tools/libxl/libxl_pvusb.c b/tools/libxl/libxl_pvusb.c index e35c6b5..b0f0808 100644 --- a/tools/libxl/libxl_pvusb.c +++ b/tools/libxl/libxl_pvusb.c @@ -592,6 +592,68 @@ static bool is_usbdev_assignable(libxl__gc *gc, libxl_device_usbdev *usbdev) return classcode != USBHUB_CLASS_CODE; } +libxl_device_usbdev * +libxl_device_usbdev_assignable_list(libxl_ctx *ctx, int *num) +{ +GC_INIT(ctx); +libxl_device_usbdev *usbdevs = NULL; +libxl_device_usbdev *assigned; +int num_assigned; +DIR *dir; +int r; + +*num = 0; + +r = get_assigned_devices(gc, , _assigned); +if (r) { +LOG(ERROR, "cannot determine if device is assigned"); +goto out; +} + +dir = opendir(SYSFS_USB_DEV); +if (!dir) goto out; + +size_t need = offsetof(struct dirent, d_name) + +pathconf(SYSFS_USB_DEV, _PC_NAME_MAX) + 1; +struct dirent *de_buf = libxl__zalloc(gc, need); +struct dirent *de; + +while (readdir_r(dir, de_buf, ) == 0 && de != NULL) { +libxl_device_usbdev *usbdev; +uint8_t bus, addr; + +if (!strcmp(de->d_name, ".") || +!strcmp(de->d_name, "..")) +continue; + +if (usbdev_busaddr_from_busid(gc, de->d_name, , )) +continue; + +GCNEW(usbdev); +usbdev->u.hostdev.hostbus = bus; +usbdev->u.hostdev.hostaddr = addr; + +if (!is_usbdev_assignable(gc, usbdev)) +continue; + +if (is_usbdev_in_array(assigned, num_assigned, usbdev)) +continue; + +usbdevs = libxl__realloc(NOGC, usbdevs, + sizeof(*usbdevs) * (*num + 1)); +libxl_device_usbdev_init(usbdevs + *num); +usbdevs[*num].u.hostdev.hostbus = bus; +usbdevs[*num].u.hostdev.hostaddr = addr; +(*num)++; +} + +closedir(dir); + +out: +GC_FREE; +return usbdevs; +} + /* get usb devices under certain usb controller */ static int libxl__device_usbdev_list_for_usbctrl(libxl__gc *gc, -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [RESEND][PATCH V9 5/7] xl: add pvusb commands
Add pvusb commands: usbctrl-attach, usbctrl-detach, usb-list, usbdev-attach and usbdev-detach. To attach a usb device to guest through pvusb, one could follow following example: #xl usbctrl-attach test_vm version=1 ports=8 #xl usb-list test_vm will show the usb controllers and port usage under the domain. #xl usbdev-attach test_vm hostbus=1 hostaddr=2 will find the first usable controller:port, and attach usb device whose busnum is 1 and devnum is 6. One could also specify which and which . #xl usbdev-detach test_vm 0 1 will detach USB device under controller 0 port 1. #xl usbctrl-detach test_vm dev_id will destroy the controller with specified dev_id. Dev_id can be traced in usb-list info. Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> --- Changes: - use libxl_usbdev/usbctrl_type_from_string instead of comparing oparg string mannually. - update docs as George suggested docs/man/xl.pod.1 | 41 tools/libxl/xl.h | 5 + tools/libxl/xl_cmdimpl.c | 243 ++ tools/libxl/xl_cmdtable.c | 25 + 4 files changed, 314 insertions(+) diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1 index 4279c7c..746f49f 100644 --- a/docs/man/xl.pod.1 +++ b/docs/man/xl.pod.1 @@ -1345,6 +1345,47 @@ List pass-through pci devices for a domain. =back +=head1 USB PASS-THROUGH + +=over 4 + +=item B I I[
[Xen-devel] [RESEND][PATCH V9 6/7] xl: add usbdev-assignable-list command
Add xl usbdev-assignable-list command to list assignable USB devices. Assignable USB device means the USB device type is assignable and it's not assigned to any guest yet. Signed-off-by: Chunyan Liu <cy...@suse.com> --- Same as "libxl: add libxl_device_usbdev_assignable_list API" patch, this patch could be sqaushed to previous one. Split because of some dispute. Could be squashed if acceptable, otherwise could be removed. tools/libxl/xl.h | 1 + tools/libxl/xl_cmdimpl.c | 28 tools/libxl/xl_cmdtable.c | 4 3 files changed, 33 insertions(+) diff --git a/tools/libxl/xl.h b/tools/libxl/xl.h index 309627a..8418fff 100644 --- a/tools/libxl/xl.h +++ b/tools/libxl/xl.h @@ -92,6 +92,7 @@ int main_blockdetach(int argc, char **argv); int main_vtpmattach(int argc, char **argv); int main_vtpmlist(int argc, char **argv); int main_vtpmdetach(int argc, char **argv); +int main_usbdev_assignable_list(int argc, char **argv); int main_usbctrl_attach(int argc, char **argv); int main_usbctrl_detach(int argc, char **argv); int main_usbdev_attach(int argc, char **argv); diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index f98e367..dfc3ad5 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -3449,6 +3449,34 @@ int main_cd_insert(int argc, char **argv) return 0; } +static void usbdev_assignable_list(void) +{ +libxl_device_usbdev *usbdevs; +int num, i; + +usbdevs = libxl_device_usbdev_assignable_list(ctx, ); + +for (i = 0; i < num; i++) { +printf("%d.%d\n", + usbdevs[i].u.hostdev.hostbus, + usbdevs[i].u.hostdev.hostaddr); +} + +libxl_device_usbdev_list_free(usbdevs, num); +} + +int main_usbdev_assignable_list(int argc, char **argv) +{ +int opt; + +SWITCH_FOREACH_OPT(opt, "", NULL, "usbdev-assignable-list", 0) { +/* No options */ +} + +usbdev_assignable_list(); +return 0; +} + int main_usbctrl_attach(int argc, char **argv) { uint32_t domid; diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c index b14b881..df4f6d9 100644 --- a/tools/libxl/xl_cmdtable.c +++ b/tools/libxl/xl_cmdtable.c @@ -578,6 +578,10 @@ struct cmd_spec cmd_table[] = { "List information about all USB controllers and devices for a domain", "", }, +{ "usbdev-assignable-list", + _usbdev_assignable_list, 0, 0, + "List all assignable USB devices", +}, }; int cmdtable_len = sizeof(cmd_table)/sizeof(struct cmd_spec); -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [RESEND][PATCH V9 2/7] libxl_utils: add internal function to read sysfs file contents
Add a new function libxl_read_sysfs_file_contents to handle sysfs file specially. It would be used in later pvusb work. Signed-off-by: Chunyan Liu <cy...@suse.com> --- Changes: - write a separate function libxl__read_sysfs_file_contents, no longer mix with libxl_read_file_contents tools/libxl/libxl_internal.h | 5 +++ tools/libxl/libxl_utils.c| 77 2 files changed, 82 insertions(+) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index ab981d2..7aff237 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -4021,6 +4021,11 @@ void libxl__bitmap_copy_best_effort(libxl__gc *gc, libxl_bitmap *dptr, const libxl_bitmap *sptr); int libxl__count_physical_sockets(libxl__gc *gc, int *sockets); + +_hidden int libxl__read_sysfs_file_contents(libxl__gc *gc, +const char *filename, +void **data_r, +int *datalen_r); #endif /* diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index e42422a..7f612a6 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -396,6 +396,83 @@ int libxl_read_file_contents(libxl_ctx *ctx, const char *filename, return e; } +int libxl__read_sysfs_file_contents(libxl__gc *gc, const char *filename, +void **data_r, int *datalen_r) +{ +FILE *f = 0; +uint8_t *data = 0; +int datalen = 0; +int e; +struct stat stab; +ssize_t rs; + +f = fopen(filename, "r"); +if (!f) { +if (errno == ENOENT) return ENOENT; +LOGE(ERROR, "failed to open %s", filename); +goto xe; +} + +if (fstat(fileno(f), )) { +LOGE(ERROR, "failed to fstat %s", filename); +goto xe; +} + +if (!S_ISREG(stab.st_mode)) { +LOGE(ERROR, "%s is not a plain file", filename); +errno = ENOTTY; +goto xe; +} + +if (stab.st_size > INT_MAX) { +LOG(ERROR, "file %s is far too large", filename); +errno = EFBIG; +goto xe; +} + +datalen = stab.st_size; + +if (stab.st_size && data_r) { +data = libxl__malloc(gc, datalen); +if (!data) goto xe; + +/* For sysfs file, datalen is always PAGE_SIZE. 'read' + * will return the number of bytes of the actual content, + * rs <= datalen is expected. + */ +rs = fread(data, 1, datalen, f); +if (rs < datalen) { +if (ferror(f)) { +LOGE(ERROR, "failed to read %s", filename); +goto xe; +} + +datalen = rs; +data = libxl__realloc(gc, data, datalen); +if (!data) +goto xe; +} +} + +if (fclose(f)) { +f = 0; +LOGE(ERROR, "failed to close %s", filename); +goto xe; +} + +if (data_r) *data_r = data; +if (datalen_r) *datalen_r = datalen; + +return 0; + + xe: +e = errno; +assert(e != ENOENT); +if (f) fclose(f); +return e; +} + + #define READ_WRITE_EXACTLY(rw, zero_is_eof, constdata)\ \ int libxl_##rw##_exactly(libxl_ctx *ctx, int fd, \ -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [RESEND][PATCH V9 7/7] domcreate: support pvusb in configuration file
Add code to support pvusb in domain config file. One could specify usbctrl and usb in domain's configuration file and create domain, then usb controllers will be created and usb device would be attached to guest automatically. One could specify usb controllers and usb devices in config file like this: usbctrl=['version=2,ports=4', 'version=1, ports=4', ] usbdev=['hostbus=2, hostaddr=1, controller=0,port=1', ] Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> --- changes: - update docs - update usb device naming docs/man/xl.cfg.pod.5| 84 tools/libxl/libxl_create.c | 73 -- tools/libxl/libxl_device.c | 4 +++ tools/libxl/libxl_internal.h | 8 + tools/libxl/xl_cmdimpl.c | 55 - 5 files changed, 220 insertions(+), 4 deletions(-) diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 index b63846a..db00371 100644 --- a/docs/man/xl.cfg.pod.5 +++ b/docs/man/xl.cfg.pod.5 @@ -722,6 +722,90 @@ Note this may be overridden by rdm_policy option in PCI device configuration. =back +=item B
[Xen-devel] [RESEND][PATCH V9 1/7] libxl: export some functions for pvusb use
Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: Wei Liu <wei.l...@citrix.com> --- Changes: - fix indentation tools/libxl/libxl.c | 5 ++--- tools/libxl/libxl_internal.h | 3 +++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 854e957..eaa7d75 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -2035,7 +2035,7 @@ out: } /* common function to get next device id */ -static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) +int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) { char *dompath, **l; unsigned int nb; @@ -2054,8 +2054,7 @@ static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) return nextid; } -static int libxl__resolve_domid(libxl__gc *gc, const char *name, -uint32_t *domid) +int libxl__resolve_domid(libxl__gc *gc, const char *name, uint32_t *domid) { if (!name) return 0; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index b00add0..ab981d2 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1165,6 +1165,9 @@ _hidden int libxl__init_console_from_channel(libxl__gc *gc, libxl__device_console *console, int dev_num, libxl_device_channel *channel); +_hidden int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device); +_hidden int libxl__resolve_domid(libxl__gc *gc, const char *name, + uint32_t *domid); /* * For each aggregate type which can be used as an input we provide: -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V9 6/7] xl: add usb-assignable-list command
Add xl usb-assignable-list command to list assignable USB devices. Assignable USB device means the USB device type is assignable and it's not assigned to any guest yet. Signed-off-by: Chunyan Liu <cy...@suse.com> --- Same as "libxl: add libxl_device_usb_assignable_list API" patch, this patch could be sqaushed to previous one. Split because of some dispute. Could be squashed if acceptable, otherwise could be removed. tools/libxl/xl.h | 1 + tools/libxl/xl_cmdimpl.c | 27 +++ tools/libxl/xl_cmdtable.c | 4 3 files changed, 32 insertions(+) diff --git a/tools/libxl/xl.h b/tools/libxl/xl.h index ddd9690..2c6f370 100644 --- a/tools/libxl/xl.h +++ b/tools/libxl/xl.h @@ -85,6 +85,7 @@ int main_blockdetach(int argc, char **argv); int main_vtpmattach(int argc, char **argv); int main_vtpmlist(int argc, char **argv); int main_vtpmdetach(int argc, char **argv); +int main_usbassignable_list(int argc, char **argv); int main_usbctrl_attach(int argc, char **argv); int main_usbctrl_detach(int argc, char **argv); int main_usbattach(int argc, char **argv); diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 25b472c..5043f25 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -3448,6 +3448,33 @@ int main_cd_insert(int argc, char **argv) return 0; } +static void usb_assignable_list(void) +{ +libxl_device_usb *usbs; +int num, i; + +usbs = libxl_device_usb_assignable_list(ctx, ); + +for (i = 0; i < num; i++) { +printf("%d.%d\n", usbs[i].u.hostdev.hostbus, + usbs[i].u.hostdev.hostaddr); +} + +libxl_device_usb_list_free(usbs, num); +} + +int main_usbassignable_list(int argc, char **argv) +{ +int opt; + +SWITCH_FOREACH_OPT(opt, "", NULL, "usb-assignable-list", 0) { +/* No options */ +} + +usb_assignable_list(); +return 0; +} + int main_usbctrl_attach(int argc, char **argv) { uint32_t domid; diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c index c7231ae..4e9c0c8 100644 --- a/tools/libxl/xl_cmdtable.c +++ b/tools/libxl/xl_cmdtable.c @@ -576,6 +576,10 @@ struct cmd_spec cmd_table[] = { "List information about USB devices for a domain", "", }, +{ "usb-assignable-list", + _usbassignable_list, 0, 0, + "List all assignable USB devices", +}, }; int cmdtable_len = sizeof(cmd_table)/sizeof(struct cmd_spec); -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V9 1/7] libxl: export some functions for pvusb use
Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: Wei Liu <wei.l...@citrix.com> --- Changes: * fix indentation tools/libxl/libxl.c | 5 ++--- tools/libxl/libxl_internal.h | 3 +++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 22bbc29..afbff66 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -2035,7 +2035,7 @@ out: } /* common function to get next device id */ -static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) +int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) { char *dompath, **l; unsigned int nb; @@ -2054,8 +2054,7 @@ static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) return nextid; } -static int libxl__resolve_domid(libxl__gc *gc, const char *name, -uint32_t *domid) +int libxl__resolve_domid(libxl__gc *gc, const char *name, uint32_t *domid) { if (!name) return 0; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index b00add0..ab981d2 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1165,6 +1165,9 @@ _hidden int libxl__init_console_from_channel(libxl__gc *gc, libxl__device_console *console, int dev_num, libxl_device_channel *channel); +_hidden int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device); +_hidden int libxl__resolve_domid(libxl__gc *gc, const char *name, + uint32_t *domid); /* * For each aggregate type which can be used as an input we provide: -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V9 5/7] xl: add pvusb commands
Add pvusb commands: usb-ctrl-attach, usb-ctrl-detach, usb-list, usb-attach and usb-detach. To attach a usb device to guest through pvusb, one could follow following example: #xl usbctrl-attach test_vm version=1 ports=8 #xl usb-list test_vm will show the usb controllers and port usage under the domain. #xl usb-attach test_vm hostbus=1 hostaddr=2 will find the first usable controller:port, and attach usb device whose busnum is 1 and devnum is 6. One could also specify which and which . #xl usb-detach test_vm 0 1 will detach USB device under controller 0 port 1. #xl usbctrl-detach test_vm dev_id will destroy the controller with specified dev_id. Dev_id can be traced in usb-list info. Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> --- Changes: - use libxl_usbdev/usbctrl_type_from_string instead of comparing oparg string mannually. - update docs as George suggested docs/man/xl.pod.1 | 41 tools/libxl/xl.h | 5 + tools/libxl/xl_cmdimpl.c | 241 ++ tools/libxl/xl_cmdtable.c | 25 + 4 files changed, 312 insertions(+) diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1 index d0cd612..eb02238 100644 --- a/docs/man/xl.pod.1 +++ b/docs/man/xl.pod.1 @@ -1345,6 +1345,47 @@ List pass-through pci devices for a domain. =back +=head1 USB PASS-THROUGH + +=over 4 + +=item B I I[
[Xen-devel] [PATCH V9 7/7] domcreate: support pvusb in configuration file
Add code to support pvusb in domain config file. One could specify usbctrl and usb in domain's configuration file and create domain, then usb controllers will be created and usb device would be attached to guest automatically. One could specify usb controllers and usb devices in config file like this: usbctrl=['version=2,ports=4', 'version=1, ports=4', ] usbdev=['hostbus=2, hostaddr=1, controller=0,port=1', ] Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> --- changes: - doc update Not changed in this version: - naming 'usbdev' or 'usb' for usb device. If decided, all places including libxl API and all in this patch should be changed all together. See how we decide. docs/man/xl.cfg.pod.5| 84 tools/libxl/libxl_create.c | 73 -- tools/libxl/libxl_device.c | 4 +++ tools/libxl/libxl_internal.h | 8 + tools/libxl/xl_cmdimpl.c | 54 +++- 5 files changed, 219 insertions(+), 4 deletions(-) diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 index b63846a..db00371 100644 --- a/docs/man/xl.cfg.pod.5 +++ b/docs/man/xl.cfg.pod.5 @@ -722,6 +722,90 @@ Note this may be overridden by rdm_policy option in PCI device configuration. =back +=item B
[Xen-devel] [PATCH V9 4/7] libxl: add libxl_device_usb_assignable_list API
Add API for listing assignable USB devices info. Assignable USB device means the USB device type is assignable and it's not assigned to any guest yet. Signed-off-by: Chunyan Liu <cy...@suse.com> --- This could be squashed with previous patch. Split because there is some dispute on this. If this is acceptable, could be squashed, otherwise could be removed. tools/libxl/libxl.h | 3 +++ tools/libxl/libxl_pvusb.c | 61 +++ 2 files changed, 64 insertions(+) diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 594e23d..7548b6a 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -1472,6 +1472,9 @@ int libxl_device_usbctrl_getinfo(libxl_ctx *ctx, uint32_t domid, libxl_usbctrlinfo *usbctrlinfo); /* USB Devices */ +libxl_device_usb * +libxl_device_usb_assignable_list(libxl_ctx *ctx, int *num); + int libxl_device_usb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_usb *usb, const libxl_asyncop_how *ao_how) LIBXL_EXTERNAL_CALLERS_ONLY; diff --git a/tools/libxl/libxl_pvusb.c b/tools/libxl/libxl_pvusb.c index 96b41e6..5d6d348 100644 --- a/tools/libxl/libxl_pvusb.c +++ b/tools/libxl/libxl_pvusb.c @@ -591,6 +591,67 @@ static bool is_usb_assignable(libxl__gc *gc, libxl_device_usb *usb) return classcode != USBHUB_CLASS_CODE; } +libxl_device_usb * +libxl_device_usb_assignable_list(libxl_ctx *ctx, int *num) +{ +GC_INIT(ctx); +libxl_device_usb *usbs = NULL; +libxl_device_usb *assigned; +int num_assigned; +DIR *dir; +int r; + +*num = 0; + +r = get_assigned_devices(gc, , _assigned); +if (r) { +LOG(ERROR, "cannot determine if device is assigned"); +goto out; +} + +dir = opendir(SYSFS_USB_DEV); +if (!dir) goto out; + +size_t need = offsetof(struct dirent, d_name) + +pathconf(SYSFS_USB_DEV, _PC_NAME_MAX) + 1; +struct dirent *de_buf = libxl__zalloc(gc, need); +struct dirent *de; + +while (readdir_r(dir, de_buf, ) == 0 && de != NULL) { +libxl_device_usb *usb; +uint8_t bus, addr; + +if (!strcmp(de->d_name, ".") || +!strcmp(de->d_name, "..")) +continue; + +if (usb_busaddr_from_busid(gc, de->d_name, , )) +continue; + +GCNEW(usb); +usb->u.hostdev.hostbus = bus; +usb->u.hostdev.hostaddr = addr; + +if (!is_usb_assignable(gc, usb)) +continue; + +if (is_usbdev_in_array(assigned, num_assigned, usb)) +continue; + +usbs = libxl__realloc(NOGC, usbs, sizeof(*usbs) * (*num + 1)); +libxl_device_usb_init(usbs + *num); +usbs[*num].u.hostdev.hostbus = bus; +usbs[*num].u.hostdev.hostaddr = addr; +(*num)++; +} + +closedir(dir); + +out: +GC_FREE; +return usbs; +} + /* get usb devices under certain usb controller */ static int libxl__device_usb_list_for_usbctrl(libxl__gc *gc, uint32_t domid, -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V9 3/7] libxl: add pvusb API
Add pvusb APIs, including: - attach/detach (create/destroy) virtual usb controller. - attach/detach usb device - list usb controller and usb devices - some other helper functions Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> --- changes: - update DEFINE_DEVICE_REMOVE instead of creating a new DEFINE_DEVICE_REMOVE_EXT - use libxl__xs_read_checked instead of libxl__xs_read - update local READ_SUBPATH(_INT) macros to include more common codes - save drvpath before unbind - get_assigned_devices: call libxl__device_usb_list_for_ctrl instead of doing all things from scratch - usb_interface_xenstore_encode: use special char to avoid confusion - usb readdir_r instead of readdir - check syscall errno - remove usbinfo definition - address other comments except: libxl__device_usb_add/remove and do_usb_add/remove, in previous discussion, we'd like to get usbctrlinfo once and pass that as parameter to do_usb_add/remove. However, during update, found that in adding usb process, still need to try twice to get usbctrlinfo. (Before set_default, if usbctrl doesn't exist it doesn't doing getting usbctrlinfo actually; after set_default, needs to get usbctrlinfo then). So, finally, just change codes to make adding/removing process symmetrical by getting usbctrlinfo twice. tools/libxl/Makefile |2 +- tools/libxl/libxl.c | 50 +- tools/libxl/libxl.h | 74 ++ tools/libxl/libxl_device.c |5 +- tools/libxl/libxl_internal.h | 18 + tools/libxl/libxl_osdeps.h | 13 + tools/libxl/libxl_pvusb.c| 1523 ++ tools/libxl/libxl_types.idl | 46 + tools/libxl/libxl_types_internal.idl |1 + tools/libxl/libxl_utils.c| 18 + tools/libxl/libxl_utils.h|5 + 11 files changed, 1752 insertions(+), 3 deletions(-) create mode 100644 tools/libxl/libxl_pvusb.c diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile index c5ecec1..ef9ccd3 100644 --- a/tools/libxl/Makefile +++ b/tools/libxl/Makefile @@ -103,7 +103,7 @@ LIBXL_OBJS = flexarray.o libxl.o libxl_create.o libxl_dm.o libxl_pci.o \ libxl_stream_read.o libxl_stream_write.o \ libxl_save_callout.o _libxl_save_msgs_callout.o \ libxl_qmp.o libxl_event.o libxl_fork.o \ - libxl_dom_suspend.o $(LIBXL_OBJS-y) + libxl_dom_suspend.o libxl_pvusb.o $(LIBXL_OBJS-y) LIBXL_OBJS += libxl_genid.o LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index afbff66..99e446a 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -4144,6 +4144,36 @@ out: return rc; } +static void libxl__initiate_device_disk_remove(libxl__egc *egc, + libxl__ao_device *aodev) +{ +return libxl__initiate_device_remove(egc, aodev); +} + +static void libxl__initiate_device_nic_remove(libxl__egc *egc, + libxl__ao_device *aodev) +{ +return libxl__initiate_device_remove(egc, aodev); +} + +static void libxl__initiate_device_vtpm_remove(libxl__egc *egc, + libxl__ao_device *aodev) +{ +return libxl__initiate_device_remove(egc, aodev); +} + +static void libxl__initiate_device_vkb_remove(libxl__egc *egc, + libxl__ao_device *aodev) +{ +return libxl__initiate_device_remove(egc, aodev); +} + +static void libxl__initiate_device_vfb_remove(libxl__egc *egc, + libxl__ao_device *aodev) +{ +return libxl__initiate_device_remove(egc, aodev); +} + /**/ /* Macro for defining device remove/destroy functions in a compact way */ @@ -4158,6 +4188,8 @@ out: * libxl_device_vkb_destroy * libxl_device_vfb_remove * libxl_device_vfb_destroy + * libxl_device_usbctrl_remove + * libxl_device_usbctrl_destroy */ #define DEFINE_DEVICE_REMOVE(type, removedestroy, f)\ int libxl_device_##type##_##removedestroy(libxl_ctx *ctx, \ @@ -4179,7 +4211,7 @@ out: aodev->dev = device;\ aodev->callback = device_addrm_aocomplete; \ aodev->force = f; \ -libxl__initiate_device_remove(egc, aodev); \ +libxl__initiate_device_##type##_remove(egc, aodev); \ \ out:\ if (rc) ret
[Xen-devel] [PATCH V9 0/7] xen pvusb toolstack work
need: 1) generate usb controler related information 2) write usb controller frontend/backend info to xenstore PVUSB frontend and backend driver will probe xenstore paths and build connection between frontend and backend. * usb-ctrl-detach To remove a usb controller, we need: 1) check if the usb controller exists or not 2) remove all usb devices under controller 3) remove usb controller info from xenstore * usb-attach To attach a usb device, we need: 1) check if the usb device type is assignable 2) check if the usb device is already assigned to a domain 3) add 'busid' of the usb device to xenstore contoller/port/. PVUSB driver watches the xenstore changes and detects that, and needs to use 'busid' to do following work. 4) unbind usb device from original driver and bind to usbback. If usb device has many interfaces, then: - unbind each interface from its original driver and bind to usbback. - store the original driver to xenstore for later rebinding when detaching the device. * usb-detach To detach a usb device, we need: 1) check if the usb device is assigned to the domain 2) remove the usb device from xenstore controller/port. 3) unbind usb device from usbback and rebind to its original driver. If usb device has many interfaces, do it to each interface. * usb-list List all USB controllers and USB devices under each controller. 5. PVUSB xenstore information PVUSB xenstore information includes three parts: frontend, backend and /libxl part. A USB controller is corresponding to a "vusb" device in xenstore. Adding a USB controller will add a new "vusb" device, removing a USB controller will delete the related "vusb" device. Following is an example xenstore values of a USB controller. Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "" 2 = "" 3 = "" 4 = "" Frontend: device = "" vusb = "" 0 = "" backend = "/local/domain/0/backend/vusb/1/0" backend-id = "0" state = "4" urb-ring-ref = "348" conn-ring-ref = "346" event-channel = "20" Adding a USB device won't create a new "vusb" device, but only write the USB device busid to one port of USB controller. For example, attaching a USB device (busid is 2-1.6) to above USB controller port 1, it only need write 2-1.6 to port 1 of this USB controller: Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "2-1.6" 2 = "" 3 = "" 4 = "" Frontend doesn't change. Since assign a host USB device to guest, we'll unbind USB interfaces from their original drivers and bind them to usbback. After detaching this USB device from guest, one would hope the USB interfaces could be rebind to their original drivers, so there should some place to get the original driver info. To support that, when attaching a USB device to guest, we'll save the original driver info in xenstore too, the place is /libxl/usbback, for example: libxl = "" 1 = "" dm-version = "qemu_xen" usbback = "" 3-11 = "" 3-11@1_0 = "" driver_path = "/sys/bus/usb/drivers/btusb" In this example, USB device (busid is 3-11, /sys/bus/usb/devices/3-11). It has interface 3-11:1.0, whose original dirver is btusb. Since xenstore doesn't allow ':' and '.' in a key, so we encode the interface by changing ':' to '@' and changing '.' to '_'. When detaching the USB device from guest, we can rebind 3-11:1.0 to btusb driver. Chunyan Liu (7): libxl: export some functions for pvusb use libxl_utils: add internal function to read sysfs file contents libxl: add pvusb API libxl: add libxl_device_usb_assignable_list API xl: add pvusb commands xl: add usb-assignable-list command domcreate: support pvusb in configuration file docs/man/xl.cfg.pod.5| 84 ++ docs/man/xl.pod.1| 41 + tools/libxl/Makefile |2 +- tools/libxl/libxl.c | 55 +- tools/libxl/libxl.h | 77 ++ tools/libxl/libxl_create.c | 73 +- tools/libxl/libxl_device.c |
[Xen-devel] [PATCH V9 2/7] libxl_utils: add internal function to read sysfs file contents
Add a new function libxl_read_sysfs_file_contents to handle sysfs file specially. It would be used in later pvusb work. Signed-off-by: Chunyan Liu <cy...@suse.com> --- Changes: - write a separate function libxl__read_sysfs_file_contents, no longer mix with libxl_read_file_contents tools/libxl/libxl_internal.h | 5 +++ tools/libxl/libxl_utils.c| 77 2 files changed, 82 insertions(+) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index ab981d2..7aff237 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -4021,6 +4021,11 @@ void libxl__bitmap_copy_best_effort(libxl__gc *gc, libxl_bitmap *dptr, const libxl_bitmap *sptr); int libxl__count_physical_sockets(libxl__gc *gc, int *sockets); + +_hidden int libxl__read_sysfs_file_contents(libxl__gc *gc, +const char *filename, +void **data_r, +int *datalen_r); #endif /* diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index e42422a..7f612a6 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -396,6 +396,83 @@ int libxl_read_file_contents(libxl_ctx *ctx, const char *filename, return e; } +int libxl__read_sysfs_file_contents(libxl__gc *gc, const char *filename, +void **data_r, int *datalen_r) +{ +FILE *f = 0; +uint8_t *data = 0; +int datalen = 0; +int e; +struct stat stab; +ssize_t rs; + +f = fopen(filename, "r"); +if (!f) { +if (errno == ENOENT) return ENOENT; +LOGE(ERROR, "failed to open %s", filename); +goto xe; +} + +if (fstat(fileno(f), )) { +LOGE(ERROR, "failed to fstat %s", filename); +goto xe; +} + +if (!S_ISREG(stab.st_mode)) { +LOGE(ERROR, "%s is not a plain file", filename); +errno = ENOTTY; +goto xe; +} + +if (stab.st_size > INT_MAX) { +LOG(ERROR, "file %s is far too large", filename); +errno = EFBIG; +goto xe; +} + +datalen = stab.st_size; + +if (stab.st_size && data_r) { +data = libxl__malloc(gc, datalen); +if (!data) goto xe; + +/* For sysfs file, datalen is always PAGE_SIZE. 'read' + * will return the number of bytes of the actual content, + * rs <= datalen is expected. + */ +rs = fread(data, 1, datalen, f); +if (rs < datalen) { +if (ferror(f)) { +LOGE(ERROR, "failed to read %s", filename); +goto xe; +} + +datalen = rs; +data = libxl__realloc(gc, data, datalen); +if (!data) +goto xe; +} +} + +if (fclose(f)) { +f = 0; +LOGE(ERROR, "failed to close %s", filename); +goto xe; +} + +if (data_r) *data_r = data; +if (datalen_r) *datalen_r = datalen; + +return 0; + + xe: +e = errno; +assert(e != ENOENT); +if (f) fclose(f); +return e; +} + + #define READ_WRITE_EXACTLY(rw, zero_is_eof, constdata)\ \ int libxl_##rw##_exactly(libxl_ctx *ctx, int fd, \ -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V8 2/7] libxl_read_file_contents: add new entry to read sysfs file
Sysfs file has size=4096 but actual file content is less than that. Current libxl_read_file_contents will treat it as error when file size and actual file content differs, so reading sysfs file content with this function always fails. Add a new entry libxl_read_sysfs_file_contents to handle sysfs file specially. It would be used in later pvusb work. Signed-off-by: Chunyan Liu <cy...@suse.com> --- Changes: - Update libxl_read_sysfs_file_contents to follow internal function definition rules, and adjust related implementation. tools/libxl/libxl_internal.h | 4 +++ tools/libxl/libxl_utils.c| 61 ++-- 2 files changed, 51 insertions(+), 14 deletions(-) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index ab981d2..a3a5cc1 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -4022,6 +4022,10 @@ void libxl__bitmap_copy_best_effort(libxl__gc *gc, libxl_bitmap *dptr, int libxl__count_physical_sockets(libxl__gc *gc, int *sockets); #endif +_hidden int libxl__read_sysfs_file_contents(libxl__gc *gc, +const char *filename, +void **data_r, +int *datalen_r); /* * Local variables: diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index e42422a..9c5c4d0 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -322,9 +322,10 @@ out: return rc; } -int libxl_read_file_contents(libxl_ctx *ctx, const char *filename, - void **data_r, int *datalen_r) { -GC_INIT(ctx); +static int read_file_contents_core(libxl__gc *gc, const char *filename, + void **data_r, int *datalen_r, + bool tolerate_shrinking_file) +{ FILE *f = 0; uint8_t *data = 0; int datalen = 0; @@ -359,20 +360,35 @@ int libxl_read_file_contents(libxl_ctx *ctx, const char *filename, datalen = stab.st_size; if (stab.st_size && data_r) { -data = malloc(datalen); +data = malloc(datalen + 1); if (!data) goto xe; -rs = fread(data, 1, datalen, f); -if (rs != datalen) { -if (ferror(f)) +rs = fread(data, 1, datalen + 1, f); +if (rs > datalen) { +LOG(ERROR, "%s increased size while we were reading it", +filename); +goto xe; +} + +if (rs < datalen) { +if (ferror(f)) { LOGE(ERROR, "failed to read %s", filename); -else if (feof(f)) -LOG(ERROR, "%s changed size while we were reading it", - filename); -else +goto xe; +} else if (feof(f)) { +if (tolerate_shrinking_file) { +datalen = rs; +} else { +LOG(ERROR, "%s shrunk size while we were reading it", +filename); +goto xe; +} +} else { abort(); -goto xe; +} } + +data = realloc(data, datalen); +if (!data) goto xe; } if (fclose(f)) { @@ -384,11 +400,9 @@ int libxl_read_file_contents(libxl_ctx *ctx, const char *filename, if (data_r) *data_r = data; if (datalen_r) *datalen_r = datalen; -GC_FREE; return 0; xe: -GC_FREE; e = errno; assert(e != ENOENT); if (f) fclose(f); @@ -396,6 +410,25 @@ int libxl_read_file_contents(libxl_ctx *ctx, const char *filename, return e; } +int libxl_read_file_contents(libxl_ctx *ctx, const char *filename, + void **data_r, int *datalen_r) +{ +GC_INIT(ctx); +int rc; + +rc = read_file_contents_core(gc, filename, data_r, datalen_r, 0); + +GC_FREE; +return rc; +} + +int libxl__read_sysfs_file_contents(libxl__gc *gc, const char *filename, + void **data_r, int *datalen_r) +{ +return read_file_contents_core(gc, filename, data_r, datalen_r, 1); +} + + #define READ_WRITE_EXACTLY(rw, zero_is_eof, constdata)\ \ int libxl_##rw##_exactly(libxl_ctx *ctx, int fd, \ -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V8 3/7] libxl: add pvusb API
Add pvusb APIs, including: - attach/detach (create/destroy) virtual usb controller. - attach/detach usb device - list usb controller and usb devices - some other helper functions Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> --- changes: - update COMPARE_USB to compare ctrl and port - add check in usb_add/remove to disable non-Dom0 backend so that not worring about codes which are effective on Dom0 but not compatible on non-Dom0 backend. - define READ_SUBPATH macro within functions - do not initialize rc but give it value in each return case - libxl__strdup gc or NOGC update, internal function using gc, external using NOGC. - address other comments from George and Ian J. tools/libxl/Makefile |2 +- tools/libxl/libxl.c | 53 ++ tools/libxl/libxl.h | 74 ++ tools/libxl/libxl_device.c |5 +- tools/libxl/libxl_internal.h | 18 + tools/libxl/libxl_osdeps.h | 13 + tools/libxl/libxl_pvusb.c| 1451 ++ tools/libxl/libxl_types.idl | 57 ++ tools/libxl/libxl_types_internal.idl |1 + tools/libxl/libxl_utils.c| 16 + tools/libxl/libxl_utils.h|5 + 11 files changed, 1693 insertions(+), 2 deletions(-) create mode 100644 tools/libxl/libxl_pvusb.c diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile index c5ecec1..ef9ccd3 100644 --- a/tools/libxl/Makefile +++ b/tools/libxl/Makefile @@ -103,7 +103,7 @@ LIBXL_OBJS = flexarray.o libxl.o libxl_create.o libxl_dm.o libxl_pci.o \ libxl_stream_read.o libxl_stream_write.o \ libxl_save_callout.o _libxl_save_msgs_callout.o \ libxl_qmp.o libxl_event.o libxl_fork.o \ - libxl_dom_suspend.o $(LIBXL_OBJS-y) + libxl_dom_suspend.o libxl_pvusb.o $(LIBXL_OBJS-y) LIBXL_OBJS += libxl_genid.o LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index dacfaae..a050e8b 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -4218,11 +4218,54 @@ DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) /**/ +/* Macro for defining device remove/destroy functions for usbctrl */ +/* Following functions are defined: + * libxl_device_usbctrl_remove + * libxl_device_usbctrl_destroy + */ + +#define DEFINE_DEVICE_REMOVE_EXT(type, removedestroy, f)\ +int libxl_device_##type##_##removedestroy(libxl_ctx *ctx, \ +uint32_t domid, libxl_device_##type *type, \ +const libxl_asyncop_how *ao_how)\ +{ \ +AO_CREATE(ctx, domid, ao_how); \ +libxl__device *device; \ +libxl__ao_device *aodev;\ +int rc; \ +\ +GCNEW(device); \ +rc = libxl__device_from_##type(gc, domid, type, device);\ +if (rc != 0) goto out; \ +\ +GCNEW(aodev); \ +libxl__prepare_ao_device(ao, aodev);\ +aodev->action = LIBXL__DEVICE_ACTION_REMOVE;\ +aodev->dev = device;\ +aodev->callback = device_addrm_aocomplete; \ +aodev->force = f; \ +libxl__initiate_device_##type##_remove(egc, aodev); \ +\ +out:\ +if (rc) return AO_CREATE_FAIL(rc); \ +return AO_INPROGRESS; \ +} + + +DEFINE_DEVICE_REMOVE_EXT(usbctrl, remove, 0) +DEFINE_DEVICE_REMOVE_EXT(usbctrl, destroy, 1) + +#undef DEFINE_DEVICE_REMOVE_EXT + +/**/ + /* Macro for defining device addition functions in a compact way */ /* The following functions are defined: * libxl_device_disk_add * libxl_device_nic_add * libxl_device_vtpm_add + * libxl_device_usbctrl_add + * libxl_device_usb_add */ #define DEFINE_DEVICE_ADD(type)
[Xen-devel] [PATCH V8 5/7] xl: add pvusb commands
Add pvusb commands: usbctrl-attach, usbctrl-detach, usb-list, usb-attach and usb-detach. To attach a usb device to guest through pvusb, one could follow following example: #xl usbctrl-attach test_vm version=1 ports=8 #xl usb-list test_vm will show the usb controllers and port usage under the domain. #xl usbattach test_vm hostbus=1 hostaddr=2 will find the first usable controller:port, and attach usb device whose busnum is 1 and devnum is 6. One could also specify which and which . #xl usb-detach test_vm 0 1 will detach USB device under controller 0 port 1. #xl usbctrl-detach test_vm dev_id will destroy the controller with specified dev_id. Dev_id can be traced in usb-list info. Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> --- Changes: - change usb-attach parameter from hostbus.hostaddr to hostbus=xx hostaddr= - since we get rid of libxl_device_usb_getinfo, so adjust usb-list information a little bit. - parse_usb_config and parse_usbctrl_config following parse_nic_config way, put in this patch, and shared domcreate routine. docs/man/xl.pod.1 | 40 tools/libxl/xl.h | 5 + tools/libxl/xl_cmdimpl.c | 250 ++ tools/libxl/xl_cmdtable.c | 25 + 4 files changed, 320 insertions(+) diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1 index d0cd612..f09a872 100644 --- a/docs/man/xl.pod.1 +++ b/docs/man/xl.pod.1 @@ -1345,6 +1345,46 @@ List pass-through pci devices for a domain. =back +=head1 USB PASS-THROUGH + +=over 4 + +=item B I I[
[Xen-devel] [PATCH V8 7/7] domcreate: support pvusb in configuration file
Add code to support pvusb in domain config file. One could specify usbctrl and usb in domain's configuration file and create domain, then usb controllers will be created and usb device would be attached to guest automatically. One could specify usb controllers and usb devices in config file like this: usbctrl=['version=2,ports=4', 'version=1, ports=4', ] usbdev=['hostbus=2, hostaddr=1, controller=0,port=1', ] Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> --- changes: - change parse_usb_config and parse_usbctrl_config, following parse_nic_config way, and move to previous patch - update user interface to specify hostbus, hostaddr instead of hostbus.hostaddr for future extension docs/man/xl.cfg.pod.5| 81 tools/libxl/libxl_create.c | 73 +-- tools/libxl/libxl_device.c | 4 +++ tools/libxl/libxl_internal.h | 8 + tools/libxl/xl_cmdimpl.c | 54 - 5 files changed, 216 insertions(+), 4 deletions(-) diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 index b63846a..f24c008 100644 --- a/docs/man/xl.cfg.pod.5 +++ b/docs/man/xl.cfg.pod.5 @@ -722,6 +722,87 @@ Note this may be overridden by rdm_policy option in PCI device configuration. =back +=item B
[Xen-devel] [PATCH V8 6/7] xl: add usb-assignable-list command
Add xl usb-assignable-list command to list assignable USB devices. Assignable USB device means the USB device type is assignable and it's not assigned to any guest yet. Signed-off-by: Chunyan Liu <cy...@suse.com> --- Same as "libxl: add libxl_device_usb_assignable_list API" patch, this patch could be sqaushed to previous one. Split because of some dispute. Could be squashed if acceptable, otherwise could be removed. --- tools/libxl/xl.h | 1 + tools/libxl/xl_cmdimpl.c | 27 +++ tools/libxl/xl_cmdtable.c | 4 3 files changed, 32 insertions(+) diff --git a/tools/libxl/xl.h b/tools/libxl/xl.h index ddd9690..2c6f370 100644 --- a/tools/libxl/xl.h +++ b/tools/libxl/xl.h @@ -85,6 +85,7 @@ int main_blockdetach(int argc, char **argv); int main_vtpmattach(int argc, char **argv); int main_vtpmlist(int argc, char **argv); int main_vtpmdetach(int argc, char **argv); +int main_usbassignable_list(int argc, char **argv); int main_usbctrl_attach(int argc, char **argv); int main_usbctrl_detach(int argc, char **argv); int main_usbattach(int argc, char **argv); diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index e6ff6f4..33df66b 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -3454,6 +3454,33 @@ int main_cd_insert(int argc, char **argv) return 0; } +static void usb_assignable_list(void) +{ +libxl_device_usb *usbs; +int num, i; + +usbs = libxl_device_usb_assignable_list(ctx, ); + +for (i = 0; i < num; i++) { +printf("%d.%d\n", usbs[i].u.hostdev.hostbus, + usbs[i].u.hostdev.hostaddr); +} + +libxl_device_usb_list_free(usbs, num); +} + +int main_usbassignable_list(int argc, char **argv) +{ +int opt; + +SWITCH_FOREACH_OPT(opt, "", NULL, "usb-assignable-list", 0) { +/* No options */ +} + +usb_assignable_list(); +return 0; +} + int main_usbctrl_attach(int argc, char **argv) { uint32_t domid; diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c index c7231ae..4e9c0c8 100644 --- a/tools/libxl/xl_cmdtable.c +++ b/tools/libxl/xl_cmdtable.c @@ -576,6 +576,10 @@ struct cmd_spec cmd_table[] = { "List information about USB devices for a domain", "", }, +{ "usb-assignable-list", + _usbassignable_list, 0, 0, + "List all assignable USB devices", +}, }; int cmdtable_len = sizeof(cmd_table)/sizeof(struct cmd_spec); -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V8 4/7] libxl: add libxl_device_usb_assignable_list API
Add API for listing assignable USB devices info. Assignable USB device means the USB device type is assignable and it's not assigned to any guest yet. Signed-off-by: Chunyan Liu <cy...@suse.com> --- This could be squashed with previous patch. Split because there is some dispute on this. If this is acceptable, could be squashed, otherwise could be removed. tools/libxl/libxl.h | 3 +++ tools/libxl/libxl_pvusb.c | 54 +++ 2 files changed, 57 insertions(+) diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 594e23d..7548b6a 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -1472,6 +1472,9 @@ int libxl_device_usbctrl_getinfo(libxl_ctx *ctx, uint32_t domid, libxl_usbctrlinfo *usbctrlinfo); /* USB Devices */ +libxl_device_usb * +libxl_device_usb_assignable_list(libxl_ctx *ctx, int *num); + int libxl_device_usb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_usb *usb, const libxl_asyncop_how *ao_how) LIBXL_EXTERNAL_CALLERS_ONLY; diff --git a/tools/libxl/libxl_pvusb.c b/tools/libxl/libxl_pvusb.c index aa1a653..ab57371 100644 --- a/tools/libxl/libxl_pvusb.c +++ b/tools/libxl/libxl_pvusb.c @@ -585,6 +585,60 @@ static bool is_usb_assignable(libxl__gc *gc, libxl_device_usb *usb) return classcode != USBHUB_CLASS_CODE; } +libxl_device_usb * +libxl_device_usb_assignable_list(libxl_ctx *ctx, int *num) +{ +GC_INIT(ctx); +libxl_device_usb *usbs = NULL; +libxl_device_usb *assigned; +int num_assigned; +struct dirent *de; +DIR *dir; + +*num = 0; + +if (get_assigned_devices(gc, , _assigned) < 0) { +LOG(ERROR, "cannot determine if device is assigned"); +goto out; +} + +if (!(dir = opendir(SYSFS_USB_DEV))) +goto out; + +while ((de = readdir(dir))) { +libxl_device_usb *usb; +uint8_t bus, addr; + +if (!de->d_name) +continue; + +if (usb_busaddr_from_busid(gc, de->d_name, , )) +continue; + +GCNEW(usb); +usb->u.hostdev.hostbus = bus; +usb->u.hostdev.hostaddr = addr; + +if (!is_usb_assignable(gc, usb)) +continue; + +if (is_usbdev_in_array(assigned, num_assigned, usb)) +continue; + +usbs = libxl__realloc(NOGC, usbs, sizeof(*usbs) * (*num + 1)); +libxl_device_usb_init(usbs + *num); +usbs[*num].u.hostdev.hostbus = bus; +usbs[*num].u.hostdev.hostaddr = addr; +(*num)++; +} + +closedir(dir); + +out: +GC_FREE; +return usbs; +} + /* get usb devices under certain usb controller */ static int libxl__device_usb_list_for_usbctrl(libxl__gc *gc, uint32_t domid, -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V8 1/7] libxl: export some functions for pvusb use
Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> Reviewed-by: Wei Liu <wei.l...@citrix.com> --- tools/libxl/libxl.c | 4 ++-- tools/libxl/libxl_internal.h | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 22bbc29..dacfaae 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -2035,7 +2035,7 @@ out: } /* common function to get next device id */ -static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) +int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) { char *dompath, **l; unsigned int nb; @@ -2054,7 +2054,7 @@ static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) return nextid; } -static int libxl__resolve_domid(libxl__gc *gc, const char *name, +int libxl__resolve_domid(libxl__gc *gc, const char *name, uint32_t *domid) { if (!name) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index b00add0..ab981d2 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1165,6 +1165,9 @@ _hidden int libxl__init_console_from_channel(libxl__gc *gc, libxl__device_console *console, int dev_num, libxl_device_channel *channel); +_hidden int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device); +_hidden int libxl__resolve_domid(libxl__gc *gc, const char *name, + uint32_t *domid); /* * For each aggregate type which can be used as an input we provide: -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V8 0/7] xen pvusb toolstack work
t. 4. PVUSB Libxl implementation * usb-ctrl-attach To create a usb controller, we need: 1) generate usb controler related information 2) write usb controller frontend/backend info to xenstore PVUSB frontend and backend driver will probe xenstore paths and build connection between frontend and backend. * usb-ctrl-detach To remove a usb controller, we need: 1) check if the usb controller exists or not 2) remove all usb devices under controller 3) remove usb controller info from xenstore * usb-attach To attach a usb device, we need: 1) check if the usb device type is assignable 2) check if the usb device is already assigned to a domain 3) add 'busid' of the usb device to xenstore contoller/port/. PVUSB driver watches the xenstore changes and detects that, and needs to use 'busid' to do following work. 4) unbind usb device from original driver and bind to usbback. If usb device has many interfaces, then: - unbind each interface from its original driver and bind to usbback. - store the original driver to xenstore for later rebinding when detaching the device. * usb-detach To detach a usb device, we need: 1) check if the usb device is assigned to the domain 2) remove the usb device from xenstore controller/port. 3) unbind usb device from usbback and rebind to its original driver. If usb device has many interfaces, do it to each interface. * usb-list List all USB controllers and USB devices under each controller. 5. PVUSB xenstore information PVUSB xenstore information includes three parts: frontend, backend and /libxl part. A USB controller is corresponding to a "vusb" device in xenstore. Adding a USB controller will add a new "vusb" device, removing a USB controller will delete the related "vusb" device. Following is an example xenstore values of a USB controller. Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "" 2 = "" 3 = "" 4 = "" Frontend: device = "" vusb = "" 0 = "" backend = "/local/domain/0/backend/vusb/1/0" backend-id = "0" state = "4" urb-ring-ref = "348" conn-ring-ref = "346" event-channel = "20" Adding a USB device won't create a new "vusb" device, but only write the USB device busid to one port of USB controller. For example, attaching a USB device (busid is 2-1.6) to above USB controller port 1, it only need write 2-1.6 to port 1 of this USB controller: Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "2-1.6" 2 = "" 3 = "" 4 = "" Frontend doesn't change. Since assign a host USB device to guest, we'll unbind USB interfaces from their original drivers and bind them to usbback. After detaching this USB device from guest, one would hope the USB interfaces could be rebind to their original drivers, so there should some place to get the original driver info. To support that, when attaching a USB device to guest, we'll save the original driver info in xenstore too, the place is /libxl/usbback, for example: libxl = "" 1 = "" dm-version = "qemu_xen" usbback = "" 3-11 = "" 3-11-1_0 = "" driver_path = "/sys/bus/usb/drivers/btusb" In this example, USB device (busid is 3-11, /sys/bus/usb/devices/3-11). It has interface 3-11:1.0, whose original dirver is btusb. Since xenstore doesn't allow ':' and '.' in a key, so we encode the interface by changing ':' to '-' and changing '.' to '_'. When detaching the USB device from guest, we can rebind 3-11:1.0 to btusb driver. Chunyan Liu (7): libxl: export some functions for pvusb use libxl_read_file_contents: add new entry to read sysfs file libxl: add pvusb API libxl: add libxl_device_usb_assignable_list API xl: add pvusb commands xl: add usb-assignable-list command domcreate: support pvusb in configuration file docs/man/xl.cfg.pod.5| 81 ++ docs/man/xl.pod.1| 40 + tools/libxl/Makefile |2 +- tools/libxl/libxl.c | 57 +- tools/libxl/libxl.h | 77 ++ tools/libxl/
[Xen-devel] [PATCH V7 4/7] libxl: add libxl_device_usb_assignable_list API
Add API for listing assignable USB devices info. Assignable USB device means the USB device type is assignable and it's not assigned to any guest yet. Signed-off-by: Chunyan Liu <cy...@suse.com> --- This could be squashed with previous patch. Split because there is some dispute on this. If this is acceptable, could be squashed, otherwise could be removed. tools/libxl/libxl.h | 3 +++ tools/libxl/libxl_pvusb.c | 55 +++ 2 files changed, 58 insertions(+) diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 633bfc1..c41b9de 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -1450,6 +1450,9 @@ int libxl_device_usbctrl_getinfo(libxl_ctx *ctx, uint32_t domid, libxl_usbctrlinfo *usbctrlinfo); /* USB Devices */ +libxl_device_usb * +libxl_device_usb_assignable_list(libxl_ctx *ctx, int *num); + int libxl_device_usb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_usb *usb, const libxl_asyncop_how *ao_how) LIBXL_EXTERNAL_CALLERS_ONLY; diff --git a/tools/libxl/libxl_pvusb.c b/tools/libxl/libxl_pvusb.c index d4b997f..b683e60 100644 --- a/tools/libxl/libxl_pvusb.c +++ b/tools/libxl/libxl_pvusb.c @@ -573,6 +573,61 @@ static bool is_usb_assignable(libxl__gc *gc, libxl_device_usb *usb) return classcode != USBHUB_CLASS_CODE; } +libxl_device_usb * +libxl_device_usb_assignable_list(libxl_ctx *ctx, int *num) +{ +GC_INIT(ctx); +libxl_device_usb *usbs = NULL; +libxl_device_usb *assigned; +int num_assigned; +struct dirent *de; +DIR *dir; + +*num = 0; + +if (get_assigned_devices(gc, , _assigned) < 0) { +LOG(ERROR, "cannot determine if device is assigned"); +goto out; +} + +if (!(dir = opendir(SYSFS_USB_DEV))) +goto out; + +while ((de = readdir(dir))) { +libxl_device_usb *usb; +uint8_t bus = -1, addr = -1; + +if (!de->d_name) +continue; + +usb_busaddr_from_busid(gc, de->d_name, , ); +if (bus < 1 || addr < 1) +continue; + +GCNEW(usb); +usb->u.hostdev.hostbus = bus; +usb->u.hostdev.hostaddr = addr; + +if (!is_usb_assignable(gc, usb)) +continue; + +if (is_usbdev_in_array(assigned, num_assigned, usb)) +continue; + +usbs = libxl__realloc(NOGC, usbs, sizeof(*usbs) * (*num + 1)); +libxl_device_usb_init(usbs + *num); +usbs[*num].u.hostdev.hostbus = bus; +usbs[*num].u.hostdev.hostaddr = addr; +(*num)++; +} + +closedir(dir); + +out: +GC_FREE; +return usbs; +} + /* get usb devices under certain usb controller */ static int libxl__device_usb_list_for_usbctrl(libxl__gc *gc, uint32_t domid, -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
[Xen-devel] [PATCH V7 7/7] domcreate: support pvusb in configuration file
Add code to support pvusb in domain config file. One could specify usbctrl and usb in domain's configuration file and create domain, then usb controllers will be created and usb device would be attached to guest automatically. One could specify usb controllers and usb devices in config file like this: usbctrl=['version=2,ports=4', 'version=1, ports=4', ] usbdev=['2.1,controller=0,port=1', ] Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> --- docs/man/xl.cfg.pod.5| 75 +++ tools/libxl/libxl_create.c | 73 -- tools/libxl/libxl_device.c | 4 ++ tools/libxl/libxl_internal.h | 8 tools/libxl/xl_cmdimpl.c | 105 ++- 5 files changed, 261 insertions(+), 4 deletions(-) diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 index db4a163..355c9a9 100644 --- a/docs/man/xl.cfg.pod.5 +++ b/docs/man/xl.cfg.pod.5 @@ -716,6 +716,81 @@ Note this may be overridden by rdm_policy option in PCI device configuration. =back +=item B
[Xen-devel] [PATCH V7 3/7] libxl: add pvusb API
Add pvusb APIs, including: - attach/detach (create/destroy) virtual usb controller. - attach/detach usb device - list usb controllers and usb devices - get information of usb controller and usb device - some other helper functions Signed-off-by: Chunyan Liu <cy...@suse.com> Signed-off-by: Simon Cao <caobosi...@gmail.com> --- changes: - Update hostbus/hostaddr/idVendor/idProduct types in libxl_types.idl - Add PV/DEVICEMODEL check in libxl API, take George's HVM patch series for reference. tools/libxl/Makefile |2 +- tools/libxl/libxl.c | 53 ++ tools/libxl/libxl.h | 78 ++ tools/libxl/libxl_device.c |4 + tools/libxl/libxl_internal.h | 20 +- tools/libxl/libxl_osdeps.h | 13 + tools/libxl/libxl_pvusb.c| 1422 ++ tools/libxl/libxl_types.idl | 57 ++ tools/libxl/libxl_types_internal.idl |1 + tools/libxl/libxl_utils.c| 16 + tools/libxl/libxl_utils.h|5 + 11 files changed, 1669 insertions(+), 2 deletions(-) create mode 100644 tools/libxl/libxl_pvusb.c diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile index c5ecec1..ef9ccd3 100644 --- a/tools/libxl/Makefile +++ b/tools/libxl/Makefile @@ -103,7 +103,7 @@ LIBXL_OBJS = flexarray.o libxl.o libxl_create.o libxl_dm.o libxl_pci.o \ libxl_stream_read.o libxl_stream_write.o \ libxl_save_callout.o _libxl_save_msgs_callout.o \ libxl_qmp.o libxl_event.o libxl_fork.o \ - libxl_dom_suspend.o $(LIBXL_OBJS-y) + libxl_dom_suspend.o libxl_pvusb.o $(LIBXL_OBJS-y) LIBXL_OBJS += libxl_genid.o LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index aea4887..1e2c63e 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -4192,11 +4192,54 @@ DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) /**/ +/* Macro for defining device remove/destroy functions for usbctrl */ +/* Following functions are defined: + * libxl_device_usbctrl_remove + * libxl_device_usbctrl_destroy + */ + +#define DEFINE_DEVICE_REMOVE_EXT(type, removedestroy, f)\ +int libxl_device_##type##_##removedestroy(libxl_ctx *ctx, \ +uint32_t domid, libxl_device_##type *type, \ +const libxl_asyncop_how *ao_how)\ +{ \ +AO_CREATE(ctx, domid, ao_how); \ +libxl__device *device; \ +libxl__ao_device *aodev;\ +int rc; \ +\ +GCNEW(device); \ +rc = libxl__device_from_##type(gc, domid, type, device);\ +if (rc != 0) goto out; \ +\ +GCNEW(aodev); \ +libxl__prepare_ao_device(ao, aodev);\ +aodev->action = LIBXL__DEVICE_ACTION_REMOVE;\ +aodev->dev = device;\ +aodev->callback = device_addrm_aocomplete; \ +aodev->force = f; \ +libxl__initiate_device_##type##_remove(egc, aodev); \ +\ +out:\ +if (rc) return AO_CREATE_FAIL(rc); \ +return AO_INPROGRESS; \ +} + + +DEFINE_DEVICE_REMOVE_EXT(usbctrl, remove, 0) +DEFINE_DEVICE_REMOVE_EXT(usbctrl, destroy, 1) + +#undef DEFINE_DEVICE_REMOVE_EXT + +/**/ + /* Macro for defining device addition functions in a compact way */ /* The following functions are defined: * libxl_device_disk_add * libxl_device_nic_add * libxl_device_vtpm_add + * libxl_device_usbctrl_add + * libxl_device_usb_add */ #define DEFINE_DEVICE_ADD(type) \ @@ -4228,6 +4271,12 @@ DEFINE_DEVICE_ADD(nic) /* vtpm */ DEFINE_DEVICE_ADD(vtpm) +/* usbctrl */ +DEFINE_DEVICE_ADD(usbctrl) + +/* usb */ +DEFINE_DEVICE_ADD(usb) +
[Xen-devel] [PATCH V7 0/7] xen pvusb toolstack work
ill probe xenstore paths and build connection between frontend and backend. * usb-ctrl-detach To remove a usb controller, we need: 1) check if the usb controller exists or not 2) remove all usb devices under controller 3) remove usb controller info from xenstore * usb-attach To attach a usb device, we need: 1) check if the usb device type is assignable 2) check if the usb device is already assigned to a domain 3) add 'busid' of the usb device to xenstore contoller/port/. PVUSB driver watches the xenstore changes and detects that, and needs to use 'busid' to do following work. 4) unbind usb device from original driver and bind to usbback. If usb device has many interfaces, then: - unbind each interface from its original driver and bind to usbback. - store the original driver to xenstore for later rebinding when detaching the device. * usb-detach To detach a usb device, we need: 1) check if the usb device is assigned to the domain 2) remove the usb device from xenstore controller/port. 3) unbind usb device from usbback and rebind to its original driver. If usb device has many interfaces, do it to each interface. * usb-list List all USB controllers and USB devices under each controller. 5. PVUSB xenstore information PVUSB xenstore information includes three parts: frontend, backend and /libxl part. A USB controller is corresponding to a "vusb" device in xenstore. Adding a USB controller will add a new "vusb" device, removing a USB controller will delete the related "vusb" device. Following is an example xenstore values of a USB controller. Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "" 2 = "" 3 = "" 4 = "" Frontend: device = "" vusb = "" 0 = "" backend = "/local/domain/0/backend/vusb/1/0" backend-id = "0" state = "4" urb-ring-ref = "348" conn-ring-ref = "346" event-channel = "20" Adding a USB device won't create a new "vusb" device, but only write the USB device busid to one port of USB controller. For example, attaching a USB device (busid is 2-1.6) to above USB controller port 1, it only need write 2-1.6 to port 1 of this USB controller: Backend: backend = "" vusb = "" 1 = "" 0 = "" frontend = "/local/domain/1/device/vusb/0" frontend-id = "1" online = "1" state = "4" type = "pv" usb-ver = "1" num-ports = "4" port = "" 1 = "2-1.6" 2 = "" 3 = "" 4 = "" Frontend doesn't change. Since assign a host USB device to guest, we'll unbind USB interfaces from their original drivers and bind them to usbback. After detaching this USB device from guest, one would hope the USB interfaces could be rebind to their original drivers, so there should some place to get the original driver info. To support that, when attaching a USB device to guest, we'll save the original driver info in xenstore too, the place is /libxl/usbback, for example: libxl = "" 1 = "" dm-version = "qemu_xen" usbback = "" 3-11 = "" 3-11-1_0 = "" driver_path = "/sys/bus/usb/drivers/btusb" In this example, USB device (busid is 3-11, /sys/bus/usb/devices/3-11). It has interface 3-11:1.0, whose original dirver is btusb. Since xenstore doesn't allow ':' and '.' in a key, so we encode the interface by changing ':' to '-' and changing '.' to '_'. When detaching the USB device from guest, we can rebind 3-11:1.0 to btusb driver. Chunyan Liu (7): libxl: export some functions for pvusb use libxl_read_file_contents: add new entry to read sysfs file libxl: add pvusb API libxl: add libxl_device_usb_assignable_list API xl: add pvusb commands xl: add usb-assignable-list command domcreate: support pvusb in configuration file docs/man/xl.cfg.pod.5| 75 ++ docs/man/xl.pod.1| 40 + tools/libxl/Makefile |2 +- tools/libxl/libxl.c | 57 +- tools/libxl/libxl.h | 81 ++ tools/libxl/libxl_create.c | 73 +- tools/libxl/libxl_device.c |8 + tools/libxl/libxl_internal.h | 33 +- tools/libxl/libxl_osdeps.h | 13 + tools/libxl/libxl_pvusb.c| 1477 +++
[Xen-devel] [PATCH V7 6/7] xl: add usb-assignable-list command
Add xl usb-assignable-list command to list assignable USB devices. Assignable USB device means the USB device type is assignable and it's not assigned to any guest yet. Signed-off-by: Chunyan Liu <cy...@suse.com> --- Same as "libxl: add libxl_device_usb_assignable_list API" patch, this patch could be sqaushed to previous one. Split because of some dispute. Could be squashed if acceptable, otherwise could be removed. tools/libxl/xl.h | 1 + tools/libxl/xl_cmdimpl.c | 27 +++ tools/libxl/xl_cmdtable.c | 4 3 files changed, 32 insertions(+) diff --git a/tools/libxl/xl.h b/tools/libxl/xl.h index 26f6c1e..909d31f 100644 --- a/tools/libxl/xl.h +++ b/tools/libxl/xl.h @@ -85,6 +85,7 @@ int main_blockdetach(int argc, char **argv); int main_vtpmattach(int argc, char **argv); int main_vtpmlist(int argc, char **argv); int main_vtpmdetach(int argc, char **argv); +int main_usbassignable_list(int argc, char **argv); int main_usbctrl_attach(int argc, char **argv); int main_usbctrl_detach(int argc, char **argv); int main_usbattach(int argc, char **argv); diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 6ae9479..66d8f8c 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -3367,6 +3367,33 @@ int main_cd_insert(int argc, char **argv) return 0; } +static void usb_assignable_list(void) +{ +libxl_device_usb *usbs; +int num, i; + +usbs = libxl_device_usb_assignable_list(ctx, ); + +for (i = 0; i < num; i++) { +printf("%d.%d\n", usbs[i].u.hostdev.hostbus, + usbs[i].u.hostdev.hostaddr); +} + +libxl_device_usb_list_free(usbs, num); +} + +int main_usbassignable_list(int argc, char **argv) +{ +int opt; + +SWITCH_FOREACH_OPT(opt, "", NULL, "usb-assignable-list", 0) { +/* No options */ +} + +usb_assignable_list(); +return 0; +} + int main_usbctrl_attach(int argc, char **argv) { uint32_t domid; diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c index 46f276e..ba51331 100644 --- a/tools/libxl/xl_cmdtable.c +++ b/tools/libxl/xl_cmdtable.c @@ -576,6 +576,10 @@ struct cmd_spec cmd_table[] = { "List information about USB devices for a domain", "", }, +{ "usb-assignable-list", + _usbassignable_list, 0, 0, + "List all assignable USB devices", +}, }; int cmdtable_len = sizeof(cmd_table)/sizeof(struct cmd_spec); -- 2.1.4 ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel