public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Samiullah Khawaja <skhawaja@google.com>
To: Leon Romanovsky <leon@kernel.org>
Cc: Marek Szyprowski <m.szyprowski@samsung.com>,
	 Robin Murphy <robin.murphy@arm.com>,
	Jon Mason <jdmason@kudzu.us>, Dave Jiang <dave.jiang@intel.com>,
	 Allen Hubbe <allenbh@gmail.com>,
	iommu@lists.linux.dev, linux-kernel@vger.kernel.org,
	 ntb@lists.linux.dev
Subject: Re: [PATCH v2 4/6] dma-debug: Record DMA attributes in debug entry
Date: Wed, 6 May 2026 17:53:36 +0000	[thread overview]
Message-ID: <aft-2O03KaqqOXF4@google.com> (raw)
In-Reply-To: <20260501-dma-attrs-debug-v2-4-8dbac75cd501@nvidia.com>

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>

  reply	other threads:[~2026-05-06 17:53 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-01  6:35 [PATCH v2 0/6] Add DMA attributes tracking Leon Romanovsky
2026-05-01  6:35 ` [PATCH v2 1/6] ntb: Store original DMA address for future release Leon Romanovsky
2026-05-01 17:00   ` Dave Jiang
2026-05-01  6:35 ` [PATCH v2 2/6] ntb: Use consistent DMA attributes when freeing DMA mappings Leon Romanovsky
2026-05-01 17:00   ` Dave Jiang
2026-05-01  6:35 ` [PATCH v2 3/6] dma-debug: Remove unused DMA attribute parameter Leon Romanovsky
2026-05-06 17:47   ` Samiullah Khawaja
2026-05-01  6:35 ` [PATCH v2 4/6] dma-debug: Record DMA attributes in debug entry Leon Romanovsky
2026-05-06 17:53   ` Samiullah Khawaja [this message]
2026-05-01  6:35 ` [PATCH v2 5/6] dma-debug: Feed DMA attribute for unmapping flows too Leon Romanovsky
2026-05-06 18:06   ` Samiullah Khawaja
2026-05-01  6:35 ` [PATCH v2 6/6] dma-debug: Ensure mappings are created and released with matching attributes Leon Romanovsky
2026-05-06 18:16   ` Samiullah Khawaja

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=aft-2O03KaqqOXF4@google.com \
    --to=skhawaja@google.com \
    --cc=allenbh@gmail.com \
    --cc=dave.jiang@intel.com \
    --cc=iommu@lists.linux.dev \
    --cc=jdmason@kudzu.us \
    --cc=leon@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=m.szyprowski@samsung.com \
    --cc=ntb@lists.linux.dev \
    --cc=robin.murphy@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox