|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC V2 3/5] libxl: add pvusb API
>>> On 3/3/2015 at 07:38 PM, in message <1425382696.24959.112.camel@xxxxxxxxxx>,
Ian Campbell <ian.campbell@xxxxxxxxxx> wrote:
> On Mon, 2015-01-19 at 16:28 +0800, Chunyan Liu wrote:
> > Add pvusb APIs, including:
> > - attach/detach (create/destroy) virtual usb controller.
> > - attach/detach usb device
> > - list assignable usb devices in host
> > - some other helper functions
> >
> > Signed-off-by: Chunyan Liu <cyliu@xxxxxxxx>
> > Signed-off-by: Simon Cao <caobosimon@xxxxxxxxx>
> > ---
> > tools/libxl/Makefile | 2 +-
> > tools/libxl/libxl.c | 2 +
> > tools/libxl/libxl.h | 58 ++
> > tools/libxl/libxl_internal.h | 6 +
> > tools/libxl/libxl_usb.c | 1277
> ++++++++++++++++++++++++++++++++++++++++++
> > tools/libxl/libxlu_cfg_y.c | 464 ++++++++-------
> > tools/libxl/libxlu_cfg_y.h | 38 +-
> > 7 files changed, 1623 insertions(+), 224 deletions(-)
> > create mode 100644 tools/libxl/libxl_usb.c
> >
> > diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile
> > index b417372..08cdb12 100644
> > --- a/tools/libxl/Makefile
> > +++ b/tools/libxl/Makefile
> > @@ -95,7 +95,7 @@ LIBXL_OBJS = flexarray.o libxl.o libxl_create.o
> libxl_dm.o libxl_pci.o \
> > libxl_internal.o libxl_utils.o libxl_uuid.o \
> > libxl_json.o libxl_aoutils.o libxl_numa.o \
> > libxl_save_callout.o _libxl_save_msgs_callout.o \
> > - libxl_qmp.o libxl_event.o libxl_fork.o $(LIBXL_OBJS-y)
> > + libxl_qmp.o libxl_event.o libxl_fork.o libxl_usb.o
> > $(LIBXL_OBJS-y)
>
> The contents of that file looks Linux specific, so I think you might
> have to arrange for it to only be built there and also to provide a
> libxl_nousb.c with stubs returning appropriate errors to be used on
> other platforms.
>
> Or it may be possible (even better) to refactor the linux specific bits
> of libxl_usb.c into libxl_linux.c and leave the common stuff behind.
>
> I thought libxl_pci.c would be a good example of this, but it doesn't
> seem to have any conditional stuff, yet I expected it to be Linux
> specific. I've no idea how that works :-(. Maybe usb can get away with
> it too.
>
> > +int libxl_intf_to_device_usb(libxl_ctx *ctx, uint32_t domid,
> > + char *intf, libxl_device_usb *usb)
> > + LIBXL_EXTERNAL_CALLERS_ONLY;
>
> I wasn't sure what an "intf" was on patch #1. hopefully your answer
> there will help me understand what this is for!
As in patch#1, it means syfs interface for the usb device, like: 2-1.6.
This function will be used when detaching a usb device, use indicates
2-1.6, it will return the corresponding libxl_device_usb structure.
>
> > diff --git a/tools/libxl/libxl_usb.c b/tools/libxl/libxl_usb.c
> > new file mode 100644
> > index 0000000..830a846
> > --- /dev/null
> > +++ b/tools/libxl/libxl_usb.c
>
> Apart from my not yet understanding the interface semantics and the
> potential for Linux-specificness mentioned above the actual code here
> looks reasonably OK to me. I have smaller and larger comments below
> though.
>
> > +static int libxl__device_usbctrl_setdefault(libxl__gc *gc, uint32_t domid,
> > + libxl_device_usbctrl *usbctrl)
> > +{
> [...]
> > + if(!usbctrl->backend_domid)
>
> Missing space before (.
>
>
> > +static int libxl__usbctrl_add_xenstore(libxl__gc *gc, uint32_t domid,
> > + libxl_device_usbctrl *usbctrl)
> > +{
> > + libxl_ctx *ctx = libxl__gc_owner(gc);
> > + flexarray_t *front;
> > + flexarray_t *back;
> > + libxl__device *device;
> > + xs_transaction_t tran;
> > + int rc = 0;
> > +
> > + GCNEW(device);
> > + rc = libxl__device_from_usbctrl(gc, domid, usbctrl, device);
> > + if (rc) goto out;
> > +
> > + front = flexarray_make(gc, 4, 1);
> > + back = flexarray_make(gc, 12, 1);
> > +
> > + flexarray_append(back, "frontend-id");
> > + flexarray_append(back, libxl__sprintf(gc, "%d", domid));
>
> GCSPRINTF would be good for all of these (and in lots of other places
> too).
>
> flexarray_append_pair is also nice for adding key+value at the same time
> since it makes it easier to see what goes together.
Got it. Will update all in next version.
>
> > +retry_transaction:
> > + tran = xs_transaction_start(ctx->xsh);
>
> Please follow the design pattern in e.g. libxl__device_vtpm_add or
> device_disk_add and use libxl__xs_transaction_start/commit/abort here
> inside a for (;;).
OK. Got it.
>
> > +static int libxl__device_usbctrl_add(libxl__gc *gc, uint32_t domid,
> > + libxl_device_usbctrl *usbctrl)
> > +{
> > [...]
> > + if (libxl__usbctrl_add_xenstore(gc, domid, usbctrl) < 0){
>
> Space before { please.
>
> > +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)
> > +{
> > [...]
> > + for (i = 0; i < numusb; i++) {
> > + if (libxl__device_usb_remove_common(gc, domid, &usbs[i], 0)) {
> > + fprintf(stderr, "libxl_device_usb_remove failed.\n");
>
> Use LOG*( please, not fprintf (this is true everywhere in libxl in case
> I missed any other).
>
> > +/* usb device functions */
> > +
> > +/* Following functions are to get assignable usb devices */
> > +static int
> > +libxl__device_usb_assigned_list(libxl__gc *gc,
> > + libxl_device_usb **list, int *num)
> > +{
> > + char **domlist;
> > + unsigned int nd = 0, i, j;
> > + char *be_path;
> > + libxl_device_usb *usb;
> > +
> > + *list = NULL;
> > + *num = 0;
> > +
> > + domlist = libxl__xs_directory(gc, XBT_NULL, "/local/domain", &nd);
> > + be_path = libxl__sprintf(gc,"/local/domain/0/backend/vusb");
>
> GCSPRINTF.
>
> Also I notice a hardcoded 0, shouldn't that be backend_domid somehow?
Yes, it is. Will update. Thanks for pointing out.
> I've seen a few /0/ hardcoded here and there in this patch, which if not
> backend_domid perhaps ought to at least be LIBXL_TOOLSTACK_DOMID.
>
> If not then is it necessary to dup the string, can't it just be a const
> string literal?
>
> > +static bool is_usb_assignable(libxl__gc *gc, char *intf)
> > +{
> > + char buf[5];
> > +
> > + if (get_usb_bDeviceClass(gc, intf, buf) < 0)
> > + return false;
> > +
> > + if (strcmp(buf, USBHUB_CLASS_CODE))
> > + return false;
>
>
> OOI are hubs inherently unassignable, or is that a short coming of the
> current driver code?
It's right. I'm very sorry here and other few places out of my mistake,
some changes not included in this patch when sending. I noticed that
when sending these patches to Juergen for his kernel patches testing.
Will send the correct ones in next version.
>
> > +/* get all usb devices of the domain */
> > +static libxl_device_usb *
> > +libxl_device_usb_list_all(libxl__gc *gc, uint32_t domid, int *num)
>
> Should be in libxl__ namespace, or since it is static you could omit the
> namespacing completely if you prefer.
>
> > +/* xenstore usb data */
> > +static int libxl__device_usb_add_xenstore(libxl__gc *gc, uint32_t domid,
> > + libxl_device_usb *usb)
> > +{
> > + libxl_ctx *ctx = CTX;
>
> FYI although it's not required, you can just use CTX in the code if you
> prefer.
>
> > [...]
> > + be_path = libxl__sprintf(gc, "%s/port/%d", be_path, usb->port);
> > + LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Adding new usb device to
> xenstore");
>
> The LOG*( macros will help shorten this line.
>
> > + path = libxl__sprintf(gc, "cat "SYSFS_USB_DEVS_PATH"/%s/manufacturer",
> >
> intf);
>
> Whoah, what now?
>
> What you want here is to open the fd and use read on it. We may even
Yes. I also think it's odd and so already updated this kinds of places locally
for Juergen's testing. Will be posted in next version. Thanks.
> have existing helpers for doing so. Certainly using popen on a string
> starting with cat isn't what is wanted (at least not without a big and
> convincing comment explaining why this should be needed).
>
> I see a bunch of this in this area.
>
> > +int libxl_device_usb_getinfo(libxl_ctx *ctx, char *intf, libxl_usbinfo
> *usbinfo)
> > +{
> > + GC_INIT(ctx);
> > + char buf[512];
> > +
> > + if (!get_usb_devnum(gc, intf, buf) )
>
> In consistent spacing.
>
> > + usbinfo->devnum = atoi(buf);
> > +
> > + if ( !get_usb_busnum(gc, intf, buf))
> > + usbinfo->bus = atoi(buf);
> > +
> > + if (!get_usb_idVendor(gc, intf, buf) )
> > + usbinfo->idVendor = atoi(buf);
> > +
> > + if (!get_usb_idProduct(gc, intf, buf) )
> > + usbinfo->idProduct = atoi(buf);
> > +
> > + if (!get_usb_manufacturer(gc, intf, buf) )
> > + usbinfo->manuf = strdup(buf);
>
> libxl_strdup with NOGC to get correct error handling please.
Got it. Will update.
- Chunyan
>
> > +
> > + if (!get_usb_product(gc, intf, buf) )
> > + usbinfo->prod = strdup(buf);
> > +
> > + GC_FREE;
> > + return 0;
> > +}
> > +
>
>
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |