Commit cb1898f5 authored by Namhyung Kim's avatar Namhyung Kim Committed by Arnaldo Carvalho de Melo

perf annotate-data: Support --skip-empty option

The --skip-empty option is to hide dummy events in a group.  Like other
output mode in 'perf report' and 'perf annotate', the data-type
profiling output should support the option.

Committer testing:

With dummy:

  root@number:~# perf annotate --stdio --group --data-type --skip-empty | head -24
  Annotate type: 'pthread_mutex_t' in /usr/lib64/libc.so.6 (50 samples):
   event[0] = cpu_atom/mem-loads,ldlat=30/P
   event[1] = cpu_atom/mem-stores/P
   event[2] = dummy:u
  ============================================================================
                   Percent     offset       size  field
    100.00  100.00    0.00          0         40  pthread_mutex_t	 {
    100.00  100.00    0.00          0         40      struct __pthread_mutex_s	__data {
     45.21   84.54    0.00          0          4          int	__lock;
      0.00    0.00    0.00          4          4          unsigned int	__count;
      0.00    1.83    0.00          8          4          int	__owner;
      5.19   10.65    0.00         12          4          unsigned int	__nusers;
     49.61    2.97    0.00         16          4          int	__kind;
      0.00    0.00    0.00         20          2          short int	__spins;
      0.00    0.00    0.00         22          2          short int	__elision;
      0.00    0.00    0.00         24         16          __pthread_list_t	__list {
      0.00    0.00    0.00         24          8              struct __pthread_internal_list*	__prev;
      0.00    0.00    0.00         32          8              struct __pthread_internal_list*	__next;
                                                          };
                                                      };
      0.00    0.00    0.00          0          0      char[]	__size;
     45.21   84.54    0.00          0          8      long int	__align;
                                                };
