Skip to contentSkip to conversation

mm/hmm/test: use xa_for_each_range instead of looping

PATCH In review Ralph Campbell 2 participants 2 messages May 16, 2020 – May 19, 2020

Subsystems (5)
lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 mm/hmm/test: use xa_for_each_range instead of looping

The test driver uses an xa_array to store virtual to physical address translations for a simulated hardware device. The MMU notifier invalidation callback is used to keep the table consistent with the CPU page table and is frequently called only for a page or two. However, if the test process exits unexpectedly or is killed, the range can be [0..ULONG_MAX] in which case calling xa_erase() for every possible PFN results in CPU timeouts.
Use xa_for_each_range() to efficiently erase entries in the range.

---

This patch is based on Jason Gunthorpe's hmm tree and should be folded into the ("mm/hmm/test: add selftest driver for HMM") patch once this patch is reviewed, etc.

v1 -> v2:
Use xa_for_each_range() instead of special casing [0..ULONG_MAX].

 lib/test_hmm.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
lib/test_hmm.c +3 -1
index 8b36c26b717b..5c1858e325ba 100644
@@ -196,13 +196,15 @@ static void dmirror_do_update(struct dmirror *dmirror, unsigned long start,
 			      unsigned long end)
 {
 	unsigned long pfn;
+	void *entry;
 
 	/*
 	 * The XArray doesn't hold references to pages since it relies on
 	 * the mmu notifier to clear page pointers when they become stale.
 	 * Therefore, it is OK to just clear the entry.
 	 */
-	for (pfn = start >> PAGE_SHIFT; pfn < (end >> PAGE_SHIFT); pfn++)
+	xa_for_each_range(&dmirror->pt, pfn, entry, start >> PAGE_SHIFT,
+			  end >> PAGE_SHIFT)
 		xa_erase(&dmirror->pt, pfn);
 }
 
Signature · 1 line
2.20.1
#1 lore raw
Quoted 16 lines · Ralph Campbell

The test driver uses an xa_array to store virtual to physical address translations for a simulated hardware device. The MMU notifier invalidation callback is used to keep the table consistent with the CPU page table and is frequently called only for a page or two. However, if the test process exits unexpectedly or is killed, the range can be [0..ULONG_MAX] in which case calling xa_erase() for every possible PFN results in CPU timeouts.
Use xa_for_each_range() to efficiently erase entries in the range.

---

This patch is based on Jason Gunthorpe's hmm tree and should be folded into the ("mm/hmm/test: add selftest driver for HMM") patch once this patch is reviewed, etc.

Quoted 5 lines

v1 -> v2:
Use xa_for_each_range() instead of special casing [0..ULONG_MAX].

 lib/test_hmm.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

I squashed this in

Thanks,
Jason