Fix negative mutator time in GC stats in prof builds
authorÖmer Sinan Ağacan <omeragacan@gmail.com>
Fri, 28 Dec 2018 10:51:28 +0000 (13:51 +0300)
committerÖmer Sinan Ağacan <omeragacan@gmail.com>
Sat, 12 Jan 2019 11:52:38 +0000 (06:52 -0500)
commit19670bc397d858b04eb9b4eb01480f7f8c59e2f5
tree0e84040446183e032bcd05f2a8c1fd620ba1b9b2
parent74cd4ec5d2f9321aad5db3285cb60d78f2562996
Fix negative mutator time in GC stats in prof builds

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. New assertions added in this commit also revealed #16102,
which is also fixed by this commit.
rts/Schedule.c
rts/Stats.c
rts/Stats.h
testsuite/tests/profiling/should_run/Makefile
testsuite/tests/profiling/should_run/T15897.hs [new file with mode: 0644]
testsuite/tests/profiling/should_run/all.T