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

Authored by mpickering on Jun 6 2019, 8:07 AM.


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 Trac #16753 and Trac #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 Trac #16100 Trac #16753 Trac #15903 Trac #8982

(cherry picked from commit 1dc61c1ae7b80822612844d760eaebe6eb1f0ed4)


bgamariAug 21 2019, 5:36 AM
rGHCb802a7b2bf7b: rts: Correct assertion in LDV_recordDead