> From: Jason Gunthorpe <jgg@xxxxxxxxxx> > Sent: Monday, September 27, 2021 7:54 PM > > On Mon, Sep 27, 2021 at 09:42:58AM +0000, Tian, Kevin wrote: > > > From: Jason Gunthorpe <jgg@xxxxxxxxxx> > > > Sent: Wednesday, September 22, 2021 8:40 PM > > > > > > > > Ie the basic flow would see the driver core doing some: > > > > > > > > Just double confirm. Is there concern on having the driver core to > > > > call iommu functions? > > > > > > It is always an interesting question, but I'd say iommu is > > > foundantional to Linux and if it needs driver core help it shouldn't > > > be any different from PM, pinctl, or other subsystems that have > > > inserted themselves into the driver core. > > > > > > Something kind of like the below. > > > > > > If I recall, once it is done like this then the entire iommu notifier > > > infrastructure can be ripped out which is a lot of code. > > > > Currently vfio is the only user of this notifier mechanism. Now > > three events are handled in vfio_iommu_group_notifier(): > > > > NOTIFY_ADD_DEVICE: this is basically for some sanity check. suppose > > not required once we handle it cleanly in the iommu/driver core. > > > > NOTIFY_BOUND_DRIVER: the BUG_ON() logic to be fixed by this change. > > > > NOTIFY_UNBOUND_DRIVER: still needs some thoughts. Based on > > the comments the group->unbound_list is used to avoid breaking > > I have a patch series to delete the unbound_list, the scenario you > describe is handled by the device_lock() that's great! > > > diff --git a/drivers/base/dd.c b/drivers/base/dd.c > > index 68ea1f9..826a651 100644 > > +++ b/drivers/base/dd.c > > @@ -566,6 +566,10 @@ static int really_probe(struct device *dev, struct > device_driver *drv) > > goto done; > > } > > > > + ret = iommu_device_set_dma_hint(dev, drv->dma_hint); > > + if (ret) > > + return ret; > > I think for such a narrow usage you should not change the struct > device_driver. Just have pci_stub call a function to flip back to user > mode. Here we want to ensure that kernel dma should be blocked if the group is already marked for user-dma. If we just blindly do it for any driver at this point (as you commented earlier): + ret = iommu_set_kernel_ownership(dev); + if (ret) + return ret; how would pci-stub reach its function to indicate that it doesn't do dma and flip back? Do you envision a simpler policy that no driver can be bound to the group if it's already set for user-dma? what about vfio-pci itself? > > > +static int iommu_dev_viable(struct device *dev, void *data) > > +{ > > + enum dma_hint hint = *data; > > + struct device_driver *drv = READ_ONCE(dev->driver); > > Especially since this isn't locked properly or safe. I have the same worry when copying from vfio. Not sure how vfio gets safe with this approach... Thanks Kevin