summaryrefslogtreecommitdiff
path: root/rts
diff options
context:
space:
mode:
authorSergei Trofimovich <slyfox@gentoo.org>2018-07-18 23:36:58 +0100
committerSergei Trofimovich <slyfox@gentoo.org>2018-07-18 23:37:16 +0100
commite175aaf6918bb2b497b83618dc4c270a0d231a1c (patch)
treecbfd58e83f816de3daf7695f1abc6373d514e780 /rts
parentd0bbe1bf351c8b85c310afb0dd1fb1f12f9474bf (diff)
downloadhaskell-e175aaf6918bb2b497b83618dc4c270a0d231a1c.tar.gz
fix osReserveHeapMemory block alignment
Before the change osReserveHeapMemory() attempted to allocate chunks of memory via osTryReserveHeapMemory() not multiple of MBLOCK_SIZE in the following fallback code: ``` if (at == NULL) { *len -= *len / 8; ``` and caused assertion failure: ``` $ make fulltest TEST=T11607 WAY=threaded1 T11607: internal error: ASSERTION FAILED: file rts/posix/OSMem.c, line 457 (GHC version 8.7.20180716 for riscv64_unknown_linux) ``` The change applies alignment mask before each MBLOCK allocation attempt and fixes WAY=threaded1 test failures on qemu-riscv64. Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org> Test Plan: run 'make fulltest WAY=threaded1' Reviewers: simonmar, bgamari, erikd Reviewed By: simonmar Subscribers: rwbarton, thomie, carter Differential Revision: https://phabricator.haskell.org/D4982
Diffstat (limited to 'rts')
-rw-r--r--rts/posix/OSMem.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/rts/posix/OSMem.c b/rts/posix/OSMem.c
index e63e798be9..4063ad3550 100644
--- a/rts/posix/OSMem.c
+++ b/rts/posix/OSMem.c
@@ -441,6 +441,8 @@ osTryReserveHeapMemory (W_ len, void *hint)
void *base, *top;
void *start, *end;
+ ASSERT((len & ~MBLOCK_MASK) == len);
+
/* We try to allocate len + MBLOCK_SIZE,
because we need memory which is MBLOCK_SIZE aligned,
and then we discard what we don't need */
@@ -517,6 +519,8 @@ void *osReserveHeapMemory(void *startAddressPtr, W_ *len)
attempt = 0;
while (1) {
+ *len &= ~MBLOCK_MASK;
+
if (*len < MBLOCK_SIZE) {
// Give up if the system won't even give us 16 blocks worth of heap
barf("osReserveHeapMemory: Failed to allocate heap storage");