Commit f39c5800 authored by Aneesh Kumar K.V's avatar Aneesh Kumar K.V Committed by Linus Torvalds

selftest/vm: fix map_fixed_noreplace test failure

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.comSigned-off-by: default avatarAneesh 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: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent f798a1d4
...@@ -17,9 +17,6 @@ ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment