|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V7 3/7] libxl: add pvusb API
On Wed, 2015-09-30 at 18:55 +0100, George Dunlap wrote:
> > +int libxl_devid_to_device_usbctrl(libxl_ctx *ctx,
> > + uint32_t domid,
> > + int devid,
> > + libxl_device_usbctrl *usbctrl)
> > +{
> > + GC_INIT(ctx);
> > + libxl_device_usbctrl *usbctrls;
> > + int nb = 0;
> > + int i, rc = -1;
> > +
> > + usbctrls = libxl_device_usbctrl_list(ctx, domid, &nb);
> > + if (!nb) goto out;
> > +
> > + for (i = 0; i < nb; i++) {
> > + if (devid == usbctrls[i].devid) {
> > + *usbctrl = usbctrls[i];
>
> libxl maintainers: Is this kind of copying OK?
>
> The analog functions for vtpm and nic both take very different
> approaches; both call libxl_device_[type]_init() and then fill in
> individual elements (albeit in different ways).
That depends on the memory lifecycle situation of usbctrls[i] and *usbctrl
vis-a-vis the gc and when they are frred.
Cut out of the context here is a
+ libxl_device_usbctrl_list_free(usbctrls, nb);
which is going to free any of the pointers in usbctrls[i] which have been
copied to usbctrl. So in this case no it is not ok.
You can't avoid the libxl_device_usbctrl_list_free, since you don't want to
leak all the other elements on the list, so copying seems to be the way to
go.
The IDL should have generated a copy function which can be used (by the
vtpm one too, but it predates the IDL making such things I think).
>
> > +/*
> > + * USB add
> > + */
> > +static int do_usb_add(libxl__gc *gc, uint32_t domid,
> > + libxl_device_usb *usbdev,
> > + libxl__ao_device *aodev)
> > +{
> > + libxl_ctx *ctx = CTX;
> > + libxl_usbctrlinfo usbctrlinfo;
> > + libxl_device_usbctrl usbctrl;
> > + int rc;
> > +
> > + libxl_usbctrlinfo_init(&usbctrlinfo);
> > + usbctrl.devid = usbdev->ctrl;
> > + rc = libxl_device_usbctrl_getinfo(ctx, domid, &usbctrl,
> > &usbctrlinfo);
> > + if (rc)
> > + goto out;
> > +
> > + switch (usbctrlinfo.type) {
> > + case LIBXL_USBCTRL_TYPE_DEVICEMODEL:
> > + LOG(ERROR, "Not supported");
> > + break;
> > + case LIBXL_USBCTRL_TYPE_PV:
> > + rc = libxl__device_usb_add_xenstore(gc, domid, usbdev,
> > + aodev->update_json);
> > + if (rc) goto out;
> > +
> > + rc = usbback_dev_assign(gc, usbdev);
>
> This assumes that the usb controller is dom0; but the interface
> explicitly allows pvusb driver domains.
>
> I think it would be enough here to do this check if the usbctrl device
> is dom0. We should then assume that a pvusb driver domain will be
> configured with all usb devices assigned to usbback already.
>
> I assume that there's a feedback mechanisms for backends for situations
> where the requested device can't be made, right? For example, if you
> have a network driver domain and request a non-existent bridge? If so,
> I think we can let the same mechanism worth for pvusb backends to say "I
> don't have that device available".
I think the b/e writes an error node in xenstore, which we already pickup
iirc.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |