linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] dma-debug: Improve search for partial syncs
@ 2022-08-15 19:28 Robin Murphy
  2022-08-22 11:19 ` Christoph Hellwig
  2022-09-07  8:40 ` Christoph Hellwig
  0 siblings, 2 replies; 3+ messages in thread
From: Robin Murphy @ 2022-08-15 19:28 UTC (permalink / raw)
  To: hch; +Cc: m.szyprowski, iommu, linux-kernel, Yunfei Wang

When bucket_find_contains() tries to find the original entry for a
partial sync, it manages to constrain its search in a way that is both
too restrictive and not restrictive enough. A driver which only uses
single mappings rather than scatterlists might not set max_seg_size, but
could still technically perform a partial sync at an offset of more than
64KB into a sufficiently large mapping, so we could stop searching too
early before reaching a legitimate entry. Conversely, if no valid entry
is present and max_range is large enough, we can pointlessly search
buckets that we've already searched, or that represent an impossible
wrapping around the bottom of the address space. At worst, the
(legitimate) case of max_seg_size == UINT_MAX can make the loop
infinite.

Replace the fragile and frankly hard-to-follow "range" logic with a
simple counted loop for the number of possible hash buckets below the
given address.

Reported-by: Yunfei Wang <yf.wang@mediatek.com>
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
---

Having come back and looked at this for long enough to realise that
max_range itself was both wrong and not actually useful, I figured it
was easiest just to write the whole thing up as an alternative patch.

 kernel/dma/debug.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/kernel/dma/debug.c b/kernel/dma/debug.c
index 2caafd13f8aa..18c93c2276ca 100644
--- a/kernel/dma/debug.c
+++ b/kernel/dma/debug.c
@@ -350,11 +350,10 @@ static struct dma_debug_entry *bucket_find_contain(struct hash_bucket **bucket,
 						   unsigned long *flags)
 {
 
-	unsigned int max_range = dma_get_max_seg_size(ref->dev);
 	struct dma_debug_entry *entry, index = *ref;
-	unsigned int range = 0;
+	int limit = min(HASH_SIZE, (index.dev_addr >> HASH_FN_SHIFT) + 1);
 
-	while (range <= max_range) {
+	for (int i = 0; i < limit; i++) {
 		entry = __hash_bucket_find(*bucket, ref, containing_match);
 
 		if (entry)
@@ -364,7 +363,6 @@ static struct dma_debug_entry *bucket_find_contain(struct hash_bucket **bucket,
 		 * Nothing found, go back a hash bucket
 		 */
 		put_hash_bucket(*bucket, *flags);
-		range          += (1 << HASH_FN_SHIFT);
 		index.dev_addr -= (1 << HASH_FN_SHIFT);
 		*bucket = get_hash_bucket(&index, flags);
 	}
-- 
2.36.1.dirty


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

* Re: [PATCH] dma-debug: Improve search for partial syncs
  2022-08-15 19:28 [PATCH] dma-debug: Improve search for partial syncs Robin Murphy
@ 2022-08-22 11:19 ` Christoph Hellwig
  2022-09-07  8:40 ` Christoph Hellwig
  1 sibling, 0 replies; 3+ messages in thread
From: Christoph Hellwig @ 2022-08-22 11:19 UTC (permalink / raw)
  To: Robin Murphy; +Cc: hch, m.szyprowski, iommu, linux-kernel, Yunfei Wang

On Mon, Aug 15, 2022 at 08:28:40PM +0100, Robin Murphy wrote:
> Having come back and looked at this for long enough to realise that
> max_range itself was both wrong and not actually useful, I figured it
> was easiest just to write the whole thing up as an alternative patch.

Yes, this looks much better than the original code.  Yunfei, can you
test this for your specific case as well?

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

* Re: [PATCH] dma-debug: Improve search for partial syncs
  2022-08-15 19:28 [PATCH] dma-debug: Improve search for partial syncs Robin Murphy
  2022-08-22 11:19 ` Christoph Hellwig
@ 2022-09-07  8:40 ` Christoph Hellwig
  1 sibling, 0 replies; 3+ messages in thread
From: Christoph Hellwig @ 2022-09-07  8:40 UTC (permalink / raw)
  To: Robin Murphy; +Cc: hch, m.szyprowski, iommu, linux-kernel, Yunfei Wang

Thanks, applied.

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

end of thread, other threads:[~2022-09-07  8:42 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-15 19:28 [PATCH] dma-debug: Improve search for partial syncs Robin Murphy
2022-08-22 11:19 ` Christoph Hellwig
2022-09-07  8:40 ` Christoph Hellwig

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).