|
|
Message-Id: <20170718125259.19932-1-stevenrwalter@gmail.com>
Date: Tue, 18 Jul 2017 08:52:59 -0400
From: Steven Walter <stevenrwalter@...il.com>
To: musl@...ts.openwall.com
Cc: Steven Walter <stevenrwalter@...il.com>
Subject: [PATCH] malloc/expand_heap.c: really try to use all available memory
Previously expand_heap would ask for increasingly larger mmap areas
every time, in order to avoid allocating a bunch of small areas and
fragmenting memory. However, after a point, we may ask for an mmap area
so large that it can't possibly succeed, even though there is still
system memory available. This is particularly likely on a 32-bit system
with gigs of RAM, or else on a no-MMU system with pretty much any amount
of RAM. Without an MMU to make physically-discontiguous pages appear
contigious, the chance of any large mmap succeeding are very low.
To fix this, support decreasing mmap_step once we hit an allocation
failure. We'll try smaller and smaller amounts until we either ask for
a single page or exactly as many pages as we currently need. Only if
that fails do we fail the overall request.
---
src/malloc/expand_heap.c | 27 +++++++++++++++++++--------
1 file changed, 19 insertions(+), 8 deletions(-)
diff --git a/src/malloc/expand_heap.c b/src/malloc/expand_heap.c
index d8c0be7..6a0dae8 100644
--- a/src/malloc/expand_heap.c
+++ b/src/malloc/expand_heap.c
@@ -61,12 +61,23 @@ void *__expand_heap(size_t *pn)
return (void *)(brk-n);
}
- size_t min = (size_t)PAGE_SIZE << mmap_step/2;
- if (n < min) n = min;
- void *area = __mmap(0, n, PROT_READ|PROT_WRITE,
- MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
- if (area == MAP_FAILED) return 0;
- *pn = n;
- mmap_step++;
- return area;
+ while (1) {
+ size_t min = (size_t)PAGE_SIZE << mmap_step/2;
+ size_t size = n;
+ if (size < min) size = min;
+ void *area = __mmap(0, size, PROT_READ|PROT_WRITE,
+ MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+ if (area != MAP_FAILED) {
+ *pn = size;
+ mmap_step++;
+ return area;
+ }
+
+ // If we asked for a single page (or the exact allocation
+ // amount) and still didn't get it, we're toast
+ if (size == n || mmap_step < 2)
+ return 0;
+
+ mmap_step--;
+ }
}
--
2.7.4
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.