All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Xu <peterx@redhat.com>
To: linux-kernel@vger.kernel.org, linux-mm@kvack.org
Cc: Mike Kravetz <mike.kravetz@oracle.com>,
	Mike Rapoport <rppt@linux.vnet.ibm.com>,
	Andrea Arcangeli <aarcange@redhat.com>,
	peterx@redhat.com,
	Leonardo Bras Soares Passos <lsoaresp@redhat.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	David Hildenbrand <david@redhat.com>,
	Axel Rasmussen <axelrasmussen@google.com>,
	Nadav Amit <nadav.amit@gmail.com>
Subject: [PATCH 19/29] selftests/mm: Let uffd_handle_page_fault() takes wp parameter
Date: Thu, 30 Mar 2023 12:08:12 -0400	[thread overview]
Message-ID: <20230330160812.3107522-1-peterx@redhat.com> (raw)
In-Reply-To: <20230330155707.3106228-1-peterx@redhat.com>

Make the handler optionally apply WP bit when resolving page faults for
either missing or minor page faults.  This move towards removing global
test_uffdio_wp outside of the common code.

For this, slightly abuse uffd_stats to keep one more parameter on whether
we'd like to resolve page faults with WP bit set.  Note that only the name
is abused, it'll be better to be called uffd_args or similar but let's not
bother for now.

Signed-off-by: Peter Xu <peterx@redhat.com>
---
 tools/testing/selftests/mm/uffd-common.c | 17 +++++++++--------
 tools/testing/selftests/mm/uffd-common.h |  6 ++++--
 tools/testing/selftests/mm/uffd-stress.c | 16 ++++++++++------
 3 files changed, 23 insertions(+), 16 deletions(-)

diff --git a/tools/testing/selftests/mm/uffd-common.c b/tools/testing/selftests/mm/uffd-common.c
index 025e40ffc7bf..92b7e00efa8a 100644
--- a/tools/testing/selftests/mm/uffd-common.c
+++ b/tools/testing/selftests/mm/uffd-common.c
@@ -353,7 +353,7 @@ void wp_range(int ufd, __u64 start, __u64 len, bool wp)
 		err("clear WP failed: address=0x%"PRIx64, (uint64_t)start);
 }
 
-static void continue_range(int ufd, __u64 start, __u64 len)
+static void continue_range(int ufd, __u64 start, __u64 len, bool wp)
 {
 	struct uffdio_continue req;
 	int ret;
@@ -361,7 +361,7 @@ static void continue_range(int ufd, __u64 start, __u64 len)
 	req.range.start = start;
 	req.range.len = len;
 	req.mode = 0;
-	if (test_uffdio_wp)
+	if (wp)
 		req.mode |= UFFDIO_CONTINUE_MODE_WP;
 
 	if (ioctl(ufd, UFFDIO_CONTINUE, &req))
@@ -429,7 +429,8 @@ void uffd_handle_page_fault(struct uffd_msg *msg, struct uffd_stats *stats)
 				    area_dst_alias));
 		for (b = 0; b < page_size; ++b)
 			area[b] = ~area[b];
