Skip to content
Snippets Groups Projects
Commit 07cffc49 authored by Matthew Pickering's avatar Matthew Pickering Committed by Marge Bot
Browse files

rts: Do not traverse nursery for dead closures in LDV profile

It is important that `heapCensus` and `LdvCensusForDead` traverse the
same areas.

`heapCensus` increases the `not_used` counter which tracks how many
closures are live but haven't been used yet.

`LdvCensusForDead` increases the `void_total` counter which tracks how
many dead closures there are.

The `LAG` is then calculated by substracting the `void_total` from
`not_used` and so it is essential that `not_used >= void_total`. This
fact is checked by quite a few assertions.

However, if a program has low maximum residency but allocates a lot in
the nursery then these assertions were failing (see #16753 and #15903)
because `LdvCensusForDead` was observing dead closures from the nursery
which totalled more than the `not_used`. The same closures were not
counted by `heapCensus`.

Therefore, it seems that the correct fix is to make `LdvCensusForDead`
agree with `heapCensus` and not traverse the nursery for dead closures.

Fixes #16100 #16753 #15903 #8982
parent ed4cbd93
No related branches found
No related tags found
No related merge requests found
......@@ -172,28 +172,6 @@ processHeapForDead( bdescr *bd )
}
}
/* --------------------------------------------------------------------------
* Calls processHeapClosureForDead() on every *dead* closures in the nursery.
* ----------------------------------------------------------------------- */
static void
processNurseryForDead( void )
{
StgPtr p;
bdescr *bd;
if (MainCapability.r.rNursery == NULL)
return;
for (bd = MainCapability.r.rNursery->blocks; bd != NULL; bd = bd->link) {
p = bd->start;
while (p < bd->free) {
while (p < bd->free && !*p) p++; // skip slop
if (p >= bd->free) break;
p += processHeapClosureForDead((StgClosure *)p);
}
}
}
/* --------------------------------------------------------------------------
* Calls processHeapClosureForDead() on every *dead* closures in the closure
* chain.
......@@ -233,7 +211,6 @@ LdvCensusForDead( uint32_t N )
//
barf("Lag/Drag/Void profiling not supported with -G1");
} else {
processNurseryForDead();
for (g = 0; g <= N; g++) {
processHeapForDead(generations[g].old_blocks);
processChainForDead(generations[g].large_objects);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment