On Fri, May 20, 2016 at 11:06:06PM +0200, John Paul Adrian Glaubitz wrote: > Thus, in order to fix this issue on sparc64/Linux, a more elaborate > fix will have to be developed.
I just made a test installation of NetBSD to verify the theory. On Linux: glaubitz@ikarus:~$ cat vmtest.c #include <stdio.h> #include <sys/mman.h> int main(void) { void *ptr1, *ptr2, *ptr3, *ptr4, *ptr5, *ptr6; ptr1 = mmap(NULL, 1024*1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); ptr2 = mmap((void*)0x0000070000000000ULL, 1024*1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); ptr3 = mmap((void*)0x0000070000000000ULL, 1024*1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); ptr4 = mmap((void*)0x0000070000000000ULL, 1024*1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); ptr5 = mmap((void*)0x0000070000000000ULL, 1024*1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); ptr6 = mmap(NULL, 1024*1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); printf("%p %p %p %p %p %p\n", ptr1, ptr2, ptr3, ptr4, ptr5, ptr6); } glaubitz@ikarus:~$ ./vmtest 0x7f80c32f6000 0x70000000000 0x7f80c2d5d000 0x7f80c2c5d000 0x7f80c2b5d000 0x7f80c2a5d000 glaubitz@ikarus:~$ uname -vm #1 SMP Debian 4.5.1-1 (2016-04-14) x86_64 glaubitz@ikarus:~$ On NetBSD: testbsd# cat vmtest.c #include <stdio.h> #include <sys/mman.h> int main(void) { void *ptr1, *ptr2, *ptr3, *ptr4, *ptr5, *ptr6; ptr1 = mmap(NULL, 1024*1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); ptr2 = mmap((void*)0x0000070000000000ULL, 1024*1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); ptr3 = mmap((void*)0x0000070000000000ULL, 1024*1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); ptr4 = mmap((void*)0x0000070000000000ULL, 1024*1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); ptr5 = mmap((void*)0x0000070000000000ULL, 1024*1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); ptr6 = mmap(NULL, 1024*1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); printf("%p %p %p %p %p %p\n", ptr1, ptr2, ptr3, ptr4, ptr5, ptr6); } testbsd# ./vmtest 0x7f7ff7ef8000 0x70000000000 0x6fffff00000 0x6ffffe00000 0x6ffffd00000 0x7f7ff7b00000 testbsd# uname -vm NetBSD 7.0 (GENERIC.201509250726Z) amd64 testbsd# As you can see, on NetBSD, mmmap with a hint will always return memory in the requested region, even if the memory has already been allocated before. On Linux, the hint is ignored when the memory pointed to by it is already allocated. Adrian -- .''`. John Paul Adrian Glaubitz : :' : Debian Developer - glaub...@debian.org `. `' Freie Universitaet Berlin - glaub...@physik.fu-berlin.de `- GPG: 62FF 8A75 84E0 2956 9546 0006 7426 3B37 F5B5 F913