On 04/24/2013 10:01 AM, Daniel P. Berrange wrote:
On Wed, Apr 24, 2013 at 09:56:34AM -0400, Laine Stump wrote:
> On 04/23/2013 12:34 PM, Laine Stump wrote:
>> On 04/23/2013 11:46 AM, Daniel P. Berrange wrote:
>>> On Tue, Apr 23, 2013 at 10:52:09AM -0400, Laine Stump wrote:
>>>> Yesterday for the first time I consciously noticed the
>>>> virNodeDeviceDettach and virNodeDeviceReAttach APIs, and found that they
>>>> are hardcoded to bind to/unbind from the pci-stub driver for qemu, and
>>>> the "pciback" driver for Xen. If we want these APIs to be
useful for
>>>> VFIO, they will need to bind to the vfio driver instead, but there is
>>>> currently no method in those APIs to specify which driver to bind to.
>>>>
>>>> I guess we could do this with new virNodeDeviceDetachFlags() and
>>>> virNodeDeviceReAttachFlags() APIs which have a flag to indicate vfio,
>>>> but before going to that trouble I'd like to know if these APIs are
>>>> actually used or if they are deprecated (they don't seem to be of
any
>>>> use if the hostdev devices you're assigning have
"managed='yes'" - as
>>>> far as I can see, setting managed='yes' just makes the
bind/unbind from
>>>> the stub driver an automatic part of assigning/un-assigning the device
>>>> to a guest).
>>> The rationale for managed="no", is that in more security
paranoid/locked
>>> down environments, admins will not want libvirtd screwing around with
>>> kernel module drivers. The admin would manually setup "pciback"
binding
>>> ahead of time when configuring the host. I think we need to continue to
>>> support this scenario in the VFIO world.
>> Okay. But then in that case, since they don't want libvirtd screwing
>> around with kernel module drivers when starting a domain, they also
>> wouldn't want libvirtd screwing around with kernel module drivers at any
>> other time either (i.e. via virNodeDeviceDetach(), right?
>>
>>
>> (I suppose once we have more fine-grained authorization of the libvirt
>> API, it might be possible for one user to call virNodeDeviceDetach() and
>> another could only start a domain with <hostdev managed='no'>, but
is
>> the "fine grainedness" really going to be down to the level of which
>> attributes are allowed in certain domain XML elements?)
>>
>>
>>> If we go down the route of extending <hostdev> to have support for
>>>
>>> <driver name="vfio|qemu"/>
>> Hehe. That's *almost" exactly the patchset I'm working on (I was
>> thinking of sending out just the config-change patch now to get it
>> reviewed early and avoid the last minute rush before the freeze).
>> However, since the legacy backend in this case is handled by the kernel
>> KVM module, I had named them "vfio" and "kvm" (I originally
thought to
>> use "qemu", but then considered it might confuse people into thinking
>> that it was something done by qemu in usermode).
>>
>>
>>> Then, this says that the virNodeDevice{Detach,ReAttach} methods need
>>> to have new variants which take a 'const char *drivername'
parameter.
>>>
>>> NB, the values of 'drivername' would match those used in the domain
>>> XML <driver> element - they would *not* be kernel module names.
>>>
>>> So we'd call
>>>
>>> virNodeDeviceDetachDriver(dev, "qemu");
>>> virNodeDeviceDetachDriver(dev, "vfio");
>> (of course with a "flags" argument at the end :-)
>>
>> That's a bit confusing, since "detach" in this case really means
"detach
>> it from whatever driver it's currently bound to, and bind it to the
>> 'vfio' driver". But just from reading the function name and args,
it
>> *seems* to mean "detach this device from the 'vfio' driver". On
the
>> other hand, I don't see a better alternative.
>>
>> And then what about the converse - virNodeDeviceAttachDriver(dev,
>> "vfio") - that really means "detach it from vfio, and attach it
to....
>> well actually *nowhere*! (that's what virNodeDeviceReAttach does - it's
>> not necessarily the inverse of virNodeDeviceDettach)
>>
>> Maybe we need a totally generic virNodeDeviceAttach() that allows us to
>> specify a stub driver name, a "real" driver name, or NULL (in which
case
>> it would just be unbound from the current driver)? But there again you
>> get back to the problem of specifying the actual name of a driver vs. an
>> abstracted name like "kvm" or "vfio" (the actual device to
bind to for
>> vfio is called "vfio-pci").
> How about this:
>
> int virNodeDeviceDetachFlags(virNodeDevicePtr dev,
> const char *stubDriver,
> unsigned int flags);
>
> stubDriver will be exactly equal to whatever is in the <driver
> name='x'/>, and can also be NULL, in which case the "hypervisor
default"
> will be used.
'stubDriver' implies that you're passing the kernel module name,
which this is not. It should be called 'driverName' to reflect
the XML attribute name.
Yes, you're right.
> In the meantime, the virPCIDevice object (used internally for the
list
> of active and inactice PCI devices) will be extended to keep track of
> both which stub driver is used, as well as the original driver (if any),
> so that we can then have:
>
>
> int virNodeDeviceReAttachFlags(virNodeDEvicePtr dev,
> unsigned int flags);
>
> (it won't need a driver/stubDriver arg, since that will be recorded when
> it's detached.)
>
> OR - we could make it more general-purpose by adding a const char
> *driver which can be NULL (in which case it's just restored to its
> original state), but also allows naming a specific driver.
Nah, we don't need to know the driver name here.
Okay. I didn't really see a need for it either, but wanted to bring it
up in case I was missing something.
In fact we don't
really need a new API at all, unless we have some need for the
flags parameter.
Good point. Guess I got carried away :-)