[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.