Hi Topi, On 11/11/21 19:04, Topi Miettinen wrote:
A bit surprisingly, mmap(2) returns ENOMEM when the virtual address space of the CPU is exceeded. The expectation could be EINVAL instead ("We don't like _addr_, length, or offset (e.g., they are _too large_, or not aligned on a page boundary)"). This is demonstrated with the following program: #include <stdio.h> #include <sys/mman.h> int main(void) { for (int i = 12; i < 64; i++) { void *addr = mmap((void *)(1UL << i), 4096, PROT_NONE, MAP_ANON | MAP_FIXED_NOREPLACE | MAP_PRIVATE, -1, 0); if (addr == MAP_FAILED) fprintf(stderr, "mmap %lx: %m\n", (1UL << i)); continue; munmap(addr, 4096); } } It gives the following output when running on CPU with 48 bit VA space: mmap 800000000000: Cannot allocate memory mmap 1000000000000: Cannot allocate memory mmap 2000000000000: Cannot allocate memory mmap 4000000000000: Cannot allocate memory mmap 8000000000000: Cannot allocate memory mmap 10000000000000: Cannot allocate memory mmap 20000000000000: Cannot allocate memory mmap 40000000000000: Cannot allocate memory mmap 80000000000000: Cannot allocate memory mmap 100000000000000: Cannot allocate memory mmap 200000000000000: Cannot allocate memory mmap 400000000000000: Cannot allocate memory mmap 800000000000000: Cannot allocate memory mmap 1000000000000000: Cannot allocate memory mmap 2000000000000000: Cannot allocate memory mmap 4000000000000000: Cannot allocate memory mmap 8000000000000000: Cannot allocate memory Signed-off-by: Topi Miettinen <toiwoton@xxxxxxxxx>
Patch applied! Thanks, Alex
--- man2/mmap.2 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/man2/mmap.2 b/man2/mmap.2 index 96b7444b0..59fd5c904 100644 --- a/man2/mmap.2 +++ b/man2/mmap.2 @@ -603,6 +603,11 @@ limit, described in .BR getrlimit (2), would have been exceeded. .TP +.B ENOMEM +We don't like +.IR addr , +because it exceeds the virtual address space of the CPU. +.TP .B EOVERFLOW On 32-bit architecture together with the large file extension (i.e., using 64-bit
-- Alejandro Colomar Linux man-pages comaintainer; http://www.kernel.org/doc/man-pages/ http://www.alejandro-colomar.es/