-		continue_range(uffd, msg->arg.pagefault.address, page_size);
+		continue_range(uffd, msg->arg.pagefault.address, page_size,
+			       stats->apply_wp);
 		stats->minor_faults++;
 	} else {
 		/*
@@ -459,7 +460,7 @@ void uffd_handle_page_fault(struct uffd_msg *msg, struct uffd_stats *stats)
 		offset = (char *)(unsigned long)msg->arg.pagefault.address - area_dst;
 		offset &= ~(page_size-1);
 
-		if (copy_page(uffd, offset))
+		if (copy_page(uffd, offset, stats->apply_wp))
 			stats->missing_faults++;
 	}
 }
@@ -555,7 +556,7 @@ static void wake_range(int ufd, unsigned long addr, unsigned long len)
 			addr), exit(1);
 }
 
-int __copy_page(int ufd, unsigned long offset, bool retry)
+int __copy_page(int ufd, unsigned long offset, bool retry, bool wp)
 {
 	struct uffdio_copy uffdio_copy;
 
@@ -564,7 +565,7 @@ int __copy_page(int ufd, unsigned long offset, bool retry)
 	uffdio_copy.dst = (unsigned long) area_dst + offset;
 	uffdio_copy.src = (unsigned long) area_src + offset;
 	uffdio_copy.len = page_size;
-	if (test_uffdio_wp)
+	if (wp)
 		uffdio_copy.mode = UFFDIO_COPY_MODE_WP;
 	else
 		uffdio_copy.mode = 0;
@@ -587,8 +588,8 @@ int __copy_page(int ufd, unsigned long offset, bool retry)
 	return 0;
 }
 
-int copy_page(int ufd, unsigned long offset)
+int copy_page(int ufd, unsigned long offset, bool wp)
 {
-	return __copy_page(ufd, offset, false);
+	return __copy_page(ufd, offset, false, wp);
 }
 
diff --git a/tools/testing/selftests/mm/uffd-common.h b/tools/testing/selftests/mm/uffd-common.h
index 47565b2f2dee..f4bc73ce3b48 100644
--- a/tools/testing/selftests/mm/uffd-common.h
+++ b/tools/testing/selftests/mm/uffd-common.h
@@ -72,6 +72,8 @@
 /* Userfaultfd test statistics */
 struct uffd_stats {
 	int cpu;
+	/* Whether apply wr-protects when installing pages */
+	bool apply_wp;
 	unsigned long missing_faults;
 	unsigned long wp_faults;
 	unsigned long minor_faults;
@@ -104,8 +106,8 @@ void userfaultfd_open(uint64_t *features);
 int uffd_read_msg(int ufd, struct uffd_msg *msg);
 void wp_range(int ufd, __u64 start, __u64 len, bool wp);
 void uffd_handle_page_fault(struct uffd_msg *msg, struct uffd_stats *stats);
-int __copy_page(int ufd, unsigned long offset, bool retry);
-int copy_page(int ufd, unsigned long offset);
+int __copy_page(int ufd, unsigned long offset, bool retry, bool wp);
+int copy_page(int ufd, unsigned long offset, bool wp);
 void *uffd_poll_thread(void *arg);
 
 #define TEST_ANON	1
diff --git a/tools/testing/selftests/mm/uffd-stress.c b/tools/testing/selftests/mm/uffd-stress.c
index 54fc9b4ffa3c..70cb0619354e 100644
--- a/tools/testing/selftests/mm/uffd-stress.c
+++ b/tools/testing/selftests/mm/uffd-stress.c
@@ -97,6 +97,7 @@ static void uffd_stats_reset(struct uffd_stats *uffd_stats,
 
 	for (i = 0; i < n_cpus; i++) {
 		uffd_stats[i].cpu = i;
+		uffd_stats[i].apply_wp = test_uffdio_wp;
 		uffd_stats[i].missing_faults = 0;
 		uffd_stats[i].wp_faults = 0;
 		uffd_stats[i].minor_faults = 0;
@@ -156,7 +157,7 @@ static void *locking_thread(void *arg)
 
 static int copy_page_retry(int ufd, unsigned long offset)
 {
-	return __copy_page(ufd, offset, true);
+	return __copy_page(ufd, offset, true, test_uffdio_wp);
 }
 
 pthread_mutex_t uffd_read_mutex = PTHREAD_MUTEX_INITIALIZER;
@@ -309,7 +310,7 @@ static void sighndl(int sig, siginfo_t *siginfo, void *ptr)
  * This also tests UFFD_FEATURE_EVENT_FORK event along with the signal
  * feature. Using monitor thread, verify no userfault events are generated.
  */
-static int faulting_process(int signal_test)
+static int faulting_process(int signal_test, bool wp)
 {
 	unsigned long nr;
 	unsigned long long count;
@@ -344,7 +345,7 @@ static int faulting_process(int signal_test)
 					if (steps == 1) {
 						/* This is a MISSING request */
 						steps++;
-						if (copy_page(uffd, offset))
+						if (copy_page(uffd, offset, wp))
 							signalled++;
 					} else {
 						/* This is a WP request */
@@ -508,6 +509,7 @@ static int userfaultfd_events_test(void)
 			  true, test_uffdio_wp, false))
 		err("register failure");
 
+	stats.apply_wp = test_uffdio_wp;
 	if (pthread_create(&uffd_mon, &attr, uffd_poll_thread, &stats))
 		err("uffd_poll_thread create");
 
@@ -516,7 +518,7 @@ static int userfaultfd_events_test(void)
 		err("fork");
 
 	if (!pid)
-		exit(faulting_process(0));
+		exit(faulting_process(0, test_uffdio_wp));
 
 	waitpid(pid, &err, 0);
 	if (err)
@@ -552,11 +554,12 @@ static int userfaultfd_sig_test(void)
 			  true, test_uffdio_wp, false))
 		err("register failure");
 
-	if (faulting_process(1))
+	if (faulting_process(1, test_uffdio_wp))
 		err("faulting process failed");
 
 	uffd_test_ops->release_pages(area_dst);
 
+	stats.apply_wp = test_uffdio_wp;
 	if (pthread_create(&uffd_mon, &attr, uffd_poll_thread, &stats))
 		err("uffd_poll_thread create");
 
@@ -565,7 +568,7 @@ static int userfaultfd_sig_test(void)
 		err("fork");
 
 	if (!pid)
-		exit(faulting_process(2));
+		exit(faulting_process(2, test_uffdio_wp));
 
 	waitpid(pid, &err, 0);
 	if (err)
@@ -629,6 +632,7 @@ static int userfaultfd_minor_test(void)
 		       page_size);
 	}
 
