rts/posix: Reduce heap allocation amount on mmap failure
authorBen Gamari <bgamari.foss@gmail.com>
Sun, 1 Nov 2015 09:18:41 +0000 (10:18 +0100)
committerBen Gamari <ben@smart-cactus.org>
Sun, 1 Nov 2015 09:18:52 +0000 (10:18 +0100)
commit4ad2a8f9a503a5ee060eb8e0d5ae71b98d605cfa
tree0b62a58a13f8f03da9a0344aa5057ded082c3785
parentc3b02150b516963422ed4b9b200a38814a35b535
rts/posix: Reduce heap allocation amount on mmap failure

Since the two-step allocator the RTS asks the kernel for a large upfront
mmap'd region of memory (on the order of terabytes). While we have no
expectation that this entire region will be backed by physical memory,
this scheme nevertheless fails on some systems with resource limits.
Here we use a back-off scheme to reduce our allocation request until we
find a size agreeable to the kernel. Fixes #10877.

This also fixes a latent bug wherein the heap reservation retry logic
would fail to free the previously reserved address space, which would
likely result in a heap allocation failure.

Test Plan:
set address space limit with `ulimit -v 67108864` and try running
a compiled program

Reviewers: simonmar, austin

Reviewed By: simonmar

Subscribers: thomie, RyanGlScott

Differential Revision: https://phabricator.haskell.org/D1405

GHC Trac Issues: #10877
rts/posix/OSMem.c
rts/sm/MBlock.c
rts/sm/OSMem.h
rts/win32/OSMem.c