On Wed, Mar 11, 2026 at 09:08:47PM +0200, Leon Romanovsky wrote:
> From: Leon Romanovsky <[email protected]>
>
> The mapping buffers which carry this attribute require DMA coherent system.
> This means that they can't take SWIOTLB path, can perform CPU cache overlap
> and doesn't perform cache flushing.
>
> Signed-off-by: Leon Romanovsky <[email protected]>
> ---
> Documentation/core-api/dma-attributes.rst | 12 ++++++++++++
> include/linux/dma-mapping.h | 7 +++++++
> include/trace/events/dma.h | 3 ++-
> kernel/dma/debug.c | 3 ++-
> kernel/dma/mapping.c | 6 ++++++
> 5 files changed, 29 insertions(+), 2 deletions(-)
>
> diff --git a/Documentation/core-api/dma-attributes.rst
> b/Documentation/core-api/dma-attributes.rst
> index 48cfe86cc06d7..69d094f144c70 100644
> --- a/Documentation/core-api/dma-attributes.rst
> +++ b/Documentation/core-api/dma-attributes.rst
> @@ -163,3 +163,15 @@ data corruption.
>
> All mappings that share a cache line must set this attribute to suppress DMA
> debug warnings about overlapping mappings.
> +
> +DMA_ATTR_REQUIRE_COHERENT
> +-------------------------
> +
> +The mapping buffers which carry this attribute require DMA coherent system.
> This means
> +that they can't take SWIOTLB path, can perform CPU cache overlap and doesn't
> perform
> +cache flushing.
DMA mapping requests with the DMA_ATTR_REQUIRE_COHERENT fail on any
system where SWIOTLB or cache management is required. This should only
be used to support uAPI designs that require continuous HW DMA
coherence with userspace processes, for example RDMA and DRM. At a
minimum the memory being mapped must be userspace memory from
pin_user_pages() or similar.
Drivers should consider using dma_mmap_pages() instead of this
interface when building their uAPIs, when possible.
It must never be used in an in-kernel driver that only works with
kernal memory.
> @@ -164,6 +164,9 @@ dma_addr_t dma_map_phys(struct device *dev, phys_addr_t
> phys, size_t size,
> if (WARN_ON_ONCE(!dev->dma_mask))
> return DMA_MAPPING_ERROR;
>
> + if (!dev_is_dma_coherent(dev) && (attrs & DMA_ATTR_REQUIRE_COHERENT))
> + return DMA_MAPPING_ERROR;
This doesn't capture enough conditions.. is_swiotlb_force_bounce(),
dma_kmalloc_needs_bounce(), dma_capable(), etc all need to be blocked
too
So check it inside swiotlb_map() too, and maybe shift the above
into the existing branches:
if (!dev_is_dma_coherent(dev) &&
!(attrs & (DMA_ATTR_SKIP_CPU_SYNC | DMA_ATTR_MMIO)))
arch_sync_dma_for_device(phys, size, dir);
Jason