forked from mirrors/linux
		
	tools/selftests: add guard region test for /proc/$pid/pagemap
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. [lorenzo.stoakes@oracle.com: fixup define name] Link: https://lkml.kernel.org/r/32e83941-e6f5-42ee-9292-a44c16463cf1@lucifer.local 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 <shuah@kernel.org> Cc: Suren Baghdasaryan <surenb@google.com> Cc: Vlastimil Babka <vbabka@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									8e2f2aeb8b
								
							
						
					
					
						commit
						f3b92176f4
					
				
					 2 changed files with 48 additions and 0 deletions
				
			
		|  | @ -19,6 +19,7 @@ | ||||||
| #include <sys/syscall.h> | #include <sys/syscall.h> | ||||||
| #include <sys/uio.h> | #include <sys/uio.h> | ||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
|  | #include "vm_util.h" | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Ignore the checkpatch warning, as per the C99 standard, section 7.14.1.1: |  * 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_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; | ||||||
|  | 
 | ||||||
|  | 		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; | ||||||
|  | 
 | ||||||
|  | 		ASSERT_EQ(masked, i % 2 == 0 ? PM_GUARD_REGION : 0); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	ASSERT_EQ(close(proc_fd), 0); | ||||||
|  | 	ASSERT_EQ(munmap(ptr, 10 * page_size), 0); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| TEST_HARNESS_MAIN | TEST_HARNESS_MAIN | ||||||
|  |  | ||||||
|  | @ -10,6 +10,7 @@ | ||||||
| #define PM_SOFT_DIRTY                 BIT_ULL(55) | #define PM_SOFT_DIRTY                 BIT_ULL(55) | ||||||
| #define PM_MMAP_EXCLUSIVE             BIT_ULL(56) | #define PM_MMAP_EXCLUSIVE             BIT_ULL(56) | ||||||
| #define PM_UFFD_WP                    BIT_ULL(57) | #define PM_UFFD_WP                    BIT_ULL(57) | ||||||
|  | #define PM_GUARD_REGION               BIT_ULL(58) | ||||||
| #define PM_FILE                       BIT_ULL(61) | #define PM_FILE                       BIT_ULL(61) | ||||||
| #define PM_SWAP                       BIT_ULL(62) | #define PM_SWAP                       BIT_ULL(62) | ||||||
| #define PM_PRESENT                    BIT_ULL(63) | #define PM_PRESENT                    BIT_ULL(63) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Lorenzo Stoakes
						Lorenzo Stoakes