Message ID | 164feb0a43ae72650e6b20c3910213f469566311.1740139449.git.lorenzo.stoakes@oracle.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | fs/proc/task_mmu: add guard region bit to pagemap | expand |
On Fri, Feb 21, 2025 at 12:05:23PM +0000, Lorenzo Stoakes wrote: > 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. > > Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Andrew - Apologies, I managed to not commit a change I quickly made before sending this out (I'm ill, seems it is having an impact...) If the series is ok would you mind tacking on this fix-patch? It's simply to rename a clumsily named define here. No functional changes... Thanks! ----8<---- From 60be19e88b3bfe9a6ec459115f0027721c494b30 Mon Sep 17 00:00:00 2001 From: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Date: Fri, 21 Feb 2025 13:45:48 +0000 Subject: [PATCH] fixup define name Fix badly named define so it's consistent with the others. Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> --- tools/testing/selftests/mm/guard-regions.c | 6 +++--- tools/testing/selftests/mm/vm_util.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/mm/guard-regions.c b/tools/testing/selftests/mm/guard-regions.c index 0c7183e8b661..280d1831bf73 100644 --- a/tools/testing/selftests/mm/guard-regions.c +++ b/tools/testing/selftests/mm/guard-regions.c @@ -2054,7 +2054,7 @@ TEST_F(guard_regions, pagemap) 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; + unsigned long masked = entry & PM_GUARD_REGION; ASSERT_EQ(masked, 0); } @@ -2070,9 +2070,9 @@ TEST_F(guard_regions, pagemap) 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; + unsigned long masked = entry & PM_GUARD_REGION; - ASSERT_EQ(masked, i % 2 == 0 ? PM_GUARD_REGION_MASK : 0); + ASSERT_EQ(masked, i % 2 == 0 ? PM_GUARD_REGION : 0); } ASSERT_EQ(close(proc_fd), 0); diff --git a/tools/testing/selftests/mm/vm_util.h b/tools/testing/selftests/mm/vm_util.h index 73a11443b7f6..0e629586556b 100644 --- a/tools/testing/selftests/mm/vm_util.h +++ b/tools/testing/selftests/mm/vm_util.h @@ -10,7 +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_GUARD_REGION BIT_ULL(58) #define PM_FILE BIT_ULL(61) #define PM_SWAP BIT_ULL(62) #define PM_PRESENT BIT_ULL(63) -- 2.48.1
On Fri, Feb 21, 2025 at 5:51 AM Lorenzo Stoakes <lorenzo.stoakes@oracle.com> wrote: > > On Fri, Feb 21, 2025 at 12:05:23PM +0000, Lorenzo Stoakes wrote: > > 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. > > > > Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Reviewed-by: Kalesh Singh <kaleshsingh@google.com> > > Andrew - Apologies, > > I managed to not commit a change I quickly made before sending this out > (I'm ill, seems it is having an impact...) > > If the series is ok would you mind tacking on this fix-patch? It's simply > to rename a clumsily named define here. > > No functional changes... > > Thanks! > > ----8<---- > From 60be19e88b3bfe9a6ec459115f0027721c494b30 Mon Sep 17 00:00:00 2001 > From: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> > Date: Fri, 21 Feb 2025 13:45:48 +0000 > Subject: [PATCH] fixup define name > > Fix badly named define so it's consistent with the others. > > Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> > --- > tools/testing/selftests/mm/guard-regions.c | 6 +++--- > tools/testing/selftests/mm/vm_util.h | 2 +- > 2 files changed, 4 insertions(+), 4 deletions(-) > > diff --git a/tools/testing/selftests/mm/guard-regions.c b/tools/testing/selftests/mm/guard-regions.c > index 0c7183e8b661..280d1831bf73 100644 > --- a/tools/testing/selftests/mm/guard-regions.c > +++ b/tools/testing/selftests/mm/guard-regions.c > @@ -2054,7 +2054,7 @@ TEST_F(guard_regions, pagemap) > 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; > + unsigned long masked = entry & PM_GUARD_REGION; > > ASSERT_EQ(masked, 0); > } > @@ -2070,9 +2070,9 @@ TEST_F(guard_regions, pagemap) > 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; > + unsigned long masked = entry & PM_GUARD_REGION; > > - ASSERT_EQ(masked, i % 2 == 0 ? PM_GUARD_REGION_MASK : 0); > + ASSERT_EQ(masked, i % 2 == 0 ? PM_GUARD_REGION : 0); > } > > ASSERT_EQ(close(proc_fd), 0); > diff --git a/tools/testing/selftests/mm/vm_util.h b/tools/testing/selftests/mm/vm_util.h > index 73a11443b7f6..0e629586556b 100644 > --- a/tools/testing/selftests/mm/vm_util.h > +++ b/tools/testing/selftests/mm/vm_util.h > @@ -10,7 +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_GUARD_REGION BIT_ULL(58) > #define PM_FILE BIT_ULL(61) > #define PM_SWAP BIT_ULL(62) > #define PM_PRESENT BIT_ULL(63) > -- > 2.48.1
diff --git a/tools/testing/selftests/mm/guard-regions.c b/tools/testing/selftests/mm/guard-regions.c index ea9b5815e828..0c7183e8b661 100644 --- a/tools/testing/selftests/mm/guard-regions.c +++ b/tools/testing/selftests/mm/guard-regions.c @@ -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 diff --git a/tools/testing/selftests/mm/vm_util.h b/tools/testing/selftests/mm/vm_util.h index b60ac68a9dc8..73a11443b7f6 100644 --- a/tools/testing/selftests/mm/vm_util.h +++ b/tools/testing/selftests/mm/vm_util.h @@ -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)
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. Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> --- tools/testing/selftests/mm/guard-regions.c | 47 ++++++++++++++++++++++ tools/testing/selftests/mm/vm_util.h | 1 + 2 files changed, 48 insertions(+)