[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20210929130521.738c56ed.alex.williamson@redhat.com>
Date: Wed, 29 Sep 2021 13:05:21 -0600
From: Alex Williamson <alex.williamson@...hat.com>
To: David Gibson <david@...son.dropbear.id.au>
Cc: Liu Yi L <yi.l.liu@...el.com>, jgg@...dia.com, hch@....de,
jasowang@...hat.com, joro@...tes.org, jean-philippe@...aro.org,
kevin.tian@...el.com, parav@...lanox.com, lkml@...ux.net,
pbonzini@...hat.com, lushenming@...wei.com, eric.auger@...hat.com,
corbet@....net, ashok.raj@...el.com, yi.l.liu@...ux.intel.com,
jun.j.tian@...el.com, hao.wu@...el.com, dave.jiang@...el.com,
jacob.jun.pan@...ux.intel.com, kwankhede@...dia.com,
robin.murphy@....com, kvm@...r.kernel.org,
iommu@...ts.linux-foundation.org, dwmw2@...radead.org,
linux-kernel@...r.kernel.org, baolu.lu@...ux.intel.com,
nicolinc@...dia.com
Subject: Re: [RFC 02/20] vfio: Add device class for /dev/vfio/devices
On Wed, 29 Sep 2021 12:08:59 +1000
David Gibson <david@...son.dropbear.id.au> wrote:
> 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@...el.com>
> [snip]
>
> > +static bool vfio_device_in_container(struct vfio_device *device)
> > +{
> > + return !!(device->group && device->group->container);
>
> You don't need !! here. && is already a logical operation, so returns
> a valid bool.
>
> > +}
> > +
> > static int vfio_device_fops_release(struct inode *inode, struct file *filep)
> > {
> > struct vfio_device *device = filep->private_data;
> > @@ -1560,7 +1691,16 @@ static int vfio_device_fops_release(struct inode *inode, struct file *filep)
> >
> > module_put(device->dev->driver->owner);
> >
> > - vfio_group_try_dissolve_container(device->group);
> > + if (vfio_device_in_container(device)) {
> > + vfio_group_try_dissolve_container(device->group);
> > + } else {
> > + atomic_dec(&device->opened);
> > + if (device->group) {
> > + mutex_lock(&device->group->opened_lock);
> > + device->group->opened--;
> > + mutex_unlock(&device->group->opened_lock);
> > + }
> > + }
> >
> > vfio_device_put(device);
> >
> > @@ -1613,6 +1753,7 @@ static int vfio_device_fops_mmap(struct file *filep, struct vm_area_struct *vma)
> >
> > static const struct file_operations vfio_device_fops = {
> > .owner = THIS_MODULE,
> > + .open = vfio_device_fops_open,
> > .release = vfio_device_fops_release,
> > .read = vfio_device_fops_read,
> > .write = vfio_device_fops_write,
> > @@ -2295,6 +2436,52 @@ static struct miscdevice vfio_dev = {
> > .mode = S_IRUGO | S_IWUGO,
> > };
> >
> > +static char *vfio_device_devnode(struct device *dev, umode_t *mode)
> > +{
> > + return kasprintf(GFP_KERNEL, "vfio/devices/%s", dev_name(dev));
>
> Others have pointed out some problems with the use of dev_name()
> here. I'll add that I think you'll make things much easier if instead
> of using one huge "devices" subdir, you use a separate subdir for each
> vfio sub-driver (so, one for PCI, one for each type of mdev, one for
> platform, etc.). That should make avoiding name conflicts a lot simpler.
It seems like this is unnecessary if we use the vfioX naming approach.
Conflicts are trivial to ignore if we don't involve dev_name() and
looking for the correct major:minor chardev in the correct subdirectory
seems like a hassle for userspace. Thanks,
Alex
Powered by blists - more mailing lists