From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ian Jackson Subject: Re: [PATCH V4 3/7] libxl: add pvusb API Date: Thu, 11 Jun 2015 17:42:03 +0100 Message-ID: <21881.47707.526863.158586@mariner.uk.xensource.com> References: <1433906441-3280-1-git-send-email-cyliu@suse.com> <1433906441-3280-4-git-send-email-cyliu@suse.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1433906441-3280-4-git-send-email-cyliu@suse.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Chunyan Liu Cc: george.dunlap@eu.citrix.com, Simon Cao , wei.liu2@citrix.com, ian.campbell@citrix.com, xen-devel@lists.xen.org List-Id: xen-devel@lists.xenproject.org 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. > +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 ? > 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". > 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. 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. > + 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. Thanks, Ian.