linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v1] selftests: mm: gup_longterm: test unsharing logic when R/O pinning
@ 2024-04-30 13:15 David Hildenbrand
  2024-04-30 13:36 ` Peter Xu
  0 siblings, 1 reply; 2+ messages in thread
From: David Hildenbrand @ 2024-04-30 13:15 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-mm, linux-kselftest, David Hildenbrand, Andrew Morton,
	Shuah Khan, Peter Xu

In our FOLL_LONGTERM tests, we prefault the page tables for the GUP-fast
test cases to be able to find a PTE and exercise the "longterm pinning
allowed" logic on the GUP-fast path where possible.

For now, we always prefault the page tables writable, resulting in PTEs
that are writable.

Let's cover more cases to also test if our unsharing logic works as
expected (and is able to make progress when there is nothing to unshare)
by mprotect'ing the range R/O when R/O-pinning, so we don't get PTEs
that are writable.

This change would have found an issue introduced by commit a12083d721d7
("mm/gup: handle hugepd for follow_page()"), whereby R/O pinning was not
able to make progress in all cases, because unsharing logic was not
provided with the VMA to decide at some point that long-term R/O pinning
a !anon page is fine.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shuah Khan <shuah@kernel.org>
Cc: Peter Xu <peterx@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---

Follow-up to [1].

Tested only on x86-64, to make sure the tests are still passing.

[1] https://lkml.kernel.org/r/20240428190151.201002-3-peterx@redhat.com

---
 tools/testing/selftests/mm/gup_longterm.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/tools/testing/selftests/mm/gup_longterm.c b/tools/testing/selftests/mm/gup_longterm.c
index ad168d35b23b7..6c6d99c1dc765 100644
--- a/tools/testing/selftests/mm/gup_longterm.c
+++ b/tools/testing/selftests/mm/gup_longterm.c
@@ -118,15 +118,22 @@ static void do_test(int fd, size_t size, enum test_type type, bool shared)
 		return;
 	}
 
-	/*
-	 * Fault in the page writable such that GUP-fast can eventually pin
-	 * it immediately.
-	 */
+	/* Fault in the page such that GUP-fast can pin it directly. */
 	memset(mem, 0, size);
 
 	switch (type) {
 	case TEST_TYPE_RO:
 	case TEST_TYPE_RO_FAST:
+		/*
+		 * Cover more cases regarding unsharing decisions when
+		 * long-term R/O pinning by mapping the page R/O.
+		 */
+		ret = mprotect(mem, size, PROT_READ);
+		if (ret) {
+			ksft_test_result_fail("mprotect() failed\n");
+			goto munmap;
+		}
+		/* FALLTHROUGH */
 	case TEST_TYPE_RW:
 	case TEST_TYPE_RW_FAST: {
 		struct pin_longterm_test args;
@@ -228,6 +235,7 @@ static void do_test(int fd, size_t size, enum test_type type, bool shared)
 		assert(false);
 	}
 
+munmap:
 	munmap(mem, size);
 }
 
-- 
2.44.0



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

* Re: [PATCH v1] selftests: mm: gup_longterm: test unsharing logic when R/O pinning
  2024-04-30 13:15 [PATCH v1] selftests: mm: gup_longterm: test unsharing logic when R/O pinning David Hildenbrand
@ 2024-04-30 13:36 ` Peter Xu
  0 siblings, 0 replies; 2+ messages in thread
From: Peter Xu @ 2024-04-30 13:36 UTC (permalink / raw)
  To: David Hildenbrand
  Cc: linux-kernel, linux-mm, linux-kselftest, Andrew Morton, Shuah Khan

On Tue, Apr 30, 2024 at 03:15:08PM +0200, David Hildenbrand wrote:
> In our FOLL_LONGTERM tests, we prefault the page tables for the GUP-fast
> test cases to be able to find a PTE and exercise the "longterm pinning
> allowed" logic on the GUP-fast path where possible.
> 
> For now, we always prefault the page tables writable, resulting in PTEs
> that are writable.
> 
> Let's cover more cases to also test if our unsharing logic works as
> expected (and is able to make progress when there is nothing to unshare)
> by mprotect'ing the range R/O when R/O-pinning, so we don't get PTEs
> that are writable.
> 
> This change would have found an issue introduced by commit a12083d721d7
> ("mm/gup: handle hugepd for follow_page()"), whereby R/O pinning was not
> able to make progress in all cases, because unsharing logic was not
> provided with the VMA to decide at some point that long-term R/O pinning
> a !anon page is fine.
> 
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Shuah Khan <shuah@kernel.org>
> Cc: Peter Xu <peterx@redhat.com>
> Signed-off-by: David Hildenbrand <david@redhat.com>

Acked-by: Peter Xu <peterx@redhat.com>

Thanks,

-- 
Peter Xu



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

end of thread, other threads:[~2024-04-30 13:36 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-04-30 13:15 [PATCH v1] selftests: mm: gup_longterm: test unsharing logic when R/O pinning David Hildenbrand
2024-04-30 13:36 ` Peter Xu

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