+	stats.apply_wp = test_uffdio_wp;
 	if (pthread_create(&uffd_mon, &attr, uffd_poll_thread, &stats))
 		err("uffd_poll_thread create");
 
-- 
2.39.1


  parent reply	other threads:[~2023-03-30 16:10 UTC|newest]

Thread overview: 97+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-30 15:56 [PATCH 00/29] selftests/mm: Split / Refactor userfault test Peter Xu
2023-03-30 15:56 ` [PATCH 01/29] Revert "userfaultfd: don't fail on unrecognized features" Peter Xu
2023-03-30 18:31   ` David Hildenbrand
2023-03-30 22:22     ` Peter Xu
2023-03-30 19:04   ` Axel Rasmussen
2023-03-30 22:27     ` Peter Xu
2023-03-31 16:52       ` Axel Rasmussen
2023-03-31 18:08         ` Dmitry Safonov
2023-03-31 20:04           ` Axel Rasmussen
2023-04-03  7:48     ` David Hildenbrand
2023-03-30 16:06 ` [PATCH 02/29] selftests/mm: Update .gitignore with two missing tests Peter Xu
2023-04-03  7:48   ` David Hildenbrand
2023-04-07  9:09   ` Mike Rapoport
2023-03-30 16:06 ` [PATCH 03/29] selftests/mm: Dump a summary in run_vmtests.sh Peter Xu
2023-03-30 19:07   ` Axel Rasmussen
2023-03-30 22:28     ` Peter Xu
2023-04-03  7:49       ` David Hildenbrand
2023-04-07  9:15   ` Mike Rapoport
2023-03-30 16:06 ` [PATCH 04/29] selftests/mm: Merge util.h into vm_util.h Peter Xu
2023-03-30 19:14   ` Axel Rasmussen
2023-04-03  7:50   ` David Hildenbrand
2023-04-07  9:18   ` Mike Rapoport
2023-03-30 16:06 ` [PATCH 05/29] selftests/mm: Use TEST_GEN_PROGS where proper Peter Xu
2023-04-03  7:52   ` David Hildenbrand
2023-04-07  9:22   ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 06/29] selftests/mm: Link vm_util.c always Peter Xu
2023-04-03  7:52   ` David Hildenbrand
2023-04-07  9:23   ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 07/29] selftests/mm: Merge default_huge_page_size() into one Peter Xu
2023-03-30 20:30   ` Axel Rasmussen
2023-03-31 18:15   ` Mike Kravetz
2023-04-03 15:16     ` Peter Xu
2023-04-03  7:53   ` David Hildenbrand
2023-04-07  9:24   ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 08/29] selftests/mm: Use PM_* macros in vm_utils.h Peter Xu
2023-03-31 18:24   ` Mike Kravetz
2023-04-03  7:53   ` David Hildenbrand
2023-04-07  9:28   ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 09/29] selftests/mm: Reuse pagemap_get_entry() in vm_util.h Peter Xu
2023-03-30 21:08   ` Axel Rasmussen
2023-03-31 18:27   ` Mike Kravetz
2023-04-03  7:54   ` David Hildenbrand
2023-04-07  9:32   ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 10/29] selftests/mm: Test UFFDIO_ZEROPAGE only when !hugetlb Peter Xu
2023-03-31 18:37   ` Mike Kravetz
2023-04-01  1:57     ` Axel Rasmussen
2023-04-03  7:55       ` David Hildenbrand
2023-04-03 16:10         ` Peter Xu
2023-04-07  9:42           ` Mike Rapoport
2023-04-11 19:03             ` Peter Xu
2023-03-30 16:07 ` [PATCH 11/29] selftests/mm: Drop test_uffdio_zeropage_eexist Peter Xu
2023-04-01  0:03   ` Mike Kravetz
2023-04-03 16:16     ` Peter Xu
2023-04-03  7:56   ` David Hildenbrand
2023-04-07  9:48   ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 12/29] selftests/mm: Create uffd-common.[ch] Peter Xu
2023-04-07 10:10   ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 13/29] selftests/mm: Split uffd tests into uffd-stress and uffd-unit-tests Peter Xu
2023-04-07 11:02   ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 14/29] selftests/mm: uffd_[un]register() Peter Xu
2023-04-05 19:12   ` Peter Xu
2023-04-07 11:08   ` Mike Rapoport
2023-04-11 19:13     ` Peter Xu
2023-04-12 16:42       ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 15/29] selftests/mm: uffd_open_{dev|sys}() Peter Xu
2023-04-03  8:00   ` David Hildenbrand
2023-04-07 11:11   ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 16/29] selftests/mm: UFFDIO_API test Peter Xu
2023-04-03  7:59   ` David Hildenbrand
2023-04-03 16:43     ` Peter Xu
2023-04-03 19:06       ` David Hildenbrand
2023-04-03 20:24         ` Peter Xu
2023-04-04 12:48           ` David Hildenbrand
2023-04-05 16:21   ` Peter Xu
2023-03-30 16:08 ` [PATCH 17/29] selftests/mm: Drop global mem_fd in uffd tests Peter Xu
2023-04-11 10:39   ` Mike Rapoport
2023-03-30 16:08 ` [PATCH 18/29] selftests/mm: Drop global hpage_size " Peter Xu
2023-04-11 10:41   ` Mike Rapoport
2023-03-30 16:08 ` Peter Xu [this message]
2023-04-11 10:52   ` [PATCH 19/29] selftests/mm: Let uffd_handle_page_fault() takes wp parameter Mike Rapoport
2023-04-11 19:36     ` Peter Xu
2023-03-30 16:08 ` [PATCH 20/29] selftests/mm: Allow allocate_area() to fail properly Peter Xu
2023-04-11 11:02   ` Mike Rapoport
2023-04-11 19:42     ` Peter Xu
2023-03-30 16:08 ` [PATCH 21/29] selftests/mm: Add framework for uffd-unit-test Peter Xu
2023-04-11 11:09   ` Mike Rapoport
2023-04-11 20:09     ` Peter Xu
2023-03-30 16:08 ` [PATCH 22/29] selftests/mm: Move uffd pagemap test to unit test Peter Xu
2023-04-11 12:41   ` Mike Rapoport
2023-03-30 16:08 ` [PATCH 23/29] selftests/mm: Move uffd minor " Peter Xu
2023-03-30 16:08 ` [PATCH 24/29] selftests/mm: Move uffd sig/events tests into uffd unit tests Peter Xu
2023-03-30 16:08 ` [PATCH 25/29] selftests/mm: Move zeropage test " Peter Xu
2023-03-30 16:08 ` [PATCH 26/29] selftests/mm: Workaround no way to detect uffd-minor + wp Peter Xu
2023-03-30 16:08 ` [PATCH 27/29] selftests/mm: Allow uffd test to skip properly with no privilege Peter Xu
2023-03-30 16:08 ` [PATCH 28/29] selftests/mm: Drop sys/dev test in uffd-stress test Peter Xu
2023-03-30 16:08 ` [PATCH 29/29] selftests/mm: Add shmem-private test to uffd-stress Peter Xu
2023-03-31 16:47 ` [PATCH 00/29] selftests/mm: Split / Refactor userfault test Peter Xu

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=20230330160812.3107522-1-peterx@redhat.com \
    --to=peterx@redhat.com \
    --cc=aarcange@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=axelrasmussen@google.com \
    --cc=david@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=lsoaresp@redhat.com \
    --cc=mike.kravetz@oracle.com \
    --cc=nadav.amit@gmail.com \
    --cc=rppt@linux.vnet.ibm.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.