From: Sergei Trofimovich Date: Wed, 18 Jul 2018 21:36:58 +0000 (+0100) Subject: fix osReserveHeapMemory block alignment X-Git-Tag: archive/raspbian/8.4.4+dfsg1-2+rpi1^2~9 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=eb457bd25f49cf5b4f3c11e2c06a71aa00a75c74;p=ghc.git fix osReserveHeapMemory block alignment 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 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 Gbp-Pq: Name e175aaf6918bb2b497b83618dc4c270a0d231a1c.patch --- diff --git a/rts/posix/OSMem.c b/rts/posix/OSMem.c index 2f0bf3fe..d60744c4 100644 --- a/rts/posix/OSMem.c +++ b/rts/posix/OSMem.c @@ -435,6 +435,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 */ @@ -502,6 +504,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");