perf lock: Carefully combine lock stats for discarded entries
authorNamhyung Kim <namhyung@kernel.org>
Thu, 27 Jan 2022 00:00:50 +0000 (16:00 -0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 10 Feb 2022 18:43:56 +0000 (15:43 -0300)
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>
tools/perf/builtin-lock.c

index bbfeba7..57b9ebd 100644 (file)
@@ -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,