Skipping it:

  root@number:~# perf annotate --stdio --group --data-type --skip-empty | head -24
  Annotate type: 'pthread_mutex_t' in /usr/lib64/libc.so.6 (50 samples):
   event[0] = cpu_atom/mem-loads,ldlat=30/P
   event[1] = cpu_atom/mem-stores/P
  ============================================================================
           Percent     offset       size  field
    100.00  100.00          0         40  pthread_mutex_t	 {
    100.00  100.00          0         40      struct __pthread_mutex_s	__data {
     45.21   84.54          0          4          int	__lock;
      0.00    0.00          4          4          unsigned int	__count;
      0.00    1.83          8          4          int	__owner;
      5.19   10.65         12          4          unsigned int	__nusers;
     49.61    2.97         16          4          int	__kind;
      0.00    0.00         20          2          short int	__spins;
      0.00    0.00         22          2          short int	__elision;
      0.00    0.00         24         16          __pthread_list_t	__list {
      0.00    0.00         24          8              struct __pthread_internal_list*	__prev;
      0.00    0.00         32          8              struct __pthread_internal_list*	__next;
                                                  };
                                              };
      0.00    0.00          0          0      char[]	__size;
     45.21   84.54          0          8      long int	__align;
                                          };

  Annotate type: 'pthread_mutexattr_t' in /usr/lib64/libc.so.6 (1 samples):
  root@number:~#
Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20240807061713.1642924-1-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 336989d0
...@@ -46,15 +46,18 @@ static int get_member_overhead(struct annotated_data_type *adt, ...@@ -46,15 +46,18 @@ static int get_member_overhead(struct annotated_data_type *adt,
struct annotated_member *member = entry->data; struct annotated_member *member = entry->data;
int i, k; int i, k;
for (i = 0; i < member->size; i++) { for (i = 0, k = 0; i < member->size; i++) {
struct type_hist *h; struct type_hist *h;
struct evsel *evsel; struct evsel *evsel;
int offset = member->offset + i; int offset = member->offset + i;
for_each_group_evsel(evsel, leader) { for_each_group_evsel(evsel, leader) {
if (symbol_conf.skip_empty &&
evsel__hists(evsel)->stats.nr_samples == 0)
continue;
h = adt->histograms[evsel->core.idx]; h = adt->histograms[evsel->core.idx];
k = evsel__group_idx(evsel); update_hist_entry(&entry->hists[k++], &h->addr[offset]);
update_hist_entry(&entry->hists[k], &h->addr[offset]);
} }
} }
return 0; return 0;
...@@ -203,6 +206,7 @@ static void browser__write(struct ui_browser *uib, void *entry, int row) ...@@ -203,6 +206,7 @@ static void browser__write(struct ui_browser *uib, void *entry, int row)
struct annotated_data_type *adt = he->mem_type; struct annotated_data_type *adt = he->mem_type;
struct evsel *leader = hists_to_evsel(he->hists); struct evsel *leader = hists_to_evsel(he->hists);
struct evsel *evsel; struct evsel *evsel;
int idx = 0;
if (member == NULL) { if (member == NULL) {
bool current = ui_browser__is_current_entry(uib, row); bool current = ui_browser__is_current_entry(uib, row);
...@@ -219,9 +223,12 @@ static void browser__write(struct ui_browser *uib, void *entry, int row) ...@@ -219,9 +223,12 @@ static void browser__write(struct ui_browser *uib, void *entry, int row)
/* print the number */ /* print the number */
for_each_group_evsel(evsel, leader) { for_each_group_evsel(evsel, leader) {
struct type_hist *h = adt->histograms[evsel->core.idx]; struct type_hist *h = adt->histograms[evsel->core.idx];
int idx = evsel__group_idx(evsel);
browser__write_overhead(uib, h, &be->hists[idx], row); if (symbol_conf.skip_empty &&
evsel__hists(evsel)->stats.nr_samples == 0)
continue;
browser__write_overhead(uib, h, &be->hists[idx++], row);
} }
/* print type info */ /* print type info */
...@@ -300,8 +307,17 @@ int hist_entry__annotate_data_tui(struct hist_entry *he, struct evsel *evsel, ...@@ -300,8 +307,17 @@ int hist_entry__annotate_data_tui(struct hist_entry *he, struct evsel *evsel,
ui_helpline__push("Press ESC to exit"); ui_helpline__push("Press ESC to exit");
if (evsel__is_group_event(evsel)) if (evsel__is_group_event(evsel)) {
browser.nr_events = evsel->core.nr_members; struct evsel *pos;
int nr = 0;
for_each_group_evsel(pos, evsel) {
if (!symbol_conf.skip_empty ||
evsel__hists(pos)->stats.nr_samples)
nr++;
}
browser.nr_events = nr;
}
ret = annotated_data_browser__collect_entries(&browser); ret = annotated_data_browser__collect_entries(&browser);
if (ret == 0) if (ret == 0)
......
...@@ -1502,10 +1502,15 @@ static void print_annotated_data_header(struct hist_entry *he, struct evsel *evs ...@@ -1502,10 +1502,15 @@ static void print_annotated_data_header(struct hist_entry *he, struct evsel *evs
struct evsel *pos; struct evsel *pos;
int i = 0; int i = 0;
for_each_group_evsel(pos, evsel) nr_members = 0;
printf(" event[%d] = %s\n", i++, pos->name); for_each_group_evsel(pos, evsel) {
if (symbol_conf.skip_empty &&
evsel__hists(pos)->stats.nr_samples == 0)
continue;
nr_members = evsel->core.nr_members; printf(" event[%d] = %s\n", i++, pos->name);
nr_members++;
}
} }
if (symbol_conf.show_total_period) { if (symbol_conf.show_total_period) {
...@@ -1540,22 +1545,18 @@ static void print_annotated_data_type(struct annotated_data_type *mem_type, ...@@ -1540,22 +1545,18 @@ static void print_annotated_data_type(struct annotated_data_type *mem_type,
{ {
struct annotated_member *child; struct annotated_member *child;
struct type_hist *h = mem_type->histograms[evsel->core.idx]; struct type_hist *h = mem_type->histograms[evsel->core.idx];
int i, nr_events = 1, samples = 0; int i, nr_events = 0, samples = 0;
u64 period = 0; u64 period = 0;
int width = symbol_conf.show_total_period ? 11 : 7; int width = symbol_conf.show_total_period ? 11 : 7;
for (i = 0; i < member->size; i++) {
samples += h->addr[member->offset + i].nr_samples;
period += h->addr[member->offset + i].period;
}
print_annotated_data_value(h, period, samples);
if (evsel__is_group_event(evsel)) {
struct evsel *pos; struct evsel *pos;
for_each_group_member(pos, evsel) { for_each_group_evsel(pos, evsel) {
h = mem_type->histograms[pos->core.idx]; h = mem_type->histograms[pos->core.idx];
if (symbol_conf.skip_empty &&
evsel__hists(pos)->stats.nr_samples == 0)
continue;
samples = 0; samples = 0;
period = 0; period = 0;
for (i = 0; i < member->size; i++) { for (i = 0; i < member->size; i++) {
...@@ -1563,8 +1564,7 @@ static void print_annotated_data_type(struct annotated_data_type *mem_type, ...@@ -1563,8 +1564,7 @@ static void print_annotated_data_type(struct annotated_data_type *mem_type,
period += h->addr[member->offset + i].period; period += h->addr[member->offset + i].period;
} }
print_annotated_data_value(h, period, samples); print_annotated_data_value(h, period, samples);
} nr_events++;
nr_events = evsel->core.nr_members;
} }
printf(" %10d %10d %*s%s\t%s", printf(" %10d %10d %*s%s\t%s",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment