|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V13 3/5] libxl: add pvusb API
On 04/02/16 14:39, Juergen Gross wrote:
> On 04/02/16 02:53, Chun Yan Liu wrote:
>>
>>
>>>>> On 2/3/2016 at 10:33 PM, in message <56B20FCC.3010308@xxxxxxxxxx>, George
>> Dunlap <george.dunlap@xxxxxxxxxx> wrote:
>>> On 02/02/16 18:11, Ian Jackson wrote:
>>>> George Dunlap writes ("Re: [Xen-devel] [PATCH V13 3/5] libxl: add pvusb
>>> API"):
>>>>> There are effectively four states a device can be in, from the
>>>>> 'assignment' point of view:
>>>>>
>>>>> 1. Assigned to the normal Linux device driver(s) for the USB device
>>>>>
>>>>> 2. Assigned to no driver
>>>>>
>>>>> 3. Assigned to usbback, but not yet assigned to any guest
>>>>>
>>>>> 4. Assigned to a guest
>>>>
>>>> Thanks for your clear explanation (of which I will snip much).
>>>>
>>>>> Additionally, each USB "device" has one or more "interfaces". To
>>>>> assign a "device" to usbback in the sysfs case means assigning all of
>>>>> the "interfaces". The code seems to assume that different interfaces
>>>>> from the same device can be assigned to different drivers.
>>>>
>>>> It is indeed the case that in principle a single USB device with
>>>> multiple interfaces can be assigned to multiple different drivers.
>>>>
>>>>> Regarding Ian's comments:
>>>>>
>>>>> Since "assigned to the guest" and "listed under the pvusb xenstore
>>>>> node" are the same thing, is it even *possible* to (safely) unassign
>>>>> the device from usbback before removing the xenstore nodes?
>>>>
>>>> It might be possible to remove some of the xenstore nodes but leave
>>>> others present, so that usbback detaches, but enough information
>>>> remains for libxl to know that Xen still `owns' the device.
>>>>
>>>> But, surely usbback needs to cope with the notion that the device
>>>> might disappear. USB devices can disappear at any time.
>>>
>>> That's true. But if the USB device has actually disappeared, the device
>>> is in fact "safe" from usbback. I think I might consider state 2 safe
>>> to go to, but I definitely wouldn't consider state 1 safe with the
>>> xenstore nodes still in place.
>>>
>>>>
>>>>> It's not clear to me under what conditions 3->2 might fail,
>>>>
>>>> As an example, someone might press ^C on `xl usb-detach'.
>>>
>>> *grumble*
>>>
>>>>> or what could be done about it if it did fail.
>>>>
>>>> The most obvious reason for it failing is that something somewhere
>>>> still held onto the device. (For umounting filesystems, and detaching
>>>> block devices, this happens a lot.) So if the detach from usbback
>>>> fails would probably be possible to simply retry it.
>>>
>>> I'm not sure what this means in the context of moving from 3 (assigned
>>> to usbback) to 2 (unassigned). usbback will definitely not use the
>>> device to mount something in dom0; and I'm pretty sure has no visibility
>>> as to whether it's being used as a filesystem in the domU.
>>>
>>> (Moving from 1 -> 2 of course would be subject to this sort of thing,
>>> but that's a different issue.)
>>>
>>>>> Regarding 2->1, again it's not clear that there's anything libxl can
>>>>> do. Reloading the driver's module might reset it enough to pick up
>>>>> the (now unassigned) USB devices again; other than that, rebooting is
>>>>> probably the best option.
>>>>
>>>> I think re-attempting the bind may work. USB devices can be flaky.
>>>>
>>>>> It's also not clear to me, if some functions succeed in being
>>>>> reassigned and others fail, whether it's best to just try to assign as
>>>>> many as we can, or better to go back and un-assign all the ones that
>>>>> succeeded.
>>>>
>>>> Unless explicitly requested, I don't think the system should create
>>>> situations some interfaces are assigned to host drivers and some to
>>>> usbback.
>>>
>>> I was talking here about whether it would be better to have some
>>> interfaces assigned to the original drivers and some interfaces left
>>> unassigned, or to try to leave all interfaces unassigned if any of the
>>> assignments fail.
>>>
>>> I agree, it would be better to try to avoid the possibility of having
>>> some interfaces bound to usbback and some interfaces bound to the
>>> original drivers.
>>>
>>>> And, I'm a fan of `crash-only software': in general, if a failure
>>>> occurs, the situation should just be left as-is. The intermediate
>>>> state needs to be visible and rectifiable.
>>>>
>>>> This approach to software state machines avoids bugs where the system
>>>> gets into `impossible' states, recovery from which is impossible
>>>> because the designers didn't anticipate them.
>>>>
>>>> It would be tolerable if the recovery sometimes involves `lsusb' and
>>>> echoing things into sysfs, but it would be better if not.
>>>
>>> Right -- so what about this. When removing a USB device:
>>>
>>> * First modify the pvusb xenstore nodes such that 1) it's safe to
>>> attempt removing the interfaces from usbback, but 2) they still show up
>>> in usb-list. (This may be a noop.)
>>>
>>> * Attempt to remove all interfaces from usbback; if any of these fail,
>>> stop and report an error. Possible recovery options:
>>> - Re-try the usb_remove command
>>> - Re-load usbback (obviously disruptive to other VMs)
>>> - Reboot the host
>>> - Manually try unbinding with sysfs
>>>
>>> * Remove the remaining pvusb xenstore nodes. If this fails, stop and
>>> report the error. Possible recovery options:
>>> - Re-try the usb_remove command
>>>
>>> = REBIND OPTION 1: Do the best we can without extra commands
>>>
>>> * Attempt to re-bind the interfaces to the original drivers, as recorded
>>> in the libxl usb xenstore nodes. If any of these fail, report an error
>>> but continue to try the rest of the interfaces, and remove the xenstore
>>> nodes containing information about the original drivers. Possible
>>> recovery options for the user:
>>> - Reload the original drivers
>>> - Reboot the host
>>> - Manually try rebinding with sysfs
>>>
>>> = REBIND OPTION 2: Include a recovery command, usb-retry-rebind
>>>
>>> * Attempt to re-bind the interfaces to the original drivers, as recorded
>>> in the libxl usb xenstore nodes. If any of these fail, stop immediately
>>> and report an error; do not remove the xenstore nodes containing the
>>> original drivers of any interfaces that failed to rebind. Possible
>>> recovery options for the user:
>>> - Run 'xl usbdev-retry-rebind', which will just execute this step again
>>> - Unload and reload original host drivers
>>> - Reboot the host
>>>
>>> Both of these:
>>>
>>> 1. Will avoid the state of some interfaces bound to usbback, some
>>> rebound to the original drivers
>>>
>>> 2. Give the user a convenient way to re-try unbinding from usbback it
>>> failed
>>>
>>> 3. Give the user out-of-xl ways to attempt to recover the state other
>>> than messing around with sysfs.
>>>
>>> Rebind option 2 will give the user a convenient way to retry rebinding
>>> to the original driver via xl if that step failed.
>>>
>>> I'm inclined to suggest rebind option #1 for now, just to keep things
>>> simple.
>>>
>>> Thoughts?
>>>
>>> Chunyan, would the first half of that (removing from usbback before
>>> removing the pvusb xenstore nodes) actually work?
>>
>> From testing, yes, it works. But I am not sure if it is safe though. Juergen
>> should be very clear about that according to usbback internal codes.
>>
>> Juergen, could you help to confirm that?
>
> I think it should work.
>
> TBH, I don't think the error handling of driver binding/unbinding should
> be made too intelligent. In the long run I hope to have a qemu-based
> pvUSB backend. And in this case driver binding/unbinding will be handled
> completely by qemu/libusb.
>
> Whether we want to keep the kernel based pvUSB-backend support in xl
> at the end should be discussed later. I'll either add the qemu based
> variant or I'll replace the kernel variant with the qemu one as soon
> as the qemu backend has been accepted.
There's a difference between "making it intelligent" and "not making it
broken". :-) Given that users can potentially cause a number of these
things to fail just by pressing Ctrl-C, we need to at least make sure
that we don't get into a completely wedged state that the user can't do
anything to fix. That requires some careful thought.
-George
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |