Treat EPERM error from mmap as an OOM (#7500)
authorReid Barton <rwbarton@gmail.com>
Wed, 28 Aug 2013 20:16:08 +0000 (16:16 -0400)
committerAustin Seipp <aseipp@pobox.com>
Thu, 29 Aug 2013 22:45:59 +0000 (17:45 -0500)
commitacb91b920ebac992c52594adf605b2caf98ab4c0
treed42cb05f5a54d6b6349cb59658eee34b4a73376d
parent8940dd72cdcbade209963cdfd0f62b0fd6d7c492
Treat EPERM error from mmap as an OOM (#7500)

Linux can give back EPERM from an mmap call when a user program attempts
to map pages near `mmap_min_addr`, which is a kernel security measure to
prevent people from mapping pages at address 0. We may do this when we
hint to mmap what address to map the pages to.

However, it's theoretically possible we're not actually out of memory -
we could have continuously mapped pages at some other place far away
from `mmap_min_addr` and succeeded instead. So as an added precaution,
if mmap for a given addr gives us EPERM, we'll also attempt to map
*again*, but without the address hint. Maybe the kernel can do the right
thing.

However, while testing #7500, the amount of free address space we could
have otherwise used only turns out to be about 139MB. Which isn't really
a lot. So, given that, we *also* otherwise treat EPERM as an out of
memory error.

This fixes #7500.

Signed-off-by: Austin Seipp <aseipp@pobox.com>
rts/posix/OSMem.c