Skip to content

Fix negative mutator time in GC stats in prof builds

Ömer Sinan Ağacan requested to merge osa1/ghc:wip/T15897 into master

Because garbage collector calls retainerProfile() and heapCensus(), GC times normally include some of PROF times too. To fix this we have these lines:

// heapCensus() is called by the GC, so RP and HC time are
// included in the GC stats.  We therefore subtract them to
// obtain the actual GC cpu time.
stats.gc_cpu_ns      -=  prof_cpu;
stats.gc_elapsed_ns  -=  prof_elapsed;

These variables are later used for calculating GC time excluding the final GC (which should be attributed to EXIT).

exit_gc_elapsed      = stats.gc_elapsed_ns - start_exit_gc_elapsed;

The problem is if we subtract PROF times from gc_elapsed_ns and then subtract start_exit_gc_elapsed from the result, we end up subtracting PROF times twice, because start_exit_gc_elapsed also includes PROF times.

We now subtract PROF times from GC after the calculations for EXIT and MUT times. The existing assertion that checks

INIT + MUT + GC + EXIT = TOTAL

now holds. When we subtract PROF numbers from GC, and a new assertion

INIT + MUT + GC + PROF + EXIT = TOTAL

also holds.

Fixes #15897 (closed). New assertions added in this commit also revealed #16102 (closed), which is also fixed by this commit.

Edited by Ömer Sinan Ağacan

Merge request reports