diff options
author | Namhyung Kim <namhyung@kernel.org> | 2022-01-26 16:00:50 -0800 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2022-02-10 15:43:56 -0300 |
commit | ea0ddc27e2608a4ac3075e5d3f6b6be1215f30e9 (patch) | |
tree | 65a99d332c8609bb44f6f3a196713beccb01f1b8 | |
parent | 0d435bf8c3f4d01d9547e87237977191573c6f5a (diff) |
perf lock: Carefully combine lock stats for discarded entries
Stats from discarded entries should be omitted.
But a lock class may have both good and bad entries.
If the first entry was bad, we can zero-fill the stats and only add good
stats if any.
The entry can remove the discard state if it finds a good entry later.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20220127000050.3011493-7-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r-- | tools/perf/builtin-lock.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c index bbfeba79426a..57b9ebd7118a 100644 --- a/tools/perf/builtin-lock.c +++ b/tools/perf/builtin-lock.c @@ -295,6 +295,9 @@ static void combine_lock_stats(struct lock_stat *st) ret = !!st->name - !!p->name; if (ret == 0) { + if (st->discard) + goto out; + p->nr_acquired += st->nr_acquired; p->nr_contended += st->nr_contended; p->wait_time_total += st->wait_time_total; @@ -307,6 +310,10 @@ static void combine_lock_stats(struct lock_stat *st) if (p->wait_time_max < st->wait_time_max) p->wait_time_max = st->wait_time_max; + /* now it got a new !discard record */ + p->discard = 0; + +out: st->combined = 1; return; } @@ -319,6 +326,15 @@ static void combine_lock_stats(struct lock_stat *st) rb_link_node(&st->rb, parent, rb); rb_insert_color(&st->rb, &sorted); + + if (st->discard) { + st->nr_acquired = 0; + st->nr_contended = 0; + st->wait_time_total = 0; + st->avg_wait_time = 0; + st->wait_time_min = ULLONG_MAX; + st->wait_time_max = 0; + } } static void insert_to_result(struct lock_stat *st, |