[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH V4 3/7] libxl: add pvusb API



On 06/17/2015 12:24 PM, Ian Campbell wrote:
> On Tue, 2015-06-16 at 12:44 +0100, Ian Jackson wrote:
>> George Dunlap writes ("Re: [Xen-devel] [PATCH V4 3/7] libxl: add pvusb API"):
>>> On Tue, Jun 16, 2015 at 12:19 PM, Juergen Gross <jgross@xxxxxxxx> wrote:
>>>> I'm pretty sure this is just a matter of timing during boot: the busses
>>>> are all (or at least some of them) queried at the same time and the
>>>> first answering gets number 1, the next 2, and so on. And timing seems
>>>> to be different enough to result in unstable bus numbers.
>>>
>>> Right -- I meant "stable in topology within one boot", but at least
>>> two of you have now understood me to mean "across reboots" by default,
>>> so that's obviously a detail that needs to be specified. :-)
>>
>> I think "stable in topology within one boot" is nearly vacuous (or are
>> we expecting buses or devices to spontaneously renumber themselves for
>> no reason) and also nearly useless.
>>
>> We definitely need _some_ way for a user to identify a specific device
>> uniquely in a way that is reliable from one boot to the next.  vid:pid
>> is one way to do this, but not always sufficient.
> 
> We should perhaps separate out the "end user" from the "libxl
> user" (i.e. the toolstack application) in our deliberations here.
> 
> We have the option of settling on a single way of describing a device to
> libxl in the libxl API but allowing the toolstack to choose to present
> the user with multiple different ways to specify things by providing a
> suitable set of helper functions (in either libxlu or libxl proper) from
> a variety of schemes to the one true way of describing a device.
> 
> That sounds better to me than having the libxl API consist of the union
> of all potentially useful ways to refer to a device.
> 
> I'm not sure whether that also gives us the freedom to use something
> which is only stable for a given boot at the libxl API layer though.

[snip]

> As a slight aside to this, can't libxl use libusb for a lot of this
> stuff and therefore avoid being Linux specific?
>
> http://libusb.info/ claims to support "Linux, OS X, Windows, Windows CE,
> Android, OpenBSD/NetBSD, Haiku.". Interestingly FreeBSD is missing there
> but I don't think that need to be a blocker.
>
> I don't see a problem with adding libusb to our set of dependencies, and
> it's certainly got to be better than (re)implementing a bunch of sysfs
> stuff (which I presume is what libusb does under the hood anyway).

OK, so we have three interfaces:

* User <-> toolstack
* toolstack <-> libxl
* libxl <-> underlying functionality (Linux pvusbback and qemu, at the
moment)

And we're also now considering whether to do a "minimal interface" in
libxl (i.e., only accept one kind of specification and make the
toolstack do the conversion from a more useful spec) or do a "rich
interface" (i.e., accept many different kinds of specification, allowing
the toolstack to just pass things through).

qemu already uses libusb, and so can already do almost everything that
libxl could use libusb to accomplish.  The only things it doesn't do
that we've talked about doing are the bus-ports specification, and the
"vendorid:deviceid:serialno" specification; both of which would be
trivial (and probably useful) to add.

So for all the things libusb can be used to convert between, we don't
actually need to do any conversion when speaking to qemu (unless we want
to be backwards compatible with older versions).

The udev "id_path" specification isn't something that libusb can handle;
we'd have to mess around with sysfs and/or udev-created device nodes /
symbolic links into sysfs anyway.

So for the qemu side of things, libusb is mostly useless.

We can't get around using sysfs to talk to pvusbback -- that's how it
works.  At the moment, the pvusbback interface requires sysfs strings,
which happen to be described in the bus-ports:interface format.  So the
main reason we're messing around with sysfs at the moment is to convert
other specifications into the sysfs strings suitable for using with pvusb.

To convert into a sysfs string ourselves:
* readdir on /sys/bus/usb/devices
* for each entry, look inside to see if it matches the specification
(i.e., bus==busnum, addr==devnum, &c)
* take the directory name of the entry that matches
* look inside that directory for all the interfaces for that device (so
we can assign each one to pvusbback).
* Write the strings you read from sysfs into the appropriate "bind"
nodes in pvusbback

To convert bus.addr into a sysfs string with libusb:
* libusb_get_device_list [1]
* for each entry, call libusb_get_device_descriptor and see if it
matches the specification (i.e., bus==bus, addr==addr, &c)
* Call libusb_get_ports to get an array of the port numbers
* Construct a sysfs string from the bus number and the array of port
numbers (i.e., %d-%d[.%d.%d])
* Get information about all the interfaces, and construct sysfs strings
from those as well
* Write the constructed strings into the pciback sysfs nodes

A couple of points:
1. The second is certainly not simpler than the first
2. The only code that needs to do it is completely linux-specific at the
moment anyway (since it's talking to the linux driver)
3. The first uses strings that it pulled directly from sysfs; the second
relies on constructing strings
4. If we do a "minimal interface" in libxl, then the toolstack will also
have to link against libusb to convert from a more useful specification
to the libxl specification

So it seems to me that libusb doesn't actually have that much to offer
us.  For the only situation where it actually is cross-platform (i.e.,
qemu), it's not needed; for the one situation where it could be used
(converting to sysfs-style strings for pvusbback), it's not simpler,
probably less robust, and its cross-platform capability is moot (since
it's a Linux-only driver anyway).

 -George

[1] See http://libusb.sourceforge.net/api-1.0/group__dev.html and
http://libusb.sourceforge.net/api-1.0/group__desc.html

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.