selftest/vm: fix map_fixed_noreplace test failure
[ Upstream commit f39c58008dee7ab5fc94c3f1995a21e886801df0 ] On the latest RHEL the test fails due to executable mapped at 256MB address # ./map_fixed_noreplace mmap() @ 0x10000000-0x10050000 p=0xffffffffffffffff result=File exists 10000000-10010000 r-xp 00000000 fd:04 34905657 /root/rpmbuild/BUILD/kernel-5.14.0-56.el9/linux-5.14.0-56.el9.ppc64le/tools/testing/selftests/vm/map_fixed_noreplace 10010000-10020000 r--p 00000000 fd:04 34905657 /root/rpmbuild/BUILD/kernel-5.14.0-56.el9/linux-5.14.0-56.el9.ppc64le/tools/testing/selftests/vm/map_fixed_noreplace 10020000-10030000 rw-p 00010000 fd:04 34905657 /root/rpmbuild/BUILD/kernel-5.14.0-56.el9/linux-5.14.0-56.el9.ppc64le/tools/testing/selftests/vm/map_fixed_noreplace 10029b90000-10029bc0000 rw-p 00000000 00:00 0 [heap] 7fffbb510000-7fffbb750000 r-xp 00000000 fd:04 24534 /usr/lib64/libc.so.6 7fffbb750000-7fffbb760000 r--p 00230000 fd:04 24534 /usr/lib64/libc.so.6 7fffbb760000-7fffbb770000 rw-p 00240000 fd:04 24534 /usr/lib64/libc.so.6 7fffbb780000-7fffbb7a0000 r--p 00000000 00:00 0 [vvar] 7fffbb7a0000-7fffbb7b0000 r-xp 00000000 00:00 0 [vdso] 7fffbb7b0000-7fffbb800000 r-xp 00000000 fd:04 24514 /usr/lib64/ld64.so.2 7fffbb800000-7fffbb810000 r--p 00040000 fd:04 24514 /usr/lib64/ld64.so.2 7fffbb810000-7fffbb820000 rw-p 00050000 fd:04 24514 /usr/lib64/ld64.so.2 7fffd93f0000-7fffd9420000 rw-p 00000000 00:00 0 [stack] Error: couldn't map the space we need for the test Fix this by finding a free address using mmap instead of hardcoding BASE_ADDRESS. Link: https://lkml.kernel.org/r/20220217083417.373823-1-aneesh.kumar@linux.ibm.com Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Jann Horn <jannh@google.com> Cc: Shuah Khan <shuah@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
500158df87
commit
849c78024e
@ -17,9 +17,6 @@
|
|||||||
#define MAP_FIXED_NOREPLACE 0x100000
|
#define MAP_FIXED_NOREPLACE 0x100000
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define BASE_ADDRESS (256ul * 1024 * 1024)
|
|
||||||
|
|
||||||
|
|
||||||
static void dump_maps(void)
|
static void dump_maps(void)
|
||||||
{
|
{
|
||||||
char cmd[32];
|
char cmd[32];
|
||||||
@ -28,18 +25,46 @@ static void dump_maps(void)
|
|||||||
system(cmd);
|
system(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned long find_base_addr(unsigned long size)
|
||||||
|
{
|
||||||
|
void *addr;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
flags = MAP_PRIVATE | MAP_ANONYMOUS;
|
||||||
|
addr = mmap(NULL, size, PROT_NONE, flags, -1, 0);
|
||||||
|
if (addr == MAP_FAILED) {
|
||||||
|
printf("Error: couldn't map the space we need for the test\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (munmap(addr, size) != 0) {
|
||||||
|
printf("Error: couldn't map the space we need for the test\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return (unsigned long)addr;
|
||||||
|
}
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
|
unsigned long base_addr;
|
||||||
unsigned long flags, addr, size, page_size;
|
unsigned long flags, addr, size, page_size;
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
page_size = sysconf(_SC_PAGE_SIZE);
|
page_size = sysconf(_SC_PAGE_SIZE);
|
||||||
|
|
||||||
|
//let's find a base addr that is free before we start the tests
|
||||||
|
size = 5 * page_size;
|
||||||
|
base_addr = find_base_addr(size);
|
||||||
|
if (!base_addr) {
|
||||||
|
printf("Error: couldn't map the space we need for the test\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED_NOREPLACE;
|
flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED_NOREPLACE;
|
||||||
|
|
||||||
// Check we can map all the areas we need below
|
// Check we can map all the areas we need below
|
||||||
errno = 0;
|
errno = 0;
|
||||||
addr = BASE_ADDRESS;
|
addr = base_addr;
|
||||||
size = 5 * page_size;
|
size = 5 * page_size;
|
||||||
p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0);
|
p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0);
|
||||||
|
|
||||||
@ -60,7 +85,7 @@ int main(void)
|
|||||||
printf("unmap() successful\n");
|
printf("unmap() successful\n");
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
addr = BASE_ADDRESS + page_size;
|
addr = base_addr + page_size;
|
||||||
size = 3 * page_size;
|
size = 3 * page_size;
|
||||||
p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0);
|
p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0);
|
||||||
printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p);
|
printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p);
|
||||||
@ -80,7 +105,7 @@ int main(void)
|
|||||||
* +4 | free | new
|
* +4 | free | new
|
||||||
*/
|
*/
|
||||||
errno = 0;
|
errno = 0;
|
||||||
addr = BASE_ADDRESS;
|
addr = base_addr;
|
||||||
size = 5 * page_size;
|
size = 5 * page_size;
|
||||||
p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0);
|
p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0);
|
||||||
printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p);
|
printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p);
|
||||||
@ -101,7 +126,7 @@ int main(void)
|
|||||||
* +4 | free |
|
* +4 | free |
|
||||||
*/
|
*/
|
||||||
errno = 0;
|
errno = 0;
|
||||||
addr = BASE_ADDRESS + (2 * page_size);
|
addr = base_addr + (2 * page_size);
|
||||||
size = page_size;
|
size = page_size;
|
||||||
p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0);
|
p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0);
|
||||||
printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p);
|
printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p);
|
||||||
@ -121,7 +146,7 @@ int main(void)
|
|||||||
* +4 | free | new
|
* +4 | free | new
|
||||||
*/
|
*/
|
||||||
errno = 0;
|
errno = 0;
|
||||||
addr = BASE_ADDRESS + (3 * page_size);
|
addr = base_addr + (3 * page_size);
|
||||||
size = 2 * page_size;
|
size = 2 * page_size;
|
||||||
p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0);
|
p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0);
|
||||||
printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p);
|
printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p);
|
||||||
@ -141,7 +166,7 @@ int main(void)
|
|||||||
* +4 | free |
|
* +4 | free |
|
||||||
*/
|
*/
|
||||||
errno = 0;
|
errno = 0;
|
||||||
addr = BASE_ADDRESS;
|
addr = base_addr;
|
||||||
size = 2 * page_size;
|
size = 2 * page_size;
|
||||||
p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0);
|
p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0);
|
||||||
printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p);
|
printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p);
|
||||||
@ -161,7 +186,7 @@ int main(void)
|
|||||||
* +4 | free |
|
* +4 | free |
|
||||||
*/
|
*/
|
||||||
errno = 0;
|
errno = 0;
|
||||||
addr = BASE_ADDRESS;
|
addr = base_addr;
|
||||||
size = page_size;
|
size = page_size;
|
||||||
p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0);
|
p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0);
|
||||||
printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p);
|
printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p);
|
||||||
@ -181,7 +206,7 @@ int main(void)
|
|||||||
* +4 | free | new
|
* +4 | free | new
|
||||||
*/
|
*/
|
||||||
errno = 0;
|
errno = 0;
|
||||||
addr = BASE_ADDRESS + (4 * page_size);
|
addr = base_addr + (4 * page_size);
|
||||||
size = page_size;
|
size = page_size;
|
||||||
p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0);
|
p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0);
|
||||||
printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p);
|
printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p);
|
||||||
@ -192,7 +217,7 @@ int main(void)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
addr = BASE_ADDRESS;
|
addr = base_addr;
|
||||||
size = 5 * page_size;
|
size = 5 * page_size;
|
||||||
if (munmap((void *)addr, size) != 0) {
|
if (munmap((void *)addr, size) != 0) {
|
||||||
dump_maps();
|
dump_maps();
|
||||||
|
Loading…
Reference in New Issue
Block a user