| From: Alexey Dobriyan <adobriyan@gmail.com> |
| Subject: proc: fix map_files test on F29 |
| |
| F29 bans mapping first 64KB even for root making test fail. Iterate from |
| address 0 until mmap() works. |
| |
| Gentoo (root): |
| |
| openat(AT_FDCWD, "/dev/zero", O_RDONLY) = 3 |
| mmap(NULL, 4096, PROT_NONE, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0 |
| |
| Gentoo (non-root): |
| |
| openat(AT_FDCWD, "/dev/zero", O_RDONLY) = 3 |
| mmap(NULL, 4096, PROT_NONE, MAP_PRIVATE|MAP_FIXED, 3, 0) = -1 EPERM (Operation not permitted) |
| mmap(0x1000, 4096, PROT_NONE, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x1000 |
| |
| F29 (root): |
| |
| openat(AT_FDCWD, "/dev/zero", O_RDONLY) = 3 |
| mmap(NULL, 4096, PROT_NONE, MAP_PRIVATE|MAP_FIXED, 3, 0) = -1 EACCES (Permission denied) |
| mmap(0x1000, 4096, PROT_NONE, MAP_PRIVATE|MAP_FIXED, 3, 0) = -1 EACCES (Permission denied) |
| mmap(0x2000, 4096, PROT_NONE, MAP_PRIVATE|MAP_FIXED, 3, 0) = -1 EACCES (Permission denied) |
| mmap(0x3000, 4096, PROT_NONE, MAP_PRIVATE|MAP_FIXED, 3, 0) = -1 EACCES (Permission denied) |
| mmap(0x4000, 4096, PROT_NONE, MAP_PRIVATE|MAP_FIXED, 3, 0) = -1 EACCES (Permission denied) |
| mmap(0x5000, 4096, PROT_NONE, MAP_PRIVATE|MAP_FIXED, 3, 0) = -1 EACCES (Permission denied) |
| mmap(0x6000, 4096, PROT_NONE, MAP_PRIVATE|MAP_FIXED, 3, 0) = -1 EACCES (Permission denied) |
| mmap(0x7000, 4096, PROT_NONE, MAP_PRIVATE|MAP_FIXED, 3, 0) = -1 EACCES (Permission denied) |
| mmap(0x8000, 4096, PROT_NONE, MAP_PRIVATE|MAP_FIXED, 3, 0) = -1 EACCES (Permission denied) |
| mmap(0x9000, 4096, PROT_NONE, MAP_PRIVATE|MAP_FIXED, 3, 0) = -1 EACCES (Permission denied) |
| mmap(0xa000, 4096, PROT_NONE, MAP_PRIVATE|MAP_FIXED, 3, 0) = -1 EACCES (Permission denied) |
| mmap(0xb000, 4096, PROT_NONE, MAP_PRIVATE|MAP_FIXED, 3, 0) = -1 EACCES (Permission denied) |
| mmap(0xc000, 4096, PROT_NONE, MAP_PRIVATE|MAP_FIXED, 3, 0) = -1 EACCES (Permission denied) |
| mmap(0xd000, 4096, PROT_NONE, MAP_PRIVATE|MAP_FIXED, 3, 0) = -1 EACCES (Permission denied) |
| mmap(0xe000, 4096, PROT_NONE, MAP_PRIVATE|MAP_FIXED, 3, 0) = -1 EACCES (Permission denied) |
| mmap(0xf000, 4096, PROT_NONE, MAP_PRIVATE|MAP_FIXED, 3, 0) = -1 EACCES (Permission denied) |
| mmap(0x10000, 4096, PROT_NONE, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x10000 |
| |
| Now all proc tests succeed on F29 if run as root, at last! |
| |
| Link: http://lkml.kernel.org/r/20190414123612.GB12971@avx2 |
| Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com> |
| Cc: Randy Dunlap <rdunlap@infradead.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| tools/testing/selftests/proc/proc-self-map-files-002.c | 20 +++++----- |
| 1 file changed, 10 insertions(+), 10 deletions(-) |
| |
| --- a/tools/testing/selftests/proc/proc-self-map-files-002.c~proc-fix-map_files-test-on-f29 |
| +++ a/tools/testing/selftests/proc/proc-self-map-files-002.c |
| @@ -46,12 +46,9 @@ static void fail(const char *fmt, unsign |
| |
| int main(void) |
| { |
| - const unsigned int PAGE_SIZE = sysconf(_SC_PAGESIZE); |
| -#ifdef __arm__ |
| - unsigned long va = 2 * PAGE_SIZE; |
| -#else |
| - unsigned long va = 0; |
| -#endif |
| + const int PAGE_SIZE = sysconf(_SC_PAGESIZE); |
| + const unsigned long va_max = 1UL << 32; |
| + unsigned long va; |
| void *p; |
| int fd; |
| unsigned long a, b; |
| @@ -60,10 +57,13 @@ int main(void) |
| if (fd == -1) |
| return 1; |
| |
| - p = mmap((void *)va, PAGE_SIZE, PROT_NONE, MAP_PRIVATE|MAP_FILE|MAP_FIXED, fd, 0); |
| - if (p == MAP_FAILED) { |
| - if (errno == EPERM) |
| - return 4; |
| + for (va = 0; va < va_max; va += PAGE_SIZE) { |
| + p = mmap((void *)va, PAGE_SIZE, PROT_NONE, MAP_PRIVATE|MAP_FILE|MAP_FIXED, fd, 0); |
| + if (p == (void *)va) |
| + break; |
| + } |
| + if (va == va_max) { |
| + fprintf(stderr, "error: mmap doesn't like you\n"); |
| return 1; |
| } |
| |
| _ |