]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
tools/selftests: add guard region test for /proc/$pid/pagemap
authorLorenzo Stoakes <lorenzo.stoakes@oracle.com>
Fri, 21 Feb 2025 12:05:23 +0000 (12:05 +0000)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 28 Feb 2025 01:00:29 +0000 (17:00 -0800)
Add a test to the guard region self tests to assert that the
/proc/$pid/pagemap information now made availabile to the user correctly
identifies and reports guard regions.

As a part of this change, update vm_util.h to add the new bit (note there
is no header file in the kernel where this is exposed, the user is
expected to provide their own mask) and utilise the helper functions there
for pagemap functionality.

Link: https://lkml.kernel.org/r/164feb0a43ae72650e6b20c3910213f469566311.1740139449.git.lorenzo.stoakes@oracle.com
Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: Jann Horn <jannh@google.com>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Kalesh Singh <kaleshsingh@google.com>
Cc: Liam Howlett <liam.howlett@oracle.com>
Cc: Matthew Wilcow (Oracle) <willy@infradead.org>
Cc: "Paul E . McKenney" <paulmck@kernel.org>
Cc: Shuah Khan (Samsung OSG) <shuah@kernel.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
tools/testing/selftests/mm/guard-regions.c
tools/testing/selftests/mm/vm_util.h

index ea9b5815e8280d60b2dde50667f180f24ac3890b..0c7183e8b661994b74ef85e855e6487bd38ef7a5 100644 (file)
@@ -19,6 +19,7 @@
 #include <sys/syscall.h>
 #include <sys/uio.h>
 #include <unistd.h>
+#include "vm_util.h"
 
 /*
  * Ignore the checkpatch warning, as per the C99 standard, section 7.14.1.1:
@@ -2032,4 +2033,50 @@ TEST_F(guard_regions, anon_zeropage)
        ASSERT_EQ(munmap(ptr, 10 * page_size), 0);
 }
 
+/*
+ * Assert that /proc/$pid/pagemap correctly identifies guard region ranges.
+ */
+TEST_F(guard_regions, pagemap)
+{
+       const unsigned long page_size = self->page_size;
+       int proc_fd;
+       char *ptr;
+       int i;
+
+       proc_fd = open("/proc/self/pagemap", O_RDONLY);
+       ASSERT_NE(proc_fd, -1);
+
+       ptr = mmap_(self, variant, NULL, 10 * page_size,
+                   PROT_READ | PROT_WRITE, 0, 0);
+       ASSERT_NE(ptr, MAP_FAILED);
+
+       /* Read from pagemap, and assert no guard regions are detected. */
+       for (i = 0; i < 10; i++) {
+               char *ptr_p = &ptr[i * page_size];
+               unsigned long entry = pagemap_get_entry(proc_fd, ptr_p);
+               unsigned long masked = entry & PM_GUARD_REGION_MASK;
+
+               ASSERT_EQ(masked, 0);
+       }
+
+       /* Install a guard region in every other page. */
+       for (i = 0; i < 10; i += 2) {
+               char *ptr_p = &ptr[i * page_size];
+
+               ASSERT_EQ(madvise(ptr_p, page_size, MADV_GUARD_INSTALL), 0);
+       }
+
+       /* Re-read from pagemap, and assert guard regions are detected. */
+       for (i = 0; i < 10; i++) {
+               char *ptr_p = &ptr[i * page_size];
+               unsigned long entry = pagemap_get_entry(proc_fd, ptr_p);
+               unsigned long masked = entry & PM_GUARD_REGION_MASK;
+
+               ASSERT_EQ(masked, i % 2 == 0 ? PM_GUARD_REGION_MASK : 0);
+       }
+
+       ASSERT_EQ(close(proc_fd), 0);
+       ASSERT_EQ(munmap(ptr, 10 * page_size), 0);
+}
+
 TEST_HARNESS_MAIN
index b60ac68a9dc8893895f49946b258260f7a82218a..73a11443b7f69420ba109ee04b67cc01dae99616 100644 (file)
@@ -10,6 +10,7 @@
 #define PM_SOFT_DIRTY                 BIT_ULL(55)
 #define PM_MMAP_EXCLUSIVE             BIT_ULL(56)
 #define PM_UFFD_WP                    BIT_ULL(57)
+#define PM_GUARD_REGION_MASK          BIT_ULL(58)
 #define PM_FILE                       BIT_ULL(61)
 #define PM_SWAP                       BIT_ULL(62)
 #define PM_PRESENT                    BIT_ULL(63)