[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V8 3/7] libxl: add pvusb API
>>> On 11/13/2015 at 01:27 AM, in message <CAFLBxZawnBaQ791ebbv1bmw3DX2+cWfk8QD1JdAVopk0-Ma6Zw@xxxxxxxxxxxxxx>, George Dunlap <George.Dunlap@xxxxxxxxxxxxx> wrote: > On Wed, Oct 21, 2015 at 10:08 AM, Chunyan Liu <cyliu@xxxxxxxx> wrote: > > +static int > > +get_assigned_devices(libxl__gc *gc, > > + libxl_device_usb **list, int *num) > > +{ > > + char **domlist; > > + unsigned int nd = 0, i, j, k; > > + int rc; > > + > > + *list = NULL; > > + *num = 0; > > + > > + domlist = libxl__xs_directory(gc, XBT_NULL, "/local/domain", &nd); > > + for (i = 0; i < nd; i++) { > > + char *path, **ctrl_list; > > + unsigned int nc = 0; > > + > > + path = GCSPRINTF("/local/domain/%s/device/vusb", domlist[i]); > > + ctrl_list = libxl__xs_directory(gc, XBT_NULL, path, &nc); > > + > > + for (j = 0; j < nc; j++) { > > + const char *be_path, *num_ports; > > + int nport; > > + > > + rc = libxl__xs_read_checked(gc, XBT_NULL, > > + GCSPRINTF("%s/%s/backend", path, ctrl_list[j]), > > + &be_path); > > + if (rc) goto out; > > + > > + rc = libxl__xs_read_checked(gc, XBT_NULL, > > + GCSPRINTF("%s/num-ports", > > be_path), > > + &num_ports); > > + if (rc) goto out; > > + > > + nport = atoi(num_ports); > > + for (k = 0; k < nport; k++) { > > + libxl_device_usb *usb; > > + const char *portpath, *busid; > > + > > + portpath = GCSPRINTF("%s/port/%d", be_path, k + 1); > > + busid = libxl__xs_read(gc, XBT_NULL, portpath); > > + /* If there is USB device attached, add it to list */ > > + if (busid && strcmp(busid, "")) { > > + GCREALLOC_ARRAY(*list, *num + 1); > > + usb = *list + *num; > > + (*num)++; > > + libxl_device_usb_init(usb); > > + usb->ctrl = atoi(ctrl_list[j]); > > + usb->port = k + 1; > > + rc = usb_busaddr_from_busid(gc, busid, > > + &usb->u.hostdev.hostbus, > > + &usb->u.hostdev.hostaddr); > > You should probably set usb->devtype to HOSTDEV here, even though this > function is internal. > > > + if (rc) goto out; > > + } > > + } > > + } > > + } > > + > > + rc = 0; > > + > > +out: > > + if (rc) { > > + *list = NULL; > > + *num = 0; > > + } > > + return rc; > > +} > > + > > +static bool is_usbdev_in_array(libxl_device_usb *usbs, int num, > > + libxl_device_usb *usb) > > +{ > > + int i; > > + > > + for (i = 0; i < num; i++) { > > + if (usbs[i].u.hostdev.hostbus == usb->u.hostdev.hostbus && > > + usbs[i].u.hostdev.hostaddr == usb->u.hostdev.hostaddr) > > + return true; > > + } > > + > > + return false; > > +} > > + > > +/* check if USB device is already assigned to a domain */ > > +/* check if USB device type is assignable */ > > +static bool is_usb_assignable(libxl__gc *gc, libxl_device_usb *usb) > > +{ > > + int classcode; > > + char *filename; > > + void *buf = NULL; > > + char *busid = NULL; > > + > > + busid = usb_busaddr_to_busid(gc, usb->u.hostdev.hostbus, > > + usb->u.hostdev.hostaddr); > > + if (!busid) return false; > > + > > + filename = GCSPRINTF(SYSFS_USB_DEV"/%s/bDeviceClass", busid); > > + if (libxl__read_sysfs_file_contents(gc, filename, &buf, NULL)) > > + return false; > > + > > + classcode = atoi(buf); > > + return classcode != USBHUB_CLASS_CODE; > > +} > > + > > +/* get usb devices under certain usb controller */ > > +static int > > +libxl__device_usb_list_for_usbctrl(libxl__gc *gc, uint32_t domid, > > + libxl_devid usbctrl, > > + libxl_device_usb **usbs, int *num) > > +{ > > + const char *fe_path, *be_path, *num_devs; > > + int n, i, rc; > > + > > + *usbs = NULL; > > + *num = 0; > > + > > + fe_path = GCSPRINTF("%s/device/vusb/%d", > > + libxl__xs_get_dompath(gc, domid), usbctrl); > > + > > + rc = libxl__xs_read_checked(gc, XBT_NULL, > > + GCSPRINTF("%s/backend", fe_path), > > + &be_path); > > + if (rc) return rc; > > + > > + rc = libxl__xs_read_checked(gc, XBT_NULL, > > + GCSPRINTF("%s/num-ports", be_path), > > + &num_devs); > > + if (rc) return rc; > > + > > + n = atoi(num_devs); > > + > > + for (i = 0; i < n; i++) { > > + char *busid; > > + libxl_device_usb *usb; > > + > > + busid = libxl__xs_read(gc, XBT_NULL, > > + GCSPRINTF("%s/port/%d", be_path, i + 1)); > > + if (busid && strcmp(busid, "")) { > > + GCREALLOC_ARRAY(*usbs, *num + 1); > > + usb = *usbs + *num; > > + (*num)++; > > + libxl_device_usb_init(usb); > > + usb->ctrl = usbctrl; > > + usb->port = i + 1; > > + rc = usb_busaddr_from_busid(gc, busid, > > + &usb->u.hostdev.hostbus, > > + &usb->u.hostdev.hostaddr); > > Same thing re devtype. > > > +int libxl_ctrlport_to_device_usb(libxl_ctx *ctx, > > + uint32_t domid, > > + int ctrl, > > + int port, > > + libxl_device_usb *usb) > > +{ > > + GC_INIT(ctx); > > + const char *dompath, *be_path, *busid; > > + int rc; > > + > > + dompath = libxl__xs_get_dompath(gc, domid); > > + > > + rc = libxl__xs_read_checked(gc, XBT_NULL, > > + GCSPRINTF("%s/device/vusb/%d/backend", dompath, ctrl), > > + &be_path); > > + if (rc) goto out; > > + > > + rc = libxl__xs_read_checked(gc, XBT_NULL, > > + GCSPRINTF("%s/port/%d", be_path, port), > > + &busid); > > + if (rc) goto out; > > + > > + if (!strcmp(busid, "")) { > > + rc = ERROR_FAIL; > > + goto out; > > + } > > + > > + usb->ctrl = ctrl; > > + usb->port = port; > > + rc = usb_busaddr_from_busid(gc, busid, &usb->u.hostdev.hostbus, > > + &usb->u.hostdev.hostaddr); > > You definitely need to set usb->devtype here to HOSTDEV. > > > +libxl_usbinfo = Struct("usbinfo", [ > > + ("ctrl", libxl_devid), > > + ("port", integer), > > + ("busnum", uint8), > > + ("devnum", uint8), > > + ("idVendor", uint16), > > + ("idProduct", uint16), > > + ("prod", string), > > + ("manuf", string), > > + ], dir=DIR_OUT) > > As mentioned in the review of another patch, it looks like this is > vestigal and should be removed. > > > +void libxl_device_usbctrl_list_free(libxl_device_usbctrl *list, int nr) > > +{ > > + int i; > > + for (i = 0; i < nr; i++) > > + libxl_device_usbctrl_dispose(&list[i]); > > + free(list); > > +} > > + > > +void libxl_device_usb_list_free(libxl_device_usb *list, int nr) > > +{ > > + int i; > > + for (i = 0; i < nr; i++) > > + libxl_device_usb_dispose(&list[i]); > > + free(list); > > +} > > This is nitpicky, but as long as you're going to repost: the > first-level indents in these two functions are only 3 spaces instead > of 4. Take all. Thanks very much! - Chunyan > > Other than that (and my previous comments + Ian's comments) it looks good to > me! > > -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 |