[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V4 3/7] libxl: add pvusb API
>>> On 6/16/2015 at 01:47 AM, in message <557F0FA7.2060402@xxxxxxxxxxxxx>, >>> George Dunlap <george.dunlap@xxxxxxxxxxxxx> wrote: > On 06/10/2015 04:20 AM, Chunyan Liu wrote: > > 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 <cyliu@xxxxxxxx> > > Signed-off-by: Simon Cao <caobosimon@xxxxxxxxx> > > > > --- > > changes: > > - make libxl_device_usbctrl_add async, to be consistent with > > libxl_device_usbctrl_remove, using MACROs DEFINE_DEVICE_ADD > > and DEFINE_DEVICES_ADD, adjusting related codes. > > - correct update_json related processing. > > - use libxl__* helper functions instead of calloc, realloc > > and strdup, etc. whereever possible. > > - merge protocol definition pv|qemu in this patch > > - treat it as warning at rebind failure instead of error in usb_remove > > - add documentation docs/misc/pvusb.txt to describe pvusb > > details (toolstack design, libxl design, xenstore info, etc.) > > - other fixes addring Wei and George's comments > > > > docs/misc/pvusb.txt | 243 +++++++ > > tools/libxl/Makefile | 2 +- > > tools/libxl/libxl.c | 6 + > > tools/libxl/libxl.h | 65 ++ > > tools/libxl/libxl_internal.h | 16 +- > > tools/libxl/libxl_osdeps.h | 13 + > > tools/libxl/libxl_pvusb.c | 1249 > ++++++++++++++++++++++++++++++++++ > > tools/libxl/libxl_types.idl | 52 ++ > > tools/libxl/libxl_types_internal.idl | 1 + > > tools/libxl/libxl_utils.c | 16 + > > 10 files changed, 1661 insertions(+), 2 deletions(-) > > create mode 100644 docs/misc/pvusb.txt > > create mode 100644 tools/libxl/libxl_pvusb.c > > > > diff --git a/docs/misc/pvusb.txt b/docs/misc/pvusb.txt > > new file mode 100644 > > index 0000000..4cdf965 > > --- /dev/null > > +++ b/docs/misc/pvusb.txt > > @@ -0,0 +1,243 @@ > > +1. Overview > > + > > +There are two general methods for passing through individual host > > +devices to a guest. The first is via an emulated USB device > > +controller; the second is PVUSB. > > + > > +Additionally, there are two ways to add USB devices to a guest: via > > +the config file at domain creation time, and via hot-plug while the VM > > +is running. > > + > > +* Emulated USB > > + > > +In emulated USB, the device model (qemu) presents an emulated USB > > +controller to the guest. The device model process then grabs control > > +of the device from domain 0 and and passes the USB commands between > > +the guest OS and the host USB device. > > + > > +This method is only available to HVM domains, and is not available for > > +domains running with device model stubdomains. > > + > > +* PVUSB > > + > > +PVUSB uses a paravirtialized front-end/back-end interface, similar to > > +the traditional Xen PV network and disk protocols. In order to use > > +PVUSB, you need usbfront in your guest OS, and usbback in dom0 (or > > +your USB driver domain). > > + > > +Additionally, for easy use of PVUSB, you need support in the toolstack > > +to get the two sides to talk to each other. > > I think this paragraph is probably unnecessary. By the time this is > checked in, the toolstack will have the necessary support. > > > +2. Specifying a host USB device > > + > > +QEMU hmp commands allows USB devices to be specified either by their > > s/hmp/qmp/; ? > > > +bus address (in the form bus.device) or their device tag (in the form > > +vendorid:deviceid). > > + > > +Each way of specifying has its advantages: > > + > > + Specifying by device tag will always get the same device, > > +regardless of where the device ends up in the USB bus topology. > > +However, if there are two identical devices, it will not allow you to > > +specify which one. > > + > > + Specifying by bus address will always allow you to choose a > > +specific device, even if you have duplicates. However, the bus address > > +may change depending on which port you plugged the device into, and > > +possibly also after a reboot. > > + > > +To avoid duplication of vendorid:deviceid, we'll use bus address to > > +specify host USB device in xl toolstack. > > This paragraph comparing the different ways of specifying devices makes > sense to include in the 0/N series summary, but not so much in a file > we're checking in. > > > + > > +You can use lsusb to list the USB devices on the system: > > + > > +Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 > > +Hub > > +Bus 003 Device 002: ID f617:0905 > > +Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub > > +Bus 001 Device 004: ID 0424:2640 Standard Microsystems Corp. USB 2.0 > > +Hub > > +Bus 001 Device 005: ID 0424:4060 Standard Microsystems Corp. Ultra > > +Fast Media Reader > > +Bus 001 Device 006: ID 046d:c016 Logitech, Inc. Optical Wheel Mouse > > + > > +To pass through the Logitec mouse, for instance, you could specify > > +1.6 (remove leading zeroes). > > + > > +Note: USB Hub could not be assigned to guest. > > "USB hubs cannot be assigned to a guest." > > [snip] > > > +int libxl_device_usbctrl_getinfo(libxl_ctx *ctx, uint32_t domid, > > + libxl_device_usbctrl *usbctrl, > > + libxl_usbctrlinfo *usbctrlinfo) > > +{ > > + GC_INIT(ctx); > > + char *dompath, *usbctrlpath; > > + char *val; > > + int rc = 0; > > + > > + usbctrlinfo->devid = usbctrl->devid; > > + usbctrlinfo->ports = usbctrl->ports; > > + usbctrlinfo->version = usbctrl->version; > > + usbctrlinfo->protocol = usbctrl->protocol; > > You seem to have missed my message about this -- the only thing you are > allowed to read from usbctrl in this function is the devid. Everything > else you have to look up and give back to the user. That's the point of > the function -- the user has the devid and is asking *you* how many > ports there are, what usb version it is, &c. Agree. Will update. > > [snip] > > +/* get usb devices under certain usb controller */ > > +static int > > +libxl__device_usb_list_per_usbctrl(libxl__gc *gc, uint32_t domid, int > usbctrl, > > Should usbctrl be of type libxl_devid? To be strict, it should be libxl_devid. But libxl_devid is actually 'int'. I see most current APIs also uses 'int'. Like libxl_devid_to_device_vtpm API, devid also uses 'int'. Anyway, I can update :) > > > > +static int libxl__device_usb_setdefault(libxl__gc *gc, uint32_t domid, > > + libxl_device_usb *usb, > > + bool update_json) > > +{ > > + char *be_path, *tmp; > > + > > + if (usb->ctrl == -1) { > > + int ret = libxl__device_usb_set_default_usbctrl(gc, domid, usb); > > + /* If no existing ctrl to host this usb device, setup a new one */ > > + if (ret) { > > + libxl_device_usbctrl usbctrl; > > + libxl_device_usbctrl_init(&usbctrl); > > + if (libxl_device_usbctrl_add_common(CTX, domid, &usbctrl, > > + 0, update_json)) { > > + LOG(ERROR, "Failed to create usb controller"); > > + return ERROR_INVAL; > > + } > > + usb->ctrl = usbctrl.devid; > > + usb->port = 1; > > + libxl_device_usbctrl_dispose(&usbctrl); > > + } > > + } > > Sorry for not noticing this before -- it looks like if you set > usb->ctrl to -1, it will automatically choose both a controller and a > port number. But what if you want to specify that you want a particular > controller (for example, if you want to specify the PV controller rather > than the emulated one, or vice versa), but didn't want to have to > manually keep track of which ports were free? That is libxl__device_usb_set_default_usbctrl's work, it will try to find an available port for USB device. If there is no available port, then it will create a new USB controller and by default uses its first port. > > It seems like it would be better to have the code treat port 0 as > "automatically choose a port for me". Here we set port=1 because port number is starting from 1. Like, if there are 4 ports, port number will be 1, 2, 3, 4 (not 0,1 ,2, 3). Since xend, it behaves like this. I think that's what pvusb driver needs. Juergen, right? > > (If this were the only thing holding it up I would say this wouldn't be > a blocker to going in.) > > > +static int libxl__device_usb_remove(libxl__gc *gc, uint32_t domid, > > + libxl_device_usb *usb) > > +{ > > + libxl_device_usb *usbs = NULL; > > + libxl_device_usb *usb_find = NULL; > > + int i, num = 0, rc; > > + > > + assert(usb->busid || (usb->hostbus > 0 && usb->hostaddr > 0)); > > + > > + if (!usb->busid) { > > + usb->busid = usb_busaddr_to_busid(gc, usb->hostbus, > > usb->hostaddr); > > + if (!usb->busid) { > > + LOG(ERROR, "USB device doesn't exist in sysfs"); > > + return ERROR_INVAL; > > + } > > + } > > So here you're keying the removal on the *host* idea of what the device > is. But the standard would be to key this on the *guest* idea of what > the device is. When you're doing disk removal, you don't say > > "xl block-detach 1 /images/foo.img" > > that is, the path to the disk image; you say > > "xl block-detach 1 xvda" > > that is, the image as seen from the guest. > > Since there is no devid, you should make it possible to remove by > <ctrl,port>. Removing also by hostbus:hostaddr seems like useful > functionality, so it's probably not bad to keep it; but the <ctrl,port> > should be the main functionality. Do you think <ctrl,port> is better? That means in qemu emulated way, user also need to know the <ctrl, port> info of the USB device. In the past, for usb-add or usb-delete, <ctrl, port> info is hidden to user, it used bus.addr or verndorid.deviceid. > > > +int libxl_device_usb_getinfo(libxl_ctx *ctx, libxl_device_usb *usb, > > + libxl_usbinfo *usbinfo) > > +{ > > + GC_INIT(ctx); > > + char *filename; > > + void *buf = NULL; > > + > > + usbinfo->ctrl = usb->ctrl; > > + usbinfo->port = usb->port; > > + > > + if (usb->busid) > > + usbinfo->busid = libxl__strdup(NOGC, usb->busid); > > + else if (usb->hostbus > 0 && usb->hostaddr > 0) > > + usbinfo->busid = usb_busaddr_to_busid(gc, usb->hostbus, > > usb->hostaddr); > > Similar to my libxl_device_usbctrl_getinfo() comment -- the purpose of > this function is to specify a minimal amount of information, and have > the library return and look up everything else. Since libxl_device_usb > doesn't have a devid, the "key" for this should probably be <ctrl,port>. > Which means, you are only allowed to read usb->{ctrl,port}; everything > else you have to look up. Agree. Will update. Thanks, Chunyan > > -George > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxx > http://lists.xen.org/xen-devel > > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |