Thread (49 messages) 49 messages, 9 authors, 2017-10-15

Re: [PATCH v8] dma-mapping: introduce dma_get_iommu_domain()

From: Dan Williams <hidden>
Date: 2017-10-09 17:32:10
Also in: linux-api, linux-fsdevel, linux-mm, linux-xfs, nvdimm

On Mon, Oct 9, 2017 at 3:37 AM, Robin Murphy [off-list ref] wrote:
Hi Dan,

On 08/10/17 04:45, Dan Williams wrote:
quoted
Add a dma-mapping api helper to retrieve the generic iommu_domain for a device.
The motivation for this interface is making RDMA transfers to DAX mappings
safe. If the DAX file's block map changes we need to be to reliably stop
accesses to blocks that have been freed or re-assigned to a new file.
...which is also going to require some way to force the IOMMU drivers
(on x86 at least) to do a fully-synchronous unmap, instead of just
throwing the IOVA onto a flush queue to invalidate the TLBs at some
point in the future.
Isn't that the difference between iommu_unmap() and
iommu_unmap_fast()? As far as I can tell amd-iommu and intel-iommu
both flush iotlbs on iommu_unmap() and don't support fast unmaps.
Assuming of course that there's an IOMMU both
present and performing DMA translation in the first place.
That's why I want to call through the dma api to see if the iommu is
being used to satisfy dma mappings.
quoted
With the
iommu_domain and a callback from the DAX filesystem the kernel can safely
revoke access to a DMA device. The process that performed the RDMA memory
registration is also notified of this revocation event, but the kernel can not
otherwise be in the position of waiting for userspace to quiesce the device.
OK, but why reinvent iommu_get_domain_for_dev()?
How do I know if the iommu returned from that routine is the one being
used for dma mapping operations for the device? Specifically, how
would I discover that the result of dma_map_sg() can be passed as an
IOVA range to iommu_unmap()?
quoted
Since PMEM+DAX is currently only enabled for x86, we only update the x86
iommu drivers.
Note in particular that those two drivers happen to be the *only* place
this approach could work - everyone else is going to have to fall back
to the generic IOMMU API function anyway.
I want to make this functionality generic, but I'm not familiar with
the iommu sub-system. How are dma mapping operations routed to the
iommu driver in those other imlementations?
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help