|
[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/7/2015 at 12:50 AM, in message
<CAFLBxZZfzL2F4qnuWGbPzA8v1fFGvvkBGn+gCO6CeEkvBf6hHA@xxxxxxxxxxxxxx>, George
Dunlap <George.Dunlap@xxxxxxxxxxxxx> wrote:
> On Mon, Jan 19, 2015 at 8:28 AM, Chunyan Liu <cyliu@xxxxxxxx> wrote:
> > diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
> > index 0a123f1..2e89244 100644
> > --- a/tools/libxl/libxl.h
> > +++ b/tools/libxl/libxl.h
>
> > +int libxl_intf_to_device_usb(libxl_ctx *ctx, uint32_t domid,
> > + char *intf, libxl_device_usb *usb)
> > + LIBXL_EXTERNAL_CALLERS_ONLY;
>
> I guess this function will go away?
With using bus:addr instead of sysfs interface, this will be removed.
>
> > 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
> > @@ -0,0 +1,1277 @@
>
> > +static int libxl__usbport_add_xenstore(libxl__gc *gc,
> > + xs_transaction_t tran,
> > + uint32_t domid,
> > + libxl_device_usbctrl *usbctrl)
>
> Would it be too much to ask to have all the pvusb-specific stuff in a
> separate file -- say, "libxl_pvusb.c" or something? That would make
> it a lot easier when I add in the HVM USB stuff.
Sure.
>
> (Just to be clear, I'm asking as a favor -- it's policy that the first
> mover gets to have it easier, and people who want to come and add
> something later are the ones who have to do the refactoring.)
>
> > +{
> > + char *path;
> > + int i;
> > +
> > + path = GCSPRINTF("%s/backend/vusb/%d/%d/port",
> > + libxl__xs_get_dompath(gc, 0), domid, usbctrl->devid);
> > +
> > + libxl__xs_mkdir(gc, tran, path, NULL, 0);
> > +
> > + for (i = 1; i <= usbctrl->num_ports; i++) {
> > + if (libxl__xs_write_checked(gc, tran, GCSPRINTF("%s/%d", path, i),
> >
> ""))
> > + return ERROR_FAIL;
> > + }
> > +
> > + return 0;
> > +}
> > +
> > +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));
> > + flexarray_append(back, "online");
> > + flexarray_append(back, "1");
> > + flexarray_append(back, "state");
> > + flexarray_append(back, libxl__sprintf(gc, "%d", 1));
> > + flexarray_append(back, "usb-ver");
> > + flexarray_append(back, libxl__sprintf(gc, "%d",
> > usbctrl->usb_version));
> > + flexarray_append(back, "num-ports");
> > + flexarray_append(back, libxl__sprintf(gc, "%d", usbctrl->num_ports));
>
> So how much of this is pvusb-specific, and how much would be shared
> between DEVICEMODEL? Because this bit looks specifically like the
> stuff used to set up the pvusb connection...
To share with qemu emulated usb controller? I think pvusb backend driver will
probe things under backend/vusb/* and setup connection with pvusb frontend
driver, qemu emulated usb controller should not be placed there at all maybe.
>
> > + flexarray_append(back, "type");
> > + switch(usbctrl->type) {
> > + case LIBXL_USBCTRL_TYPE_PV:{
> > + flexarray_append(back, "PVUSB");
> > + break;
> > + }
> > + case LIBXL_USBCTRL_TYPE_DEVICEMODEL: {
> > + flexarray_append(back, "IOEMU");
> > + break;
> > + }
> > + default:
> > + /* not supported */
> > + rc = ERROR_FAIL;
> > + goto out;
> > + }
>
> ...but this looks like it's trying to be shared between PVUSB and
> DEVICEMODEL. I'm pretty sure this isn't going to work long-run,
> because if we were to write all this stuff for a devicemodel, wouldn't
> the pvusb back-end take this as setting up a new pvusb port?
Yes, I think you are right. This place should only allow pvusb type.
Qemu emulated usb controller should not be stored here.
>
> Also, you don't seem to be storing or retreiving usbctrl->name here --
> if we want that to be part of the interface we need to use it. (I
> think we wanted that so that it could default to something like pv-0,
> emul-1, &c).
First I wonder usbctrl->name is really needed. If just for interface, we can
use devid (index), it could be 0, 1, and with usb-list one knows info like:
0 is pv, 1 is emulated. But if it helps a lot with a 'name', surely we can
add :)
>
> In general, I don't think libxl should be storing stuff in the pvusb
> front/back xenstore directories not related to that protocol. We
> should store extraneous information in a libxl-specific directory.
> You can see an example of the kind of think I'm talking about in the
> HVM USB patch I submitted last year (see usb_add_xenstore()):
>
> http://lists.xen.org/archives/html/xen-devel/2014-06/msg00086.html
>
> Alternately -- at the moment, the only extraneous information we've
> got is the name of the controller; if you wanted to propose that we
> get rid of the name field, then there wouldn't be any extra
> information to store.
>
> > +
> > + flexarray_append(front, "backend-id");
> > + flexarray_append(front, libxl__sprintf(gc, "%d",
> usbctrl->backend_domid));
> > + flexarray_append(front, "state");
> > + flexarray_append(front, libxl__sprintf(gc, "%d", 1));
> > +
> > +retry_transaction:
> > + tran = xs_transaction_start(ctx->xsh);
> > +
> > + libxl__device_generic_add(gc, tran, device,
> > + libxl__xs_kvs_of_flexarray(gc, back,
> back->count),
> > + libxl__xs_kvs_of_flexarray(gc, front,
> front->count),
> > + NULL);
> > + libxl__usbport_add_xenstore(gc, tran, domid, usbctrl);
> > +
> > + if (!xs_transaction_end(ctx->xsh, tran, 0)) {
> > + if (errno == EAGAIN)
> > + goto retry_transaction;
> > + else {
> > + rc = ERROR_FAIL;
> > + goto out;
> > + }
> > + }
> > +
> > +out:
> > + return rc;
> > +}
> > +
> > +static int libxl__device_usbctrl_add(libxl__gc *gc, uint32_t domid,
> > + libxl_device_usbctrl *usbctrl)
> > +{
> > + int rc = 0;
> > +
> > + rc = libxl__device_usbctrl_setdefault(gc, domid, usbctrl);
> > + if(rc) goto out;
> > +
> > + if (usbctrl->devid == -1) {
>
> This also needs to have a symbolic name; something with "AUTO" in it.
>
> > + if ((usbctrl->devid = libxl__device_nextid(gc, domid, "vusb")) <
> > 0) {
> > + rc = ERROR_FAIL;
> > + goto out;
> > + }
> > + }
> > +
> > + if (libxl__usbctrl_add_xenstore(gc, domid, usbctrl) < 0){
> > + rc = ERROR_FAIL;
> > + goto out;
> > + }
> > +
> > +out:
> > + return rc;
> > +}
> > +
>
>
> > +/* Following functions are to get assignable usb devices */
>
> <snip>
>
> > +libxl_device_usb *
> > +libxl_device_usb_assignable_list(libxl_ctx *ctx, int *num)
>
> I'm a bit ambivalent about this one. For people using xl, "lsusb"
> should be just fine. Is anyone building a toolstack on top of libxl
> directly going to need this functionality? Would libvirt use this
> functionality, for instance, or would it use libusb? Or just leave
> that to the caller?
This exists mainly because the proposed interface before using usb sysfs
interface rather than bus:addr, user has no much idea about which sysfs
interface is related to which usb device. Now if we decide to use bus:addr,
I agree this API could be removed. Just use lsusb. (But user should have this
knowledge in mind: a HUB could not be assigned to guest).
>
>
> > +static int libxl__device_usb_setdefault(libxl__gc *gc, uint32_t domid,
> > + libxl_device_usb *usb)
> > +{
> > + char *be_path, *tmp;
> > +
> > + if (usb->ctrl == -1) {
> > + int ret = libxl__device_usb_set_default_usbctrl(gc, domid, usb);
> > + /* If no existing ctrl to host this usb device, setup a new one */
> > + if (ret) {
> > + libxl_device_usbctrl usbctrl;
> > + libxl_device_usbctrl_init(&usbctrl);
> > + libxl__device_usbctrl_add(gc, domid, &usbctrl);
>
> What happens if this fails?
Currently it will check usb port existence later, so if this fails, errors will
be
reported in that step. But I think I'd better check the return value here to
report
error earlier. Thank you.
- Chunyan
>
> -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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |