Allocate blocks in the GC in batches
authorSimon Marlow <marlowsd@gmail.com>
Sat, 9 Apr 2016 19:49:52 +0000 (20:49 +0100)
committerSimon Marlow <marlowsd@gmail.com>
Tue, 12 Apr 2016 10:14:06 +0000 (03:14 -0700)
commitf4446c5b963af8f3cc1693e2feab91dbe43d5237
tree861d9bb9fea7086459bb734498348226e5d06019
parent5c4cd0e44657d52f7ca5fee63f8765d17f1fbe85
Allocate blocks in the GC in batches

Avoids contention for the block allocator lock in the GC; this can be
seen in the gc_alloc_block_sync counter emitted by +RTS -s.

I experimented with this a while ago, and there was already
commented-out code for it in GCUtils.c, but I've now improved it so that
it doesn't result in significantly worse memory usage.

* The old method of putting spare blocks on ws->part_list was wasteful,
  the spare blocks are now shared between all generations and retained
  between GCs.

* repeated allocGroup() results in fragmentation, so I switched to using
  allocLargeChunk() instead which is fragmentation-friendly; we already
  use it for the same reason in nursery allocation.
includes/rts/storage/Block.h
rts/sm/GC.c
rts/sm/GCUtils.c
rts/sm/Sanity.c