The Linux Kernel Mailing List
 help / color / mirror / Atom feed
* Re: [PATCH v2 3/6] dma-debug: Remove unused DMA attribute parameter
       [not found]   ` <20260501-dma-attrs-debug-v2-3-8dbac75cd501@nvidia.com>
@ 2026-05-06 17:47     ` Samiullah Khawaja
  0 siblings, 0 replies; 7+ messages in thread
From: Samiullah Khawaja @ 2026-05-06 17:47 UTC (permalink / raw)
  To: Leon Romanovsky
  Cc: Marek Szyprowski, Robin Murphy, Jon Mason, Dave Jiang,
	Allen Hubbe, iommu, linux-kernel, ntb

On Fri, May 01, 2026 at 09:35:07AM +0300, Leon Romanovsky wrote:
>From: Leon Romanovsky <leonro@nvidia.com>
>
>debug_dma_alloc_pages() always receives a DMA attribute value of 0,
>because dma_alloc_pages() never receives any attributes from its callers.
>As preparation for upcoming patches, remove this unused attribute from
>the debug routine.
>
>Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
>---
> kernel/dma/debug.c   | 5 ++---
> kernel/dma/debug.h   | 6 ++----
> kernel/dma/mapping.c | 2 +-
> 3 files changed, 5 insertions(+), 8 deletions(-)
>
>diff --git a/kernel/dma/debug.c b/kernel/dma/debug.c
>index 1a725edbbbf6a..3b53495337f5c 100644
>--- a/kernel/dma/debug.c
>+++ b/kernel/dma/debug.c
>@@ -1567,8 +1567,7 @@ void debug_dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg,
>
> void debug_dma_alloc_pages(struct device *dev, struct page *page,
> 			   size_t size, int direction,
>-			   dma_addr_t dma_addr,
>-			   unsigned long attrs)
>+			   dma_addr_t dma_addr)
> {
> 	struct dma_debug_entry *entry;
>
>@@ -1586,7 +1585,7 @@ void debug_dma_alloc_pages(struct device *dev, struct page *page,
> 	entry->dev_addr  = dma_addr;
> 	entry->direction = direction;
>
>-	add_dma_entry(entry, attrs);
>+	add_dma_entry(entry, 0);
> }
>
> void debug_dma_free_pages(struct device *dev, struct page *page,
>diff --git a/kernel/dma/debug.h b/kernel/dma/debug.h
>index da7be0bddcf67..24b8610850fbd 100644
>--- a/kernel/dma/debug.h
>+++ b/kernel/dma/debug.h
>@@ -47,8 +47,7 @@ extern void debug_dma_sync_sg_for_device(struct device *dev,
> 					 int nelems, int direction);
> extern void debug_dma_alloc_pages(struct device *dev, struct page *page,
> 				  size_t size, int direction,
>-				  dma_addr_t dma_addr,
>-				  unsigned long attrs);
>+				  dma_addr_t dma_addr);
> extern void debug_dma_free_pages(struct device *dev, struct page *page,
> 				 size_t size, int direction,
> 				 dma_addr_t dma_addr);
>@@ -113,8 +112,7 @@ static inline void debug_dma_sync_sg_for_device(struct device *dev,
>
> static inline void debug_dma_alloc_pages(struct device *dev, struct page *page,
> 					 size_t size, int direction,
>-					 dma_addr_t dma_addr,
>-					 unsigned long attrs)
>+					 dma_addr_t dma_addr)
> {
> }
>
>diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c
>index 23ed8eb9233e5..6cbefbd4158c8 100644
>--- a/kernel/dma/mapping.c
>+++ b/kernel/dma/mapping.c
>@@ -733,7 +733,7 @@ struct page *dma_alloc_pages(struct device *dev, size_t size,
> 	if (page) {
> 		trace_dma_alloc_pages(dev, page_to_virt(page), *dma_handle,
> 				      size, dir, gfp, 0);
>-		debug_dma_alloc_pages(dev, page, size, dir, *dma_handle, 0);
>+		debug_dma_alloc_pages(dev, page, size, dir, *dma_handle);
> 	} else {
> 		trace_dma_alloc_pages(dev, NULL, 0, size, dir, gfp, 0);
> 	}
>
>-- 
>2.53.0
>
>

Reviewed-by: Samiullah Khawaja <skhawaja@google.com>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 4/6] dma-debug: Record DMA attributes in debug entry
       [not found]   ` <20260501-dma-attrs-debug-v2-4-8dbac75cd501@nvidia.com>
@ 2026-05-06 17:53     ` Samiullah Khawaja
  0 siblings, 0 replies; 7+ messages in thread
From: Samiullah Khawaja @ 2026-05-06 17:53 UTC (permalink / raw)
  To: Leon Romanovsky
  Cc: Marek Szyprowski, Robin Murphy, Jon Mason, Dave Jiang,
	Allen Hubbe, iommu, linux-kernel, ntb

On Fri, May 01, 2026 at 09:35:08AM +0300, Leon Romanovsky wrote:
>From: Leon Romanovsky <leonro@nvidia.com>
>
>To enable reliable comparison of DMA attributes between map and
>unmap operations, store the attribute value in dma_debug_entry.
>
>Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
>---
> kernel/dma/debug.c | 48 +++++++++++++++++++++++++++++-------------------
> 1 file changed, 29 insertions(+), 19 deletions(-)
>
>diff --git a/kernel/dma/debug.c b/kernel/dma/debug.c
>index 3b53495337f5c..f07e6a1e9fbab 100644
>--- a/kernel/dma/debug.c
>+++ b/kernel/dma/debug.c
>@@ -63,7 +63,7 @@ enum map_err_types {
>  * @sg_mapped_ents: 'mapped_ents' from dma_map_sg
>  * @paddr: physical start address of the mapping
>  * @map_err_type: track whether dma_mapping_error() was checked
>- * @is_cache_clean: driver promises not to write to buffer while mapped
>+ * @attrs: dma attributes
>  * @stack_len: number of backtrace entries in @stack_entries
>  * @stack_entries: stack of backtrace history
>  */
>@@ -78,7 +78,7 @@ struct dma_debug_entry {
> 	int		 sg_mapped_ents;
> 	phys_addr_t	 paddr;
> 	enum map_err_types map_err_type;
>-	bool		 is_cache_clean;
>+	unsigned long	 attrs;
> #ifdef CONFIG_STACKTRACE
> 	unsigned int	stack_len;
> 	unsigned long	stack_entries[DMA_DEBUG_STACKTRACE_ENTRIES];
>@@ -478,6 +478,9 @@ static int active_cacheline_insert(struct dma_debug_entry *entry,
> 				   bool *overlap_cache_clean)
> {
> 	phys_addr_t cln = to_cacheline_number(entry);
>+	bool is_cache_clean = entry->attrs &
>+			      (DMA_ATTR_DEBUGGING_IGNORE_CACHELINES |
>+			       DMA_ATTR_REQUIRE_COHERENT);
> 	unsigned long flags;
> 	int rc;
>
>@@ -495,12 +498,15 @@ static int active_cacheline_insert(struct dma_debug_entry *entry,
> 	if (rc == -EEXIST) {
> 		struct dma_debug_entry *existing;
>
>-		active_cacheline_inc_overlap(cln, entry->is_cache_clean);
>+		active_cacheline_inc_overlap(cln, is_cache_clean);
> 		existing = radix_tree_lookup(&dma_active_cacheline, cln);
> 		/* A lookup failure here after we got -EEXIST is unexpected. */
> 		WARN_ON(!existing);
> 		if (existing)
>-			*overlap_cache_clean = existing->is_cache_clean;
>+			*overlap_cache_clean =
>+				existing->attrs &
>+				(DMA_ATTR_DEBUGGING_IGNORE_CACHELINES |
>+				 DMA_ATTR_REQUIRE_COHERENT);
> 	}
> 	spin_unlock_irqrestore(&radix_lock, flags);
>
>@@ -544,12 +550,13 @@ void debug_dma_dump_mappings(struct device *dev)
> 			if (!dev || dev == entry->dev) {
> 				cln = to_cacheline_number(entry);
> 				dev_info(entry->dev,
>-					 "%s idx %d P=%pa D=%llx L=%llx cln=%pa %s %s\n",
>+					 "%s idx %d P=%pa D=%llx L=%llx cln=%pa %s %s attrs=0x%lx\n",
> 					 type2name[entry->type], idx,
> 					 &entry->paddr, entry->dev_addr,
> 					 entry->size, &cln,
> 					 dir2name[entry->direction],
>-					 maperr2str[entry->map_err_type]);
>+					 maperr2str[entry->map_err_type],
>+					 entry->attrs);
> 			}
> 		}
> 		spin_unlock_irqrestore(&bucket->lock, flags);
>@@ -575,14 +582,15 @@ static int dump_show(struct seq_file *seq, void *v)
> 		list_for_each_entry(entry, &bucket->list, list) {
> 			cln = to_cacheline_number(entry);
> 			seq_printf(seq,
>-				   "%s %s %s idx %d P=%pa D=%llx L=%llx cln=%pa %s %s\n",
>+				   "%s %s %s idx %d P=%pa D=%llx L=%llx cln=%pa %s %s attrs=0x%lx\n",
> 				   dev_driver_string(entry->dev),
> 				   dev_name(entry->dev),
> 				   type2name[entry->type], idx,
> 				   &entry->paddr, entry->dev_addr,
> 				   entry->size, &cln,
> 				   dir2name[entry->direction],
>-				   maperr2str[entry->map_err_type]);
>+				   maperr2str[entry->map_err_type],
>+				   entry->attrs);
> 		}
> 		spin_unlock_irqrestore(&bucket->lock, flags);
> 	}
>@@ -594,16 +602,14 @@ DEFINE_SHOW_ATTRIBUTE(dump);
>  * Wrapper function for adding an entry to the hash.
>  * This function takes care of locking itself.
>  */
>-static void add_dma_entry(struct dma_debug_entry *entry, unsigned long attrs)
>+static void add_dma_entry(struct dma_debug_entry *entry)
> {
>+	unsigned long attrs = entry->attrs;
> 	bool overlap_cache_clean;
> 	struct hash_bucket *bucket;
> 	unsigned long flags;
> 	int rc;
>
>-	entry->is_cache_clean = attrs & (DMA_ATTR_DEBUGGING_IGNORE_CACHELINES |
>-					 DMA_ATTR_REQUIRE_COHERENT);
>-
> 	bucket = get_hash_bucket(entry, &flags);
> 	hash_bucket_add(bucket, entry);
> 	put_hash_bucket(bucket, flags);
>@@ -612,9 +618,10 @@ static void add_dma_entry(struct dma_debug_entry *entry, unsigned long attrs)
> 	if (rc == -ENOMEM) {
> 		pr_err_once("cacheline tracking ENOMEM, dma-debug disabled\n");
> 		global_disable = true;
>-	} else if (rc == -EEXIST &&
>-		   !(attrs & DMA_ATTR_SKIP_CPU_SYNC) &&
>-		   !(entry->is_cache_clean && overlap_cache_clean) &&
>+	} else if (rc == -EEXIST && !(attrs & DMA_ATTR_SKIP_CPU_SYNC) &&
>+		   !(attrs & (DMA_ATTR_DEBUGGING_IGNORE_CACHELINES |
>+			      DMA_ATTR_REQUIRE_COHERENT) &&
>+		     overlap_cache_clean) &&
> 		   dma_get_cache_alignment() >= L1_CACHE_BYTES &&
> 		   !(IS_ENABLED(CONFIG_DMA_BOUNCE_UNALIGNED_KMALLOC) &&
> 		     is_swiotlb_active(entry->dev))) {
>@@ -1250,6 +1257,7 @@ void debug_dma_map_phys(struct device *dev, phys_addr_t phys, size_t size,
> 	entry->size      = size;
> 	entry->direction = direction;
> 	entry->map_err_type = MAP_ERR_NOT_CHECKED;
>+	entry->attrs     = attrs;
>
> 	if (!(attrs & DMA_ATTR_MMIO)) {
> 		check_for_stack(dev, phys);
>@@ -1258,7 +1266,7 @@ void debug_dma_map_phys(struct device *dev, phys_addr_t phys, size_t size,
> 			check_for_illegal_area(dev, phys_to_virt(phys), size);
> 	}
>
>-	add_dma_entry(entry, attrs);
>+	add_dma_entry(entry);
> }
>
> void debug_dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
>@@ -1345,10 +1353,11 @@ void debug_dma_map_sg(struct device *dev, struct scatterlist *sg,
> 		entry->direction      = direction;
> 		entry->sg_call_ents   = nents;
> 		entry->sg_mapped_ents = mapped_ents;
>+		entry->attrs          = attrs;
>
> 		check_sg_segment(dev, s);
>
>-		add_dma_entry(entry, attrs);
>+		add_dma_entry(entry);
> 	}
> }
>
>@@ -1440,8 +1449,9 @@ void debug_dma_alloc_coherent(struct device *dev, size_t size,

Unrelated to this patch/series, but I am wondering whether we should
rename this function to debug_dma_alloc_attrs() as it is called from
dma_alloc_attrs().
> 	entry->size      = size;
> 	entry->dev_addr  = dma_addr;
> 	entry->direction = DMA_BIDIRECTIONAL;
>+	entry->attrs     = attrs;
>
>-	add_dma_entry(entry, attrs);
>+	add_dma_entry(entry);
> }
>
> void debug_dma_free_coherent(struct device *dev, size_t size,
>@@ -1585,7 +1595,7 @@ void debug_dma_alloc_pages(struct device *dev, struct page *page,
> 	entry->dev_addr  = dma_addr;
> 	entry->direction = direction;
>
>-	add_dma_entry(entry, 0);
>+	add_dma_entry(entry);
> }
>
> void debug_dma_free_pages(struct device *dev, struct page *page,
>
>-- 
>2.53.0
>
>

Reviewed-by: Samiullah Khawaja <skhawaja@google.com>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 5/6] dma-debug: Feed DMA attribute for unmapping flows too
       [not found]   ` <20260501-dma-attrs-debug-v2-5-8dbac75cd501@nvidia.com>
@ 2026-05-06 18:06     ` Samiullah Khawaja
  0 siblings, 0 replies; 7+ messages in thread
From: Samiullah Khawaja @ 2026-05-06 18:06 UTC (permalink / raw)
  To: Leon Romanovsky
  Cc: Marek Szyprowski, Robin Murphy, Jon Mason, Dave Jiang,
	Allen Hubbe, iommu, linux-kernel, ntb

On Fri, May 01, 2026 at 09:35:09AM +0300, Leon Romanovsky wrote:
>From: Leon Romanovsky <leonro@nvidia.com>
>
>There are multiple unmapping flows which didn't provide DMA attributes,
>which limited DMA debug code to compare the mapping and unmapping
>attributes. Let's fix it.
>
>Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
>---
> kernel/dma/debug.c   | 13 ++++++++-----
> kernel/dma/debug.h   | 19 +++++++++++--------
> kernel/dma/mapping.c |  8 ++++----
> 3 files changed, 23 insertions(+), 17 deletions(-)
>
>diff --git a/kernel/dma/debug.c b/kernel/dma/debug.c
>index f07e6a1e9fbab..3dfed51c3d9aa 100644
>--- a/kernel/dma/debug.c
>+++ b/kernel/dma/debug.c
>@@ -1307,8 +1307,8 @@ void debug_dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
> }
> EXPORT_SYMBOL(debug_dma_mapping_error);
>
>-void debug_dma_unmap_phys(struct device *dev, dma_addr_t dma_addr,
>-			  size_t size, int direction)
>+void debug_dma_unmap_phys(struct device *dev, dma_addr_t dma_addr, size_t size,
>+			  int direction, unsigned long attrs)
> {
> 	struct dma_debug_entry ref = {
> 		.type           = dma_debug_phy,
>@@ -1316,6 +1316,7 @@ void debug_dma_unmap_phys(struct device *dev, dma_addr_t dma_addr,
> 		.dev_addr       = dma_addr,
> 		.size           = size,
> 		.direction      = direction,
>+		.attrs          = attrs,
> 	};
>
> 	if (unlikely(dma_debug_disabled()))
>@@ -1381,7 +1382,7 @@ static int get_nr_mapped_entries(struct device *dev,
> }
>
> void debug_dma_unmap_sg(struct device *dev, struct scatterlist *sglist,
>-			int nelems, int dir)
>+			int nelems, int dir, unsigned long attrs)
> {
> 	struct scatterlist *s;
> 	int mapped_ents = 0, i;
>@@ -1399,6 +1400,7 @@ void debug_dma_unmap_sg(struct device *dev, struct scatterlist *sglist,
> 			.size           = sg_dma_len(s),
> 			.direction      = dir,
> 			.sg_call_ents   = nelems,
>+			.attrs          = attrs,
> 		};
>
> 		if (mapped_ents && i >= mapped_ents)
>@@ -1454,8 +1456,8 @@ void debug_dma_alloc_coherent(struct device *dev, size_t size,
> 	add_dma_entry(entry);
> }
>
>-void debug_dma_free_coherent(struct device *dev, size_t size,
>-			 void *virt, dma_addr_t dma_addr)
>+void debug_dma_free_coherent(struct device *dev, size_t size, void *virt,
>+			     dma_addr_t dma_addr, unsigned long attrs)
> {
> 	struct dma_debug_entry ref = {
> 		.type           = dma_debug_coherent,
>@@ -1463,6 +1465,7 @@ void debug_dma_free_coherent(struct device *dev, size_t size,
> 		.dev_addr       = dma_addr,
> 		.size           = size,
> 		.direction      = DMA_BIDIRECTIONAL,
>+		.attrs          = attrs,
> 	};
>
> 	/* handle vmalloc and linear addresses */
>diff --git a/kernel/dma/debug.h b/kernel/dma/debug.h
>index 24b8610850fbd..13e384633c32a 100644
>--- a/kernel/dma/debug.h
>+++ b/kernel/dma/debug.h
>@@ -14,21 +14,22 @@ extern void debug_dma_map_phys(struct device *dev, phys_addr_t phys,
> 			       unsigned long attrs);
>
> extern void debug_dma_unmap_phys(struct device *dev, dma_addr_t addr,
>-				 size_t size, int direction);
>+				 size_t size, int direction,
>+				 unsigned long attrs);
>
> extern void debug_dma_map_sg(struct device *dev, struct scatterlist *sg,
> 			     int nents, int mapped_ents, int direction,
> 			     unsigned long attrs);
>
> extern void debug_dma_unmap_sg(struct device *dev, struct scatterlist *sglist,
>-			       int nelems, int dir);
>+			       int nelems, int dir, unsigned long attrs);
>
> extern void debug_dma_alloc_coherent(struct device *dev, size_t size,
> 				     dma_addr_t dma_addr, void *virt,
> 				     unsigned long attrs);
>
>-extern void debug_dma_free_coherent(struct device *dev, size_t size,
>-				    void *virt, dma_addr_t addr);
>+extern void debug_dma_free_coherent(struct device *dev, size_t size, void *virt,
>+				    dma_addr_t addr, unsigned long attrs);
>
> extern void debug_dma_sync_single_for_cpu(struct device *dev,
> 					  dma_addr_t dma_handle, size_t size,
>@@ -59,7 +60,8 @@ static inline void debug_dma_map_phys(struct device *dev, phys_addr_t phys,
> }
>
> static inline void debug_dma_unmap_phys(struct device *dev, dma_addr_t addr,
>-					size_t size, int direction)
>+					size_t size, int direction,
>+					unsigned long attrs)
> {
> }
>
>@@ -70,8 +72,8 @@ static inline void debug_dma_map_sg(struct device *dev, struct scatterlist *sg,
> }
>
> static inline void debug_dma_unmap_sg(struct device *dev,
>-				      struct scatterlist *sglist,
>-				      int nelems, int dir)
>+				      struct scatterlist *sglist, int nelems,
>+				      int dir, unsigned long attrs)
> {
> }
>
>@@ -82,7 +84,8 @@ static inline void debug_dma_alloc_coherent(struct device *dev, size_t size,
> }
>
> static inline void debug_dma_free_coherent(struct device *dev, size_t size,
>-					   void *virt, dma_addr_t addr)
>+					   void *virt, dma_addr_t addr,
>+					   unsigned long attrs)
> {
> }
>
>diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c
>index 6cbefbd4158c8..f010b3cc0ece4 100644
>--- a/kernel/dma/mapping.c
>+++ b/kernel/dma/mapping.c
>@@ -225,7 +225,7 @@ void dma_unmap_phys(struct device *dev, dma_addr_t addr, size_t size,
> 	else if (ops->unmap_phys)
> 		ops->unmap_phys(dev, addr, size, dir, attrs);
> 	trace_dma_unmap_phys(dev, addr, size, dir, attrs);
>-	debug_dma_unmap_phys(dev, addr, size, dir);
>+	debug_dma_unmap_phys(dev, addr, size, dir, attrs);
> }
> EXPORT_SYMBOL_GPL(dma_unmap_phys);
>
>@@ -351,7 +351,7 @@ void dma_unmap_sg_attrs(struct device *dev, struct scatterlist *sg,
>
> 	BUG_ON(!valid_dma_direction(dir));
> 	trace_dma_unmap_sg(dev, sg, nents, dir, attrs);
>-	debug_dma_unmap_sg(dev, sg, nents, dir);
>+	debug_dma_unmap_sg(dev, sg, nents, dir, attrs);
> 	if (dma_map_direct(dev, ops) ||
> 	    arch_dma_unmap_sg_direct(dev, sg, nents))
> 		dma_direct_unmap_sg(dev, sg, nents, dir, attrs);
>@@ -693,7 +693,7 @@ void dma_free_attrs(struct device *dev, size_t size, void *cpu_addr,
> 	if (!cpu_addr)
> 		return;
>
>-	debug_dma_free_coherent(dev, size, cpu_addr, dma_handle);
>+	debug_dma_free_coherent(dev, size, cpu_addr, dma_handle, attrs);
> 	if (dma_alloc_direct(dev, ops) || arch_dma_free_direct(dev, dma_handle))
> 		dma_direct_free(dev, size, cpu_addr, dma_handle, attrs);
> 	else if (use_dma_iommu(dev))
>@@ -840,7 +840,7 @@ void dma_free_noncontiguous(struct device *dev, size_t size,
> 		struct sg_table *sgt, enum dma_data_direction dir)
> {
> 	trace_dma_free_sgt(dev, sgt, size, dir);
>-	debug_dma_unmap_sg(dev, sgt->sgl, sgt->orig_nents, dir);
>+	debug_dma_unmap_sg(dev, sgt->sgl, sgt->orig_nents, dir, 0);
>
> 	if (use_dma_iommu(dev))
> 		iommu_dma_free_noncontiguous(dev, size, sgt, dir);
>
>-- 
>2.53.0
>
>

Reviewed-by: Samiullah Khawaja <skhawaja@google.com>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 6/6] dma-debug: Ensure mappings are created and released with matching attributes
       [not found]   ` <20260501-dma-attrs-debug-v2-6-8dbac75cd501@nvidia.com>
@ 2026-05-06 18:16     ` Samiullah Khawaja
  0 siblings, 0 replies; 7+ messages in thread
From: Samiullah Khawaja @ 2026-05-06 18:16 UTC (permalink / raw)
  To: Leon Romanovsky
  Cc: Marek Szyprowski, Robin Murphy, Jon Mason, Dave Jiang,
	Allen Hubbe, iommu, linux-kernel, ntb

On Fri, May 01, 2026 at 09:35:10AM +0300, Leon Romanovsky wrote:
>From: Leon Romanovsky <leonro@nvidia.com>
>
>The DMA API expects that callers use the same attributes when mapping
>and unmapping. Add tracking to verify this and catch mismatches.
>
>Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
>---
> kernel/dma/debug.c | 23 +++++++++++++++++++++++
> 1 file changed, 23 insertions(+)
>
>diff --git a/kernel/dma/debug.c b/kernel/dma/debug.c
>index 3dfed51c3d9aa..c38efc1ac8d6c 100644
>--- a/kernel/dma/debug.c
>+++ b/kernel/dma/debug.c
>@@ -1074,6 +1074,29 @@ static void check_unmap(struct dma_debug_entry *ref)
> 			   type2name[entry->type]);
> 	}
>
>+	/*
>+	 * This may be no bug in reality - but DMA API still expects
>+	 * that entry is unmapped with same attributes as it was mapped.
>+	 *
>+	 * DMA_ATTR_UNMAP_VALID lists the attributes that must be identical
>+	 * between map and unmap. Any attribute outside this set (e.g.
>+	 * DMA_ATTR_NO_WARN, DMA_ATTR_SKIP_CPU_SYNC) is allowed to differ.
>+	 */
>+#define DMA_ATTR_UNMAP_VALID                                               \
>+	(DMA_ATTR_NO_KERNEL_MAPPING | DMA_ATTR_FORCE_CONTIGUOUS |          \
>+	 DMA_ATTR_MMIO | DMA_ATTR_REQUIRE_COHERENT | DMA_ATTR_PRIVILEGED | \
>+	 DMA_ATTR_CC_SHARED)
>+	if ((ref->attrs & DMA_ATTR_UNMAP_VALID) !=
>+	    (entry->attrs & DMA_ATTR_UNMAP_VALID)) {
>+		err_printk(ref->dev, entry,
>+			   "device driver frees "
>+			   "DMA memory with different attributes "
>+			   "[device address=0x%016llx] [size=%llu bytes] "
>+			   "[mapped with 0x%lx] [unmapped with 0x%lx]\n",
>+			   ref->dev_addr, ref->size, entry->attrs, ref->attrs);
>+	}
>+#undef DMA_ATTR_UNMAP_VALID
>+
> 	hash_bucket_del(entry);
> 	put_hash_bucket(bucket, flags);
>
>
>-- 
>2.53.0
>
>

Reviewed-by: Samiullah Khawaja <skhawaja@google.com>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 0/6] Add DMA attributes tracking
       [not found] ` <20260501-dma-attrs-debug-v2-0-8dbac75cd501@nvidia.com>
                     ` (3 preceding siblings ...)
       [not found]   ` <20260501-dma-attrs-debug-v2-6-8dbac75cd501@nvidia.com>
@ 2026-05-08  8:50   ` Marek Szyprowski
  2026-05-08 16:20     ` Dave Jiang
  4 siblings, 1 reply; 7+ messages in thread
From: Marek Szyprowski @ 2026-05-08  8:50 UTC (permalink / raw)
  To: Leon Romanovsky, Robin Murphy, Jon Mason, Dave Jiang, Allen Hubbe
  Cc: iommu, linux-kernel, ntb

On 01.05.2026 08:35, Leon Romanovsky wrote:
> The DMA API expects that callers use the same attributes when mapping
> and unmapping. Add tracking to verify this and catch mismatches.

I would like to merge this to dma-mapping-for-next, but I have a question about ntb
patches - Jon, Dave, Allen: do You plan to take them (either to the fixes or to the
-next) or do You want me to take them together with dma patches?


> Thanks
>
> ---
> Changes in v2:
> - Split original patch to be a series
> - Added all unmap flows
> - Skipped DMA attributes which exist only in map path
> - Added ntb patch
> - Link to v1: https://protect2.fireeye.com/v1/url?k=70e722e7-116c37d7-70e6a9a8-000babffaa23-c39f7f9efe32c6a2&q=1&e=c79241ff-9ff4-40ae-8e29-753dd9d59f23&u=https%3A%2F%2Fpatch.msgid.link%2F20260323-dma-attrs-debug-v1-1-6275228ca300%40nvidia.com
>
> ---
> Leon Romanovsky (6):
>       ntb: Store original DMA address for future release
>       ntb: Use consistent DMA attributes when freeing DMA mappings
>       dma-debug: Remove unused DMA attribute parameter
>       dma-debug: Record DMA attributes in debug entry
>       dma-debug: Feed DMA attribute for unmapping flows too
>       dma-debug: Ensure mappings are created and released with matching attributes
>
>  drivers/ntb/ntb_transport.c | 10 +++---
>  kernel/dma/debug.c          | 87 +++++++++++++++++++++++++++++++--------------
>  kernel/dma/debug.h          | 25 ++++++-------
>  kernel/dma/mapping.c        | 10 +++---
>  4 files changed, 85 insertions(+), 47 deletions(-)
> ---
> base-commit: 254f49634ee16a731174d2ae34bc50bd5f45e731
> change-id: 20260323-dma-attrs-debug-85e282d6f3bb
>
> Best regards,
> --  
> Leon Romanovsky <leonro@nvidia.com>
>
>
Best regards
-- 
Marek Szyprowski, PhD
Samsung R&D Institute Poland


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 0/6] Add DMA attributes tracking
  2026-05-08  8:50   ` [PATCH v2 0/6] Add DMA attributes tracking Marek Szyprowski
@ 2026-05-08 16:20     ` Dave Jiang
  2026-05-08 20:31       ` Marek Szyprowski
  0 siblings, 1 reply; 7+ messages in thread
From: Dave Jiang @ 2026-05-08 16:20 UTC (permalink / raw)
  To: Marek Szyprowski, Leon Romanovsky, Robin Murphy, Jon Mason,
	Allen Hubbe
  Cc: iommu, linux-kernel, ntb



On 5/8/26 1:50 AM, Marek Szyprowski wrote:
> On 01.05.2026 08:35, Leon Romanovsky wrote:
>> The DMA API expects that callers use the same attributes when mapping
>> and unmapping. Add tracking to verify this and catch mismatches.
> 
> I would like to merge this to dma-mapping-for-next, but I have a question about ntb
> patches - Jon, Dave, Allen: do You plan to take them (either to the fixes or to the
> -next) or do You want me to take them together with dma patches?

Please go ahead and take them together. Thanks!

> 
> 
>> Thanks
>>
>> ---
>> Changes in v2:
>> - Split original patch to be a series
>> - Added all unmap flows
>> - Skipped DMA attributes which exist only in map path
>> - Added ntb patch
>> - Link to v1: https://protect2.fireeye.com/v1/url?k=70e722e7-116c37d7-70e6a9a8-000babffaa23-c39f7f9efe32c6a2&q=1&e=c79241ff-9ff4-40ae-8e29-753dd9d59f23&u=https%3A%2F%2Fpatch.msgid.link%2F20260323-dma-attrs-debug-v1-1-6275228ca300%40nvidia.com
>>
>> ---
>> Leon Romanovsky (6):
>>       ntb: Store original DMA address for future release
>>       ntb: Use consistent DMA attributes when freeing DMA mappings
>>       dma-debug: Remove unused DMA attribute parameter
>>       dma-debug: Record DMA attributes in debug entry
>>       dma-debug: Feed DMA attribute for unmapping flows too
>>       dma-debug: Ensure mappings are created and released with matching attributes
>>
>>  drivers/ntb/ntb_transport.c | 10 +++---
>>  kernel/dma/debug.c          | 87 +++++++++++++++++++++++++++++++--------------
>>  kernel/dma/debug.h          | 25 ++++++-------
>>  kernel/dma/mapping.c        | 10 +++---
>>  4 files changed, 85 insertions(+), 47 deletions(-)
>> ---
>> base-commit: 254f49634ee16a731174d2ae34bc50bd5f45e731
>> change-id: 20260323-dma-attrs-debug-85e282d6f3bb
>>
>> Best regards,
>> --  
>> Leon Romanovsky <leonro@nvidia.com>
>>
>>
> Best regards


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 0/6] Add DMA attributes tracking
  2026-05-08 16:20     ` Dave Jiang
@ 2026-05-08 20:31       ` Marek Szyprowski
  0 siblings, 0 replies; 7+ messages in thread
From: Marek Szyprowski @ 2026-05-08 20:31 UTC (permalink / raw)
  To: Dave Jiang, Leon Romanovsky, Robin Murphy, Jon Mason, Allen Hubbe
  Cc: iommu, linux-kernel, ntb

On 08.05.2026 18:20, Dave Jiang wrote:
> On 5/8/26 1:50 AM, Marek Szyprowski wrote:
>> On 01.05.2026 08:35, Leon Romanovsky wrote:
>>> The DMA API expects that callers use the same attributes when mapping
>>> and unmapping. Add tracking to verify this and catch mismatches.
>> I would like to merge this to dma-mapping-for-next, but I have a question about ntb
>> patches - Jon, Dave, Allen: do You plan to take them (either to the fixes or to the
>> -next) or do You want me to take them together with dma patches?
> Please go ahead and take them together. Thanks!

Applied all patches to dma-mapping-for-next. Thanks!

Best regards
-- 
Marek Szyprowski, PhD
Samsung R&D Institute Poland


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2026-05-08 20:31 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <CGME20260501063531eucas1p1019e81b1904fc7f0811b3c50cbbf9567@eucas1p1.samsung.com>
     [not found] ` <20260501-dma-attrs-debug-v2-0-8dbac75cd501@nvidia.com>
     [not found]   ` <20260501-dma-attrs-debug-v2-3-8dbac75cd501@nvidia.com>
2026-05-06 17:47     ` [PATCH v2 3/6] dma-debug: Remove unused DMA attribute parameter Samiullah Khawaja
     [not found]   ` <20260501-dma-attrs-debug-v2-4-8dbac75cd501@nvidia.com>
2026-05-06 17:53     ` [PATCH v2 4/6] dma-debug: Record DMA attributes in debug entry Samiullah Khawaja
     [not found]   ` <20260501-dma-attrs-debug-v2-5-8dbac75cd501@nvidia.com>
2026-05-06 18:06     ` [PATCH v2 5/6] dma-debug: Feed DMA attribute for unmapping flows too Samiullah Khawaja
     [not found]   ` <20260501-dma-attrs-debug-v2-6-8dbac75cd501@nvidia.com>
2026-05-06 18:16     ` [PATCH v2 6/6] dma-debug: Ensure mappings are created and released with matching attributes Samiullah Khawaja
2026-05-08  8:50   ` [PATCH v2 0/6] Add DMA attributes tracking Marek Szyprowski
2026-05-08 16:20     ` Dave Jiang
2026-05-08 20:31       ` Marek Szyprowski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox