Thread (255 messages) 255 messages, 11 authors, 2021-10-29

Re: [RFC 06/20] iommu: Add iommu_device_init[exit]_user_dma interfaces

From: Jason Gunthorpe <jgg@nvidia.com>
Date: 2021-09-27 11:53:49
Also in: linux-iommu, lkml

On Mon, Sep 27, 2021 at 09:42:58AM +0000, Tian, Kevin wrote:
quoted
From: Jason Gunthorpe <jgg@nvidia.com>
Sent: Wednesday, September 22, 2021 8:40 PM
quoted
quoted
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()
quoted hunk ↗ jump to hunk
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.
+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.

Jason
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help