[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/12/2015 at 12:42 AM, in message <21881.47707.526863.158586@xxxxxxxxxxxxxxxxxxxxxxxx>, Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> wrote: > Chunyan Liu writes ("[Xen-devel] [PATCH V4 3/7] libxl: add pvusb API"): > > Add pvusb APIs, including: > ... > > Thanks for your contribution. I'm afraid I haven't had time to > completely finish my review this, but here's what I have: > > > --- /dev/null > > +++ b/docs/misc/pvusb.txt > > @@ -0,0 +1,243 @@ > > +1. Overview > > It's good that you have provided documentation. But I think this > document is a bit confused about its audience. > > Information about design choices should be removed from this user- and > application-facing document, and put in comments in the code, or > commit messages, I think. Thanks. Will update. > > > > +int libxl_device_usbctrl_getinfo(libxl_ctx *ctx, uint32_t domid, > > + libxl_device_usbctrl *usbctrl, > > + libxl_usbctrlinfo *usbctrlinfo) > > + LIBXL_EXTERNAL_CALLERS_ONLY; > > Why is this function marked LIBXL_EXTERNAL_CALLERS_ONLY ? Currently libxl itself won't call it. Exposed for toolstack usage. Will remove that if it's not proper. > > > diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h > > index ef7aa1d..89a9f07 100644 > > --- a/tools/libxl/libxl_internal.h > > +++ b/tools/libxl/libxl_internal.h > > @@ -2439,6 +2439,18 @@ _hidden void libxl__device_vtpm_add(libxl__egc *egc, > > > uint32_t domid, > ... > > +/* AO operation to connect a PVUSB controller. > > + * Adding a PVUSB controller will add a 'vusb' device entry in xenstore, > > + * and will wait for device connection. > > In this context I think "will wait for device connection" is > misleading. What you mean is that the vusb is available for adding > devices to, but won't have any yet. Nothing in libxl is "waiting". Here I mean libxl_wait_for_device_connection. Since it adds a new device entry to xenstore, it needs to wait for a moment for frontend/backend connection. > > > diff --git a/tools/libxl/libxl_pvusb.c b/tools/libxl/libxl_pvusb.c > > new file mode 100644 > > index 0000000..a6e1aa1 > > --- /dev/null > > +++ b/tools/libxl/libxl_pvusb.c > > @@ -0,0 +1,1249 @@ > ... > > +void libxl__device_usbctrl_add(libxl__egc *egc, uint32_t domid, > > + libxl_device_usbctrl *usbctrl, > > + libxl__ao_device *aodev) > > +{ > > + STATE_AO_GC(aodev->ao); > ... > > + libxl_domain_config_init(&d_config); > > + libxl_device_usbctrl_init(&usbctrl_saved); > > + libxl_device_usbctrl_copy(CTX, &usbctrl_saved, usbctrl); > > Wei will need to review the saved/live saved device info handling, and > the json, etc. > > > +static int > > +libxl_device_usbctrl_remove_common(libxl_ctx *ctx, uint32_t domid, > > + libxl_device_usbctrl *usbctrl, > > + const libxl_asyncop_how *ao_how, > > + int force) > > As discussed, you mustn't call this within libxl. I don't quite understand why. I guess it's the same as usb_add problem, something related to embedded ao? As in usb_add: libxl_device_usb_add() AO_CREATE(ctx, domid, ao_how) libxl__device_usb_add() libxl__device_usb_setdefault() libxl_device_usbctrl_add_common() AO_CREATE(ctx, domid, NULL) if this is not allowed, what is the correct way? > If you need to, you > need to break it out into an internal function > (libxl__initiate_device_usbctrl_remove, maybe) which makes a callback > when done. > > > +libxl_device_usbctrl * > > +libxl_device_usbctrl_list(libxl_ctx *ctx, uint32_t domid, int *num) > > +{ > > + GC_INIT(ctx); > > + libxl_device_usbctrl *usbctrls = NULL; > > + char *fe_path = NULL; > > + char **dir = NULL; > > + unsigned int ndirs = 0; > > + > > + *num = 0; > > + > > + fe_path = GCSPRINTF("%s/device/vusb", > > + libxl__xs_get_dompath(gc, domid)); > > + dir = libxl__xs_directory(gc, XBT_NULL, fe_path, &ndirs); > > + > > + if (dir && ndirs) { > > + usbctrls = malloc(sizeof(*usbctrls) * ndirs); > > Please use libxl__calloc with NOGC. Thanks. Missing this one. > > > + libxl_device_usbctrl* usbctrl; > > + libxl_device_usbctrl* end = usbctrls + ndirs; > > + for (usbctrl = usbctrls; usbctrl < end; usbctrl++, dir++, > > (*num)++) > { > > + char *tmp; > > + const char *be_path = libxl__xs_read(gc, XBT_NULL, > > + GCSPRINTF("%s/%s/backend", fe_path, > *dir)); > > + > > + libxl_device_usbctrl_init(usbctrl); > > + usbctrl->devid = atoi(*dir); > > This function (and the corresponding writing code) is quite formulaic. > Perhaps a macro or something could be used. > > I would make a similar criticism of libxl_device_usbctrl_getinfo. > > > +/* check if USB device is already assigned to a domain */ > > +static bool is_usb_assigned(libxl__gc *gc, libxl_device_usb *usb) > > +{ > > + libxl_device_usb *usbs; > > + int rc, num; > > + > > + rc = libxl__device_usb_assigned_list(gc, &usbs, &num); > > + if (rc) { > > + LOG(ERROR, "Fail to get assigned usb list"); > > + return true; > > I don't think this is proper error handling. You need to either > encode the boolean return value in the error code, or have the boolean > result be a reference parameter. Will improve that. Thanks, Chunyan > > > Thanks, > Ian. > > _______________________________________________ > 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 |