lkml.org 
[lkml]   [2021]   [Sep]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [RFC 02/20] vfio: Add device class for /dev/vfio/devices
    On Sun, Sep 19, 2021 at 02:38:30PM +0800, Liu Yi L wrote:
    > This patch introduces a new interface (/dev/vfio/devices/$DEVICE) for
    > userspace to directly open a vfio device w/o relying on container/group
    > (/dev/vfio/$GROUP). Anything related to group is now hidden behind
    > iommufd (more specifically in iommu core by this RFC) in a device-centric
    > manner.
    >
    > In case a device is exposed in both legacy and new interfaces (see next
    > patch for how to decide it), this patch also ensures that when the device
    > is already opened via one interface then the other one must be blocked.
    >
    > Signed-off-by: Liu Yi L <yi.l.liu@intel.com>
    > ---
    > drivers/vfio/vfio.c | 228 +++++++++++++++++++++++++++++++++++++++----
    > include/linux/vfio.h | 2 +
    > 2 files changed, 213 insertions(+), 17 deletions(-)

    > +static int vfio_init_device_class(void)
    > +{
    > + int ret;
    > +
    > + mutex_init(&vfio.device_lock);
    > + idr_init(&vfio.device_idr);
    > +
    > + /* /dev/vfio/devices/$DEVICE */
    > + vfio.device_class = class_create(THIS_MODULE, "vfio-device");
    > + if (IS_ERR(vfio.device_class))
    > + return PTR_ERR(vfio.device_class);
    > +
    > + vfio.device_class->devnode = vfio_device_devnode;
    > +
    > + ret = alloc_chrdev_region(&vfio.device_devt, 0, MINORMASK + 1, "vfio-device");
    > + if (ret)
    > + goto err_alloc_chrdev;
    > +
    > + cdev_init(&vfio.device_cdev, &vfio_device_fops);
    > + ret = cdev_add(&vfio.device_cdev, vfio.device_devt, MINORMASK + 1);
    > + if (ret)
    > + goto err_cdev_add;

    Huh? This is not how cdevs are used. This patch needs rewriting.

    The struct vfio_device should gain a 'struct device' and 'struct cdev'
    as non-pointer members

    vfio register path should end up doing cdev_device_add() for each
    vfio_device

    vfio_unregister path should do cdev_device_del()

    No idr should be needed, an ida is used to allocate minor numbers

    The struct device release function should trigger a kfree which
    requires some reworking of the callers

    vfio_init_group_dev() should do a device_initialize()
    vfio_uninit_group_dev() should do a device_put()

    The opened atomic is aweful. A newly created fd should start in a
    state where it has a disabled fops

    The only thing the disabled fops can do is register the device to the
    iommu fd. When successfully registered the device gets the normal fops.

    The registration steps should be done under a normal lock inside the
    vfio_device. If a vfio_device is already registered then further
    registration should fail.

    Getting the device fd via the group fd triggers the same sequence as
    above.

    Jason

    \
     
     \ /
      Last update: 2021-09-21 17:57    [W:2.313 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site