RE: [RFC 03/20] vfio: Add vfio_[un]register_device()

From: Tian, Kevin
Date: Wed Sep 22 2021 - 05:23:42 EST


> From: Jason Gunthorpe <jgg@xxxxxxxxxx>
> Sent: Wednesday, September 22, 2021 8:54 AM
>
> On Tue, Sep 21, 2021 at 11:10:15PM +0000, Tian, Kevin wrote:
> > > From: Jason Gunthorpe <jgg@xxxxxxxxxx>
> > > Sent: Wednesday, September 22, 2021 12:01 AM
> > >
> > > On Sun, Sep 19, 2021 at 02:38:31PM +0800, Liu Yi L wrote:
> > > > With /dev/vfio/devices introduced, now a vfio device driver has three
> > > > options to expose its device to userspace:
> > > >
> > > > a) only legacy group interface, for devices which haven't been moved
> to
> > > > iommufd (e.g. platform devices, sw mdev, etc.);
> > > >
> > > > b) both legacy group interface and new device-centric interface, for
> > > > devices which supports iommufd but also wants to keep backward
> > > > compatibility (e.g. pci devices in this RFC);
> > > >
> > > > c) only new device-centric interface, for new devices which don't carry
> > > > backward compatibility burden (e.g. hw mdev/subdev with pasid);
> > >
> > > We shouldn't have 'b'? Where does it come from?
> >
> > a vfio-pci device can be opened via the existing group interface. if no b) it
> > means legacy vfio userspace can never use vfio-pci device any more
> > once the latter is moved to iommufd.
>
> Sorry, I think I ment a, which I guess you will say is SW mdev devices
>
> But even so, I think the way forward here is to still always expose
> the device /dev/vfio/devices/X and some devices may not allow iommufd
> usage initially.

After another thought this should work. Following your comments in
other places, we'll move the handling of BIND_IOMMUFD to vfio core
which then invoke .bind_iommufd() from the driver. For devices which
don't allow iommufd now, the callback is null thus an error is returned.

This leaves the userspace in a try-and-fail mode. It first opens the device
fd and iommufd, and then try to connect the two together. If failed then
fallback to the legacy group interface.

Then we don't need a) at all. and we can even avoid introducing new
vfio_[un]register_device() at this point. Just leverage existing
vfio_[un]register_group_dev() to cover b). new helpers can be introduced
later when c) is supported.

>
> Providing an ioctl to bind to a normal VFIO container or group might
> allow a reasonable fallback in userspace..
>

I didn't get this point though. An error in binding already allows the
user to fall back to the group path. Why do we need introduce another
ioctl to explicitly bind to container via the nongroup interface?

Thanks
Kevin