perf evlist: Make groups visible in evlist__format_evsels() output
authorIan Rogers <irogers@google.com>
Wed, 2 Apr 2025 20:15:48 +0000 (13:15 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 8 May 2025 15:51:40 +0000 (12:51 -0300)
Make groups visible in output:

Before:

{cycles,instructions} ->
cpu_atom/cycles/,cpu_atom/instructions/,cpu_core/cycles/,cpu_core/instructions/

After:

{cycles,instructions} ->
{cpu_atom/cycles/,cpu_atom/instructions/},{cpu_core/cycles/,cpu_core/instructions/}

Committer testing:

Before:

  root@number:~# perf record -e '{cycles,instructions,cache-misses}' /tmp/bla
  Failed to collect 'cycles,instructions,cache-misses' for the '/tmp/bla' workload: Permission denied
  root@number:~#

After:

  root@number:~# perf record -e '{cycles,instructions,cache-misses}' /tmp/bla
  Failed to collect '{cycles,instructions,cache-misses}' for the '/tmp/bla' workload: Permission denied
  root@number:~#

Reviewed-by: Kan Liang <kan.liang@linux.intel.com>
Signed-off-by: Ian Rogers <irogers@google.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Dominique Martinet <asmadeus@codewreck.org>
Cc: Dr. David Alan Gilbert <linux@treblig.org>
Cc: Howard Chu <howardchu95@gmail.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@linaro.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Levi Yun <yeoreum.yun@arm.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Weilin Wang <weilin.wang@intel.com>
Link: https://lore.kernel.org/r/20250402201549.4090305-5-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/evlist.c

index 140ac3ba8c119479170cfba179e0c35619f7d3da..05d1f4e8ee225e6946e3a5c3ee82b5cd15decb21 100644 (file)
@@ -2470,13 +2470,18 @@ struct evsel *evlist__find_evsel(struct evlist *evlist, int idx)
 
 void evlist__format_evsels(struct evlist *evlist, struct strbuf *sb, size_t max_length)
 {
-       struct evsel *evsel;
+       struct evsel *evsel, *leader = NULL;
        bool first = true;
 
        evlist__for_each_entry(evlist, evsel) {
+               struct evsel *new_leader = evsel__leader(evsel);
+
                if (evsel__is_dummy_event(evsel))
                        continue;
 
+               if (leader != new_leader && leader && leader->core.nr_members > 1)
+                       strbuf_addch(sb, '}');
+
                if (!first)
                        strbuf_addch(sb, ',');
 
@@ -2484,9 +2489,15 @@ void evlist__format_evsels(struct evlist *evlist, struct strbuf *sb, size_t max_
                        strbuf_addstr(sb, "...");
                        return;
                }
+               if (leader != new_leader && new_leader->core.nr_members > 1)
+                       strbuf_addch(sb, '{');
+
                strbuf_addstr(sb, evsel__name(evsel));
                first = false;
+               leader = new_leader;
        }
+       if (leader && leader->core.nr_members > 1)
+               strbuf_addch(sb, '}');
 }
 
 void evlist__check_mem_load_aux(struct evlist *evlist)