All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCHSET 0/6] perf annotate: Add TUI support for data type profiling (v1)
@ 2024-04-09 23:49 Namhyung Kim
  2024-04-09 23:49 ` [PATCH 1/6] perf annotate: Show progress of sample processing Namhyung Kim
                   ` (6 more replies)
  0 siblings, 7 replies; 22+ messages in thread
From: Namhyung Kim @ 2024-04-09 23:49 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Ian Rogers, Kan Liang
  Cc: Jiri Olsa, Adrian Hunter, Peter Zijlstra, Ingo Molnar, LKML,
	linux-perf-users

Hello,

This is to support interactive TUI browser for type annotation.

Like the normal (code) annotation, it should be able to display the data type
annotation.  Now `perf annotate --data-type` will show the result in TUI by
default if it's enabled.  Also `perf report -s type` can show the same output
using a menu item.

It's still in a very early stage and supports the basic functionalities only.
I'll work on more features like in the normal annotation browser later.

The code is also available at 'perf/annotate-data-tui-v1' branch at

  git://git.kernel.org/pub/scm/linux/kernel/git/namhyung/linux-perf.git

Thanks,
Namhyung


Namhyung Kim (6):
  perf annotate: Show progress of sample processing
  perf annotate-data: Add hist_entry__annotate_data_tty()
  perf annotate-data: Add hist_entry__annotate_data_tui()
  perf annotate-data: Support event group display in TUI
  perf report: Add a menu item to annotate data type in TUI
  perf report: Do not collect sample histogram unnecessarily

 tools/perf/builtin-annotate.c          | 149 ++++--------
 tools/perf/builtin-report.c            |   7 +-
 tools/perf/ui/browsers/Build           |   1 +
 tools/perf/ui/browsers/annotate-data.c | 312 +++++++++++++++++++++++++
 tools/perf/ui/browsers/hists.c         |  31 +++
 tools/perf/util/annotate-data.c        | 113 +++++++++
 tools/perf/util/annotate-data.h        |   6 +
 tools/perf/util/annotate.c             |   7 +
 8 files changed, 515 insertions(+), 111 deletions(-)
 create mode 100644 tools/perf/ui/browsers/annotate-data.c


base-commit: 9c3e9af74326978ba6f4432bb038e6c80f4f56fd
-- 
2.44.0.478.gd926399ef9-goog


^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH 1/6] perf annotate: Show progress of sample processing
  2024-04-09 23:49 [PATCHSET 0/6] perf annotate: Add TUI support for data type profiling (v1) Namhyung Kim
@ 2024-04-09 23:49 ` Namhyung Kim
  2024-04-09 23:49 ` [PATCH 2/6] perf annotate-data: Add hist_entry__annotate_data_tty() Namhyung Kim
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 22+ messages in thread
From: Namhyung Kim @ 2024-04-09 23:49 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Ian Rogers, Kan Liang
  Cc: Jiri Olsa, Adrian Hunter, Peter Zijlstra, Ingo Molnar, LKML,
	linux-perf-users

Like perf report, it can take a while to process samples.  Show the
progress window to inform users how long it'll take.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/builtin-annotate.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
index 16e1581207c9..332e1ddcacbd 100644
--- a/tools/perf/builtin-annotate.c
+++ b/tools/perf/builtin-annotate.c
@@ -37,6 +37,7 @@
 #include "util/map_symbol.h"
 #include "util/branch.h"
 #include "util/util.h"
+#include "ui/progress.h"
 
 #include <dlfcn.h>
 #include <errno.h>
@@ -665,13 +666,23 @@ static int __cmd_annotate(struct perf_annotate *ann)
 	evlist__for_each_entry(session->evlist, pos) {
 		struct hists *hists = evsel__hists(pos);
 		u32 nr_samples = hists->stats.nr_samples;
+		struct ui_progress prog;
 
 		if (nr_samples > 0) {
 			total_nr_samples += nr_samples;
-			hists__collapse_resort(hists, NULL);
+
+			ui_progress__init(&prog, nr_samples,
+					  "Merging related events...");
+			hists__collapse_resort(hists, &prog);
+			ui_progress__finish();
+
 			/* Don't sort callchain */
 			evsel__reset_sample_bit(pos, CALLCHAIN);
-			evsel__output_resort(pos, NULL);
+
+			ui_progress__init(&prog, nr_samples,
+					  "Sorting events for output...");
+			evsel__output_resort(pos, &prog);
+			ui_progress__finish();
 
 			/*
 			 * An event group needs to display other events too.
-- 
2.44.0.478.gd926399ef9-goog


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 2/6] perf annotate-data: Add hist_entry__annotate_data_tty()
  2024-04-09 23:49 [PATCHSET 0/6] perf annotate: Add TUI support for data type profiling (v1) Namhyung Kim
  2024-04-09 23:49 ` [PATCH 1/6] perf annotate: Show progress of sample processing Namhyung Kim
@ 2024-04-09 23:49 ` Namhyung Kim
  2024-04-09 23:49 ` [PATCH 3/6] perf annotate-data: Add hist_entry__annotate_data_tui() Namhyung Kim
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 22+ messages in thread
From: Namhyung Kim @ 2024-04-09 23:49 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Ian Rogers, Kan Liang
  Cc: Jiri Olsa, Adrian Hunter, Peter Zijlstra, Ingo Molnar, LKML,
	linux-perf-users

And move the related code into util/annotate-data.c file.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/builtin-annotate.c   | 106 +-----------------------------
 tools/perf/util/annotate-data.c | 110 ++++++++++++++++++++++++++++++++
 tools/perf/util/annotate-data.h |   3 +
 3 files changed, 114 insertions(+), 105 deletions(-)

diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
index 332e1ddcacbd..0812664faa54 100644
--- a/tools/perf/builtin-annotate.c
+++ b/tools/perf/builtin-annotate.c
@@ -329,108 +329,6 @@ static int hist_entry__tty_annotate(struct hist_entry *he,
 	return symbol__tty_annotate2(&he->ms, evsel);
 }
 
-static void print_annotated_data_header(struct hist_entry *he, struct evsel *evsel)
-{
-	struct dso *dso = map__dso(he->ms.map);
-	int nr_members = 1;
-	int nr_samples = he->stat.nr_events;
-	int width = 7;
-	const char *val_hdr = "Percent";
-
-	if (evsel__is_group_event(evsel)) {
-		struct hist_entry *pair;
-
-		list_for_each_entry(pair, &he->pairs.head, pairs.node)
-			nr_samples += pair->stat.nr_events;
-	}
-
-	printf("Annotate type: '%s' in %s (%d samples):\n",
-	       he->mem_type->self.type_name, dso->name, nr_samples);
-
-	if (evsel__is_group_event(evsel)) {
-		struct evsel *pos;
-		int i = 0;
-
-		for_each_group_evsel(pos, evsel)
-			printf(" event[%d] = %s\n", i++, pos->name);
-
-		nr_members = evsel->core.nr_members;
-	}
-
-	if (symbol_conf.show_total_period) {
-		width = 11;
-		val_hdr = "Period";
-	} else if (symbol_conf.show_nr_samples) {
-		width = 7;
-		val_hdr = "Samples";
-	}
-
-	printf("============================================================================\n");
-	printf("%*s %10s %10s  %s\n", (width + 1) * nr_members, val_hdr,
-	       "offset", "size", "field");
-}
-
-static void print_annotated_data_value(struct type_hist *h, u64 period, int nr_samples)
-{
-	double percent = h->period ? (100.0 * period / h->period) : 0;
-	const char *color = get_percent_color(percent);
-
-	if (symbol_conf.show_total_period)
-		color_fprintf(stdout, color, " %11" PRIu64, period);
-	else if (symbol_conf.show_nr_samples)
-		color_fprintf(stdout, color, " %7d", nr_samples);
-	else
-		color_fprintf(stdout, color, " %7.2f", percent);
-}
-
-static void print_annotated_data_type(struct annotated_data_type *mem_type,
-				      struct annotated_member *member,
-				      struct evsel *evsel, int indent)
-{
-	struct annotated_member *child;
-	struct type_hist *h = mem_type->histograms[evsel->core.idx];
-	int i, nr_events = 1, samples = 0;
-	u64 period = 0;
-	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;
-
-		for_each_group_member(pos, evsel) {
-			h = mem_type->histograms[pos->core.idx];
-
-			samples = 0;
-			period = 0;
-			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);
-		}
-		nr_events = evsel->core.nr_members;
-	}
-
-	printf(" %10d %10d  %*s%s\t%s",
-	       member->offset, member->size, indent, "", member->type_name,
-	       member->var_name ?: "");
-
-	if (!list_empty(&member->children))
-		printf(" {\n");
-
-	list_for_each_entry(child, &member->children, node)
-		print_annotated_data_type(mem_type, child, evsel, indent + 4);
-
-	if (!list_empty(&member->children))
-		printf("%*s}", (width + 1) * nr_events + 24 + indent, "");
-	printf(";\n");
-}
-
 static void print_annotate_data_stat(struct annotated_data_stat *s)
 {
 #define PRINT_STAT(fld) if (s->fld) printf("%10d : %s\n", s->fld, #fld)
@@ -571,9 +469,7 @@ static void hists__find_annotations(struct hists *hists,
 					goto find_next;
 			}
 
-			print_annotated_data_header(he, evsel);
-			print_annotated_data_type(he->mem_type, &he->mem_type->self, evsel, 0);
-			printf("\n");
+			hist_entry__annotate_data_tty(he, evsel);
 			goto find_next;
 		}
 
diff --git a/tools/perf/util/annotate-data.c b/tools/perf/util/annotate-data.c
index b69a1cd1577a..99c5dcdfc9df 100644
--- a/tools/perf/util/annotate-data.c
+++ b/tools/perf/util/annotate-data.c
@@ -19,6 +19,7 @@
 #include "evlist.h"
 #include "map.h"
 #include "map_symbol.h"
+#include "sort.h"
 #include "strbuf.h"
 #include "symbol.h"
 #include "symbol_conf.h"
@@ -1710,3 +1711,112 @@ int annotated_data_type__update_samples(struct annotated_data_type *adt,
 	h->addr[offset].period += period;
 	return 0;
 }
+
+static void print_annotated_data_header(struct hist_entry *he, struct evsel *evsel)
+{
+	struct dso *dso = map__dso(he->ms.map);
+	int nr_members = 1;
+	int nr_samples = he->stat.nr_events;
+	int width = 7;
+	const char *val_hdr = "Percent";
+
+	if (evsel__is_group_event(evsel)) {
+		struct hist_entry *pair;
+
+		list_for_each_entry(pair, &he->pairs.head, pairs.node)
+			nr_samples += pair->stat.nr_events;
+	}
+
+	printf("Annotate type: '%s' in %s (%d samples):\n",
+	       he->mem_type->self.type_name, dso->name, nr_samples);
+
+	if (evsel__is_group_event(evsel)) {
+		struct evsel *pos;
+		int i = 0;
+
+		for_each_group_evsel(pos, evsel)
+			printf(" event[%d] = %s\n", i++, pos->name);
+
+		nr_members = evsel->core.nr_members;
+	}
+
+	if (symbol_conf.show_total_period) {
+		width = 11;
+		val_hdr = "Period";
+	} else if (symbol_conf.show_nr_samples) {
+		width = 7;
+		val_hdr = "Samples";
+	}
+
+	printf("============================================================================\n");
+	printf("%*s %10s %10s  %s\n", (width + 1) * nr_members, val_hdr,
+	       "offset", "size", "field");
+}
+
+static void print_annotated_data_value(struct type_hist *h, u64 period, int nr_samples)
+{
+	double percent = h->period ? (100.0 * period / h->period) : 0;
+	const char *color = get_percent_color(percent);
+
+	if (symbol_conf.show_total_period)
+		color_fprintf(stdout, color, " %11" PRIu64, period);
+	else if (symbol_conf.show_nr_samples)
+		color_fprintf(stdout, color, " %7d", nr_samples);
+	else
+		color_fprintf(stdout, color, " %7.2f", percent);
+}
+
+static void print_annotated_data_type(struct annotated_data_type *mem_type,
+				      struct annotated_member *member,
+				      struct evsel *evsel, int indent)
+{
+	struct annotated_member *child;
+	struct type_hist *h = mem_type->histograms[evsel->core.idx];
+	int i, nr_events = 1, samples = 0;
+	u64 period = 0;
+	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;
+
+		for_each_group_member(pos, evsel) {
+			h = mem_type->histograms[pos->core.idx];
+
+			samples = 0;
+			period = 0;
+			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);
+		}
+		nr_events = evsel->core.nr_members;
+	}
+
+	printf(" %10d %10d  %*s%s\t%s",
+	       member->offset, member->size, indent, "", member->type_name,
+	       member->var_name ?: "");
+
+	if (!list_empty(&member->children))
+		printf(" {\n");
+
+	list_for_each_entry(child, &member->children, node)
+		print_annotated_data_type(mem_type, child, evsel, indent + 4);
+
+	if (!list_empty(&member->children))
+		printf("%*s}", (width + 1) * nr_events + 24 + indent, "");
+	printf(";\n");
+}
+
+void hist_entry__annotate_data_tty(struct hist_entry *he, struct evsel *evsel)
+{
+	print_annotated_data_header(he, evsel);
+	print_annotated_data_type(he->mem_type, &he->mem_type->self, evsel, 0);
+	printf("\n");
+}
diff --git a/tools/perf/util/annotate-data.h b/tools/perf/util/annotate-data.h
index fe1e53d6e8c7..037e2622b7a3 100644
--- a/tools/perf/util/annotate-data.h
+++ b/tools/perf/util/annotate-data.h
@@ -10,6 +10,7 @@
 struct annotated_op_loc;
 struct debuginfo;
 struct evsel;
+struct hist_entry;
 struct map_symbol;
 struct thread;
 
@@ -140,6 +141,8 @@ struct annotated_data_stat {
 };
 extern struct annotated_data_stat ann_data_stat;
 
+void hist_entry__annotate_data_tty(struct hist_entry *he, struct evsel *evsel);
+
 #ifdef HAVE_DWARF_SUPPORT
 
 /* Returns data type at the location (ip, reg, offset) */
-- 
2.44.0.478.gd926399ef9-goog


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 3/6] perf annotate-data: Add hist_entry__annotate_data_tui()
  2024-04-09 23:49 [PATCHSET 0/6] perf annotate: Add TUI support for data type profiling (v1) Namhyung Kim
  2024-04-09 23:49 ` [PATCH 1/6] perf annotate: Show progress of sample processing Namhyung Kim
  2024-04-09 23:49 ` [PATCH 2/6] perf annotate-data: Add hist_entry__annotate_data_tty() Namhyung Kim
@ 2024-04-09 23:49 ` Namhyung Kim
  2024-04-10 20:21   ` Arnaldo Carvalho de Melo
  2024-04-09 23:49 ` [PATCH 4/6] perf annotate-data: Support event group display in TUI Namhyung Kim
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 22+ messages in thread
From: Namhyung Kim @ 2024-04-09 23:49 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Ian Rogers, Kan Liang
  Cc: Jiri Olsa, Adrian Hunter, Peter Zijlstra, Ingo Molnar, LKML,
	linux-perf-users

Support data type profiling output on TUI.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/builtin-annotate.c          |  30 ++-
 tools/perf/ui/browsers/Build           |   1 +
 tools/perf/ui/browsers/annotate-data.c | 282 +++++++++++++++++++++++++
 tools/perf/util/annotate-data.c        |   5 +-
 tools/perf/util/annotate-data.h        |   5 +-
 5 files changed, 317 insertions(+), 6 deletions(-)
 create mode 100644 tools/perf/ui/browsers/annotate-data.c

diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
index 0812664faa54..6f7104f06c42 100644
--- a/tools/perf/builtin-annotate.c
+++ b/tools/perf/builtin-annotate.c
@@ -469,8 +469,32 @@ static void hists__find_annotations(struct hists *hists,
 					goto find_next;
 			}
 
-			hist_entry__annotate_data_tty(he, evsel);
-			goto find_next;
+			if (use_browser == 1)
+				key = hist_entry__annotate_data_tui(he, evsel, NULL);
+			else
+				key = hist_entry__annotate_data_tty(he, evsel);
+
+			switch (key) {
+			case -1:
+				if (!ann->skip_missing)
+					return;
+				/* fall through */
+			case K_RIGHT:
+			case '>':
+				next = rb_next(nd);
+				break;
+			case K_LEFT:
+			case '<':
+				next = rb_prev(nd);
+				break;
+			default:
+				return;
+			}
+
+			if (next != NULL)
+				nd = next;
+
+			continue;
 		}
 
 		if (use_browser == 2) {
@@ -873,9 +897,7 @@ int cmd_annotate(int argc, const char **argv)
 		use_browser = 2;
 #endif
 
-	/* FIXME: only support stdio for now */
 	if (annotate.data_type) {
-		use_browser = 0;
 		annotate_opts.annotate_src = false;
 		symbol_conf.annotate_data_member = true;
 		symbol_conf.annotate_data_sample = true;
diff --git a/tools/perf/ui/browsers/Build b/tools/perf/ui/browsers/Build
index 7a1d5ddaf688..2608b5da3167 100644
--- a/tools/perf/ui/browsers/Build
+++ b/tools/perf/ui/browsers/Build
@@ -1,4 +1,5 @@
 perf-y += annotate.o
+perf-y += annotate-data.o
 perf-y += hists.o
 perf-y += map.o
 perf-y += scripts.o
diff --git a/tools/perf/ui/browsers/annotate-data.c b/tools/perf/ui/browsers/annotate-data.c
new file mode 100644
index 000000000000..fefacaaf16db
--- /dev/null
+++ b/tools/perf/ui/browsers/annotate-data.c
@@ -0,0 +1,282 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <inttypes.h>
+#include <string.h>
+#include <sys/ttydefaults.h>
+
+#include "ui/browser.h"
+#include "ui/helpline.h"
+#include "ui/keysyms.h"
+#include "ui/ui.h"
+#include "util/annotate.h"
+#include "util/annotate-data.h"
+#include "util/evsel.h"
+#include "util/sort.h"
+
+struct annotated_data_browser {
+	struct ui_browser b;
+	struct list_head entries;
+};
+
+struct browser_entry {
+	struct list_head node;
+	struct annotated_member *data;
+	struct type_hist_entry hists;
+	int indent;
+};
+
+static void update_hist_entry(struct type_hist_entry *dst,
+			      struct type_hist_entry *src)
+{
+	dst->nr_samples += src->nr_samples;
+	dst->period += src->period;
+}
+
+static int get_member_overhead(struct annotated_data_type *adt,
+			       struct browser_entry *entry,
+			       struct evsel *evsel)
+{
+	struct annotated_member *member = entry->data;
+	int i;
+
+	for (i = 0; i < member->size; i++) {
+		struct type_hist *h;
+		int offset = member->offset + i;
+
+		h = adt->histograms[evsel->core.idx];
+		update_hist_entry(&entry->hists, &h->addr[offset]);
+	}
+	return 0;
+}
+
+static int add_child_entries(struct annotated_data_browser *browser,
+			     struct annotated_data_type *adt,
+			     struct annotated_member *member,
+			     struct evsel *evsel, int indent)
+{
+	struct annotated_member *pos;
+	struct browser_entry *entry;
+	int nr_entries = 0;
+
+	entry = zalloc(sizeof(*entry));
+	if (entry == NULL)
+		return -1;
+
+	entry->data = member;
+	entry->indent = indent;
+	if (get_member_overhead(adt, entry, evsel) < 0) {
+		free(entry);
+		return -1;
+	}
+
+	list_add_tail(&entry->node, &browser->entries);
+	nr_entries++;
+
+	list_for_each_entry(pos, &member->children, node) {
+		int nr = add_child_entries(browser, adt, pos, evsel, indent + 1);
+
+		if (nr < 0)
+			return nr;
+
+		nr_entries += nr;
+	}
+
+	/* add an entry for the closing bracket ("}") */
+	if (!list_empty(&member->children)) {
+		entry = zalloc(sizeof(*entry));
+		if (entry == NULL)
+			return -1;
+
+		entry->indent = indent;
+		list_add_tail(&entry->node, &browser->entries);
+		nr_entries++;
+	}
+
+	return nr_entries;
+}
+
+static int annotated_data_browser__collect_entries(struct annotated_data_browser *browser)
+{
+	struct hist_entry *he = browser->b.priv;
+	struct annotated_data_type *adt = he->mem_type;
+	struct evsel *evsel = hists_to_evsel(he->hists);
+
+	INIT_LIST_HEAD(&browser->entries);
+	browser->b.entries = &browser->entries;
+	browser->b.nr_entries = add_child_entries(browser, adt, &adt->self,
+						  evsel, /*indent=*/0);
+	return 0;
+}
+
+static void annotated_data_browser__delete_entries(struct annotated_data_browser *browser)
+{
+	struct browser_entry *pos, *tmp;
+
+	list_for_each_entry_safe(pos, tmp, &browser->entries, node) {
+		list_del_init(&pos->node);
+		free(pos);
+	}
+}
+
+static unsigned int browser__refresh(struct ui_browser *uib)
+{
+	return ui_browser__list_head_refresh(uib);
+}
+
+static int browser__show(struct ui_browser *uib)
+{
+	struct hist_entry *he = uib->priv;
+	struct annotated_data_type *adt = he->mem_type;
+	const char *help = "Press 'h' for help on key bindings";
+	char title[256];
+
+	snprintf(title, sizeof(title), "Annotate type: '%s' (%d samples)",
+		 adt->self.type_name, he->stat.nr_events);
+
+	if (ui_browser__show(uib, title, help) < 0)
+		return -1;
+
+	/* second line header */
+	ui_browser__gotorc_title(uib, 0, 0);
+	ui_browser__set_color(uib, HE_COLORSET_ROOT);
+
+	if (symbol_conf.show_total_period)
+		strcpy(title, "Period");
+	else if (symbol_conf.show_nr_samples)
+		strcpy(title, "Samples");
+	else
+		strcpy(title, "Percent");
+
+	ui_browser__printf(uib, " %10s %10s %10s  %s",
+			   title, "Offset", "Size", "Field");
+	ui_browser__write_nstring(uib, "", uib->width);
+	return 0;
+}
+
+static void browser__write_overhead(struct ui_browser *uib,
+				    struct type_hist *total,
+				    struct type_hist_entry *hist, int row)
+{
+	u64 period = hist->period;
+	double percent = total->period ? (100.0 * period / total->period) : 0;
+	bool current = ui_browser__is_current_entry(uib, row);
+	int nr_samples = 0;
+
+	ui_browser__set_percent_color(uib, percent, current);
+
+	if (symbol_conf.show_total_period)
+		ui_browser__printf(uib, " %10" PRIu64, period);
+	else if (symbol_conf.show_nr_samples)
+		ui_browser__printf(uib, " %10d", nr_samples);
+	else
+		ui_browser__printf(uib, " %10.2f", percent);
+
+	ui_browser__set_percent_color(uib, 0, current);
+}
+
+static void browser__write(struct ui_browser *uib, void *entry, int row)
+{
+	struct browser_entry *be = entry;
+	struct annotated_member *member = be->data;
+	struct hist_entry *he = uib->priv;
+	struct annotated_data_type *adt = he->mem_type;
+	struct evsel *evsel = hists_to_evsel(he->hists);
+
+	if (member == NULL) {
+		bool current = ui_browser__is_current_entry(uib, row);
+
+		/* print the closing bracket */
+		ui_browser__set_percent_color(uib, 0, current);
+		ui_browser__write_nstring(uib, "", 11);
+		ui_browser__printf(uib, " %10s %10s  %*s};",
+				   "", "", be->indent * 4, "");
+		ui_browser__write_nstring(uib, "", uib->width);
+		return;
+	}
+
+	/* print the number */
+	browser__write_overhead(uib, adt->histograms[evsel->core.idx],
+				&be->hists, row);
+
+	/* print type info */
+	if (be->indent == 0 && !member->var_name) {
+		ui_browser__printf(uib, " %10d %10d  %s%s",
+				   member->offset, member->size,
+				   member->type_name,
+				   list_empty(&member->children) ? ";" : " {");
+	} else {
+		ui_browser__printf(uib, " %10d %10d  %*s%s\t%s%s",
+				   member->offset, member->size,
+				   be->indent * 4, "", member->type_name,
+				   member->var_name ?: "",
+				   list_empty(&member->children) ? ";" : " {");
+	}
+	/* fill the rest */
+	ui_browser__write_nstring(uib, "", uib->width);
+}
+
+static int annotated_data_browser__run(struct annotated_data_browser *browser,
+				       struct evsel *evsel __maybe_unused,
+				       struct hist_browser_timer *hbt)
+{
+	int delay_secs = hbt ? hbt->refresh : 0;
+	int key;
+
+	if (browser__show(&browser->b) < 0)
+		return -1;
+
+	while (1) {
+		key = ui_browser__run(&browser->b, delay_secs);
+
+		switch (key) {
+		case K_TIMER:
+			if (hbt)
+				hbt->timer(hbt->arg);
+			continue;
+		case K_F1:
+		case 'h':
+			ui_browser__help_window(&browser->b,
+		"UP/DOWN/PGUP\n"
+		"PGDN/SPACE    Navigate\n"
+		"</>           Move to prev/next symbol\n"
+		"q/ESC/CTRL+C  Exit\n\n");
+			continue;
+		case K_LEFT:
+		case '<':
+		case '>':
+		case K_ESC:
+		case 'q':
+		case CTRL('c'):
+			goto out;
+		default:
+			continue;
+		}
+	}
+out:
+	ui_browser__hide(&browser->b);
+	return key;
+}
+
+int hist_entry__annotate_data_tui(struct hist_entry *he, struct evsel *evsel,
+				  struct hist_browser_timer *hbt)
+{
+	struct annotated_data_browser browser = {
+		.b = {
+			.refresh = browser__refresh,
+			.seek	 = ui_browser__list_head_seek,
+			.write	 = browser__write,
+			.priv	 = he,
+			.extra_title_lines = 1,
+		},
+	};
+	int ret;
+
+	ui_helpline__push("Press ESC to exit");
+
+	ret = annotated_data_browser__collect_entries(&browser);
+	if (ret == 0)
+		ret = annotated_data_browser__run(&browser, evsel, hbt);
+
+	annotated_data_browser__delete_entries(&browser);
+
+	return ret;
+}
diff --git a/tools/perf/util/annotate-data.c b/tools/perf/util/annotate-data.c
index 99c5dcdfc9df..1cd857400038 100644
--- a/tools/perf/util/annotate-data.c
+++ b/tools/perf/util/annotate-data.c
@@ -1814,9 +1814,12 @@ static void print_annotated_data_type(struct annotated_data_type *mem_type,
 	printf(";\n");
 }
 
-void hist_entry__annotate_data_tty(struct hist_entry *he, struct evsel *evsel)
+int hist_entry__annotate_data_tty(struct hist_entry *he, struct evsel *evsel)
 {
 	print_annotated_data_header(he, evsel);
 	print_annotated_data_type(he->mem_type, &he->mem_type->self, evsel, 0);
 	printf("\n");
+
+	/* move to the next entry */
+	return '>';
 }
diff --git a/tools/perf/util/annotate-data.h b/tools/perf/util/annotate-data.h
index 037e2622b7a3..9a6d9b519724 100644
--- a/tools/perf/util/annotate-data.h
+++ b/tools/perf/util/annotate-data.h
@@ -11,6 +11,7 @@ struct annotated_op_loc;
 struct debuginfo;
 struct evsel;
 struct hist_entry;
+struct hist_browser_timer;
 struct map_symbol;
 struct thread;
 
@@ -141,7 +142,9 @@ struct annotated_data_stat {
 };
 extern struct annotated_data_stat ann_data_stat;
 
-void hist_entry__annotate_data_tty(struct hist_entry *he, struct evsel *evsel);
+int hist_entry__annotate_data_tty(struct hist_entry *he, struct evsel *evsel);
+int hist_entry__annotate_data_tui(struct hist_entry *he, struct evsel *evsel,
+				  struct hist_browser_timer *hbt);
 
 #ifdef HAVE_DWARF_SUPPORT
 
-- 
2.44.0.478.gd926399ef9-goog


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 4/6] perf annotate-data: Support event group display in TUI
  2024-04-09 23:49 [PATCHSET 0/6] perf annotate: Add TUI support for data type profiling (v1) Namhyung Kim
                   ` (2 preceding siblings ...)
  2024-04-09 23:49 ` [PATCH 3/6] perf annotate-data: Add hist_entry__annotate_data_tui() Namhyung Kim
@ 2024-04-09 23:49 ` Namhyung Kim
  2024-04-10 19:52   ` Arnaldo Carvalho de Melo
  2024-04-10 20:24   ` Arnaldo Carvalho de Melo
  2024-04-09 23:49 ` [PATCH 5/6] perf report: Add a menu item to annotate data type " Namhyung Kim
                   ` (2 subsequent siblings)
  6 siblings, 2 replies; 22+ messages in thread
From: Namhyung Kim @ 2024-04-09 23:49 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Ian Rogers, Kan Liang
  Cc: Jiri Olsa, Adrian Hunter, Peter Zijlstra, Ingo Molnar, LKML,
	linux-perf-users

Like in stdio, it should print all events in a group together.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/ui/browsers/annotate-data.c | 50 ++++++++++++++++++++------
 1 file changed, 40 insertions(+), 10 deletions(-)

diff --git a/tools/perf/ui/browsers/annotate-data.c b/tools/perf/ui/browsers/annotate-data.c
index fefacaaf16db..a4a0f042f201 100644
--- a/tools/perf/ui/browsers/annotate-data.c
+++ b/tools/perf/ui/browsers/annotate-data.c
@@ -10,20 +10,27 @@
 #include "util/annotate.h"
 #include "util/annotate-data.h"
 #include "util/evsel.h"
+#include "util/evlist.h"
 #include "util/sort.h"
 
 struct annotated_data_browser {
 	struct ui_browser b;
 	struct list_head entries;
+	int nr_events;
 };
 
 struct browser_entry {
 	struct list_head node;
 	struct annotated_member *data;
-	struct type_hist_entry hists;
+	struct type_hist_entry *hists;
 	int indent;
 };
 
+static struct annotated_data_browser *get_browser(struct ui_browser *uib)
+{
+	return container_of(uib, struct annotated_data_browser, b);
+}
+
 static void update_hist_entry(struct type_hist_entry *dst,
 			      struct type_hist_entry *src)
 {
@@ -33,17 +40,21 @@ static void update_hist_entry(struct type_hist_entry *dst,
 
 static int get_member_overhead(struct annotated_data_type *adt,
 			       struct browser_entry *entry,
-			       struct evsel *evsel)
+			       struct evsel *leader)
 {
 	struct annotated_member *member = entry->data;
-	int i;
+	int i, k;
 
 	for (i = 0; i < member->size; i++) {
 		struct type_hist *h;
+		struct evsel *evsel;
 		int offset = member->offset + i;
 
-		h = adt->histograms[evsel->core.idx];
-		update_hist_entry(&entry->hists, &h->addr[offset]);
+		for_each_group_evsel(evsel, leader) {
+			h = adt->histograms[evsel->core.idx];
+			k = evsel__group_idx(evsel);
+			update_hist_entry(&entry->hists[k], &h->addr[offset]);
+		}
 	}
 	return 0;
 }
@@ -61,6 +72,12 @@ static int add_child_entries(struct annotated_data_browser *browser,
 	if (entry == NULL)
 		return -1;
 
+	entry->hists = calloc(browser->nr_events, sizeof(*entry->hists));
+	if (entry->hists == NULL) {
+		free(entry);
+		return -1;
+	}
+
 	entry->data = member;
 	entry->indent = indent;
 	if (get_member_overhead(adt, entry, evsel) < 0) {
@@ -113,6 +130,7 @@ static void annotated_data_browser__delete_entries(struct annotated_data_browser
 
 	list_for_each_entry_safe(pos, tmp, &browser->entries, node) {
 		list_del_init(&pos->node);
+		free(pos->hists);
 		free(pos);
 	}
 }
@@ -126,6 +144,7 @@ static int browser__show(struct ui_browser *uib)
 {
 	struct hist_entry *he = uib->priv;
 	struct annotated_data_type *adt = he->mem_type;
+	struct annotated_data_browser *browser = get_browser(uib);
 	const char *help = "Press 'h' for help on key bindings";
 	char title[256];
 
@@ -146,7 +165,8 @@ static int browser__show(struct ui_browser *uib)
 	else
 		strcpy(title, "Percent");
 
-	ui_browser__printf(uib, " %10s %10s %10s  %s",
+	ui_browser__printf(uib, "%*s %10s %10s %10s  %s",
+			   11 * (browser->nr_events - 1), "",
 			   title, "Offset", "Size", "Field");
 	ui_browser__write_nstring(uib, "", uib->width);
 	return 0;
@@ -175,18 +195,20 @@ static void browser__write_overhead(struct ui_browser *uib,
 
 static void browser__write(struct ui_browser *uib, void *entry, int row)
 {
+	struct annotated_data_browser *browser = get_browser(uib);
 	struct browser_entry *be = entry;
 	struct annotated_member *member = be->data;
 	struct hist_entry *he = uib->priv;
 	struct annotated_data_type *adt = he->mem_type;
-	struct evsel *evsel = hists_to_evsel(he->hists);
+	struct evsel *leader = hists_to_evsel(he->hists);
+	struct evsel *evsel;
 
 	if (member == NULL) {
 		bool current = ui_browser__is_current_entry(uib, row);
 
 		/* print the closing bracket */
 		ui_browser__set_percent_color(uib, 0, current);
-		ui_browser__write_nstring(uib, "", 11);
+		ui_browser__write_nstring(uib, "", 11 * browser->nr_events);
 		ui_browser__printf(uib, " %10s %10s  %*s};",
 				   "", "", be->indent * 4, "");
 		ui_browser__write_nstring(uib, "", uib->width);
@@ -194,8 +216,12 @@ static void browser__write(struct ui_browser *uib, void *entry, int row)
 	}
 
 	/* print the number */
-	browser__write_overhead(uib, adt->histograms[evsel->core.idx],
-				&be->hists, row);
+	for_each_group_evsel(evsel, leader) {
+		struct type_hist *h = adt->histograms[evsel->core.idx];
+		int idx = evsel__group_idx(evsel);
+
+		browser__write_overhead(uib, h, &be->hists[idx], row);
+	}
 
 	/* print type info */
 	if (be->indent == 0 && !member->var_name) {
@@ -267,11 +293,15 @@ int hist_entry__annotate_data_tui(struct hist_entry *he, struct evsel *evsel,
 			.priv	 = he,
 			.extra_title_lines = 1,
 		},
+		.nr_events = 1,
 	};
 	int ret;
 
 	ui_helpline__push("Press ESC to exit");
 
+	if (evsel__is_group_event(evsel))
+		browser.nr_events = evsel->core.nr_members;
+
 	ret = annotated_data_browser__collect_entries(&browser);
 	if (ret == 0)
 		ret = annotated_data_browser__run(&browser, evsel, hbt);
-- 
2.44.0.478.gd926399ef9-goog


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 5/6] perf report: Add a menu item to annotate data type in TUI
  2024-04-09 23:49 [PATCHSET 0/6] perf annotate: Add TUI support for data type profiling (v1) Namhyung Kim
                   ` (3 preceding siblings ...)
  2024-04-09 23:49 ` [PATCH 4/6] perf annotate-data: Support event group display in TUI Namhyung Kim
@ 2024-04-09 23:49 ` Namhyung Kim
  2024-04-10 20:46   ` Arnaldo Carvalho de Melo
  2024-04-09 23:50 ` [PATCH 6/6] perf report: Do not collect sample histogram unnecessarily Namhyung Kim
  2024-04-10 16:29 ` [PATCHSET 0/6] perf annotate: Add TUI support for data type profiling (v1) Ian Rogers
  6 siblings, 1 reply; 22+ messages in thread
From: Namhyung Kim @ 2024-04-09 23:49 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Ian Rogers, Kan Liang
  Cc: Jiri Olsa, Adrian Hunter, Peter Zijlstra, Ingo Molnar, LKML,
	linux-perf-users

When the hist entry has the type info, it should be able to display the
annotation browser for the type like in `perf annotate --data-type`.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/builtin-report.c    |  5 +++++
 tools/perf/ui/browsers/hists.c | 31 +++++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+)

diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index dcd93ee5fc24..aaa6427a1224 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -1694,6 +1694,11 @@ int cmd_report(int argc, const char **argv)
 	else
 		use_browser = 0;
 
+	if (report.data_type && use_browser == 1) {
+		symbol_conf.annotate_data_member = true;
+		symbol_conf.annotate_data_sample = true;
+	}
+
 	if (sort_order && strstr(sort_order, "ipc")) {
 		parse_options_usage(report_usage, options, "s", 1);
 		goto error;
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
index 0c02b3a8e121..71b32591d61a 100644
--- a/tools/perf/ui/browsers/hists.c
+++ b/tools/perf/ui/browsers/hists.c
@@ -38,6 +38,7 @@
 #include "../ui.h"
 #include "map.h"
 #include "annotate.h"
+#include "annotate-data.h"
 #include "srcline.h"
 #include "string2.h"
 #include "units.h"
@@ -2505,6 +2506,32 @@ add_annotate_opt(struct hist_browser *browser __maybe_unused,
 	return 1;
 }
 
+static int
+do_annotate_type(struct hist_browser *browser, struct popup_action *act)
+{
+	struct hist_entry *he = browser->he_selection;
+
+	hist_entry__annotate_data_tui(he, act->evsel, browser->hbt);
+	ui_browser__handle_resize(&browser->b);
+	return 0;
+}
+
+static int
+add_annotate_type_opt(struct hist_browser *browser,
+		      struct popup_action *act, char **optstr,
+		      struct hist_entry *he)
+{
+	if (he == NULL || he->mem_type == NULL || he->mem_type->histograms == NULL)
+		return 0;
+
+	if (asprintf(optstr, "Annotate type %s", he->mem_type->self.type_name) < 0)
+		return 0;
+
+	act->evsel = hists_to_evsel(browser->hists);
+	act->fn = do_annotate_type;
+	return 1;
+}
+
 static int
 do_zoom_thread(struct hist_browser *browser, struct popup_action *act)
 {
@@ -3307,6 +3334,10 @@ static int evsel__hists_browse(struct evsel *evsel, int nr_events, const char *h
 						       browser->he_selection->ip);
 		}
 skip_annotation:
+		nr_options += add_annotate_type_opt(browser,
+						    &actions[nr_options],
+						    &options[nr_options],
+						    browser->he_selection);
 		nr_options += add_thread_opt(browser, &actions[nr_options],
 					     &options[nr_options], thread);
 		nr_options += add_dso_opt(browser, &actions[nr_options],
-- 
2.44.0.478.gd926399ef9-goog


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 6/6] perf report: Do not collect sample histogram unnecessarily
  2024-04-09 23:49 [PATCHSET 0/6] perf annotate: Add TUI support for data type profiling (v1) Namhyung Kim
                   ` (4 preceding siblings ...)
  2024-04-09 23:49 ` [PATCH 5/6] perf report: Add a menu item to annotate data type " Namhyung Kim
@ 2024-04-09 23:50 ` Namhyung Kim
  2024-04-10 16:29 ` [PATCHSET 0/6] perf annotate: Add TUI support for data type profiling (v1) Ian Rogers
  6 siblings, 0 replies; 22+ messages in thread
From: Namhyung Kim @ 2024-04-09 23:50 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Ian Rogers, Kan Liang
  Cc: Jiri Olsa, Adrian Hunter, Peter Zijlstra, Ingo Molnar, LKML,
	linux-perf-users

The data type profiling alone doesn't need the sample histogram for
functions.  It only needs the histogram for the types.

Let's remove the condition in the report_callback to check the data type
profiling and make sure the annotation has the annotated_source before
calling symbol__disassemble().

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/builtin-report.c | 2 +-
 tools/perf/util/annotate.c  | 7 +++++++
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index aaa6427a1224..dafba6e030ef 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -172,7 +172,7 @@ static int hist_iter__report_callback(struct hist_entry_iter *iter,
 	struct mem_info *mi;
 	struct branch_info *bi;
 
-	if (!ui__has_annotation() && !rep->symbol_ipc && !rep->data_type)
+	if (!ui__has_annotation() && !rep->symbol_ipc)
 		return 0;
 
 	if (sort__mode == SORT_MODE__BRANCH) {
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
index 11da27801d88..7e034d2f2adb 100644
--- a/tools/perf/util/annotate.c
+++ b/tools/perf/util/annotate.c
@@ -908,6 +908,13 @@ int symbol__annotate(struct map_symbol *ms, struct evsel *evsel,
 
 	args.arch = arch;
 	args.ms = *ms;
+
+	if (notes->src == NULL) {
+		notes->src = annotated_source__new();
+		if (notes->src == NULL)
+			return -1;
+	}
+
 	if (annotate_opts.full_addr)
 		notes->src->start = map__objdump_2mem(ms->map, ms->sym->start);
 	else
-- 
2.44.0.478.gd926399ef9-goog


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* Re: [PATCHSET 0/6] perf annotate: Add TUI support for data type profiling (v1)
  2024-04-09 23:49 [PATCHSET 0/6] perf annotate: Add TUI support for data type profiling (v1) Namhyung Kim
                   ` (5 preceding siblings ...)
  2024-04-09 23:50 ` [PATCH 6/6] perf report: Do not collect sample histogram unnecessarily Namhyung Kim
@ 2024-04-10 16:29 ` Ian Rogers
  6 siblings, 0 replies; 22+ messages in thread
From: Ian Rogers @ 2024-04-10 16:29 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Arnaldo Carvalho de Melo, Kan Liang, Jiri Olsa, Adrian Hunter,
	Peter Zijlstra, Ingo Molnar, LKML, linux-perf-users

On Tue, Apr 9, 2024 at 4:50 PM Namhyung Kim <namhyung@kernel.org> wrote:
>
> Hello,
>
> This is to support interactive TUI browser for type annotation.
>
> Like the normal (code) annotation, it should be able to display the data type
> annotation.  Now `perf annotate --data-type` will show the result in TUI by
> default if it's enabled.  Also `perf report -s type` can show the same output
> using a menu item.
>
> It's still in a very early stage and supports the basic functionalities only.
> I'll work on more features like in the normal annotation browser later.
>
> The code is also available at 'perf/annotate-data-tui-v1' branch at
>
>   git://git.kernel.org/pub/scm/linux/kernel/git/namhyung/linux-perf.git
>
> Thanks,
> Namhyung
>
>
> Namhyung Kim (6):
>   perf annotate: Show progress of sample processing
>   perf annotate-data: Add hist_entry__annotate_data_tty()
>   perf annotate-data: Add hist_entry__annotate_data_tui()
>   perf annotate-data: Support event group display in TUI
>   perf report: Add a menu item to annotate data type in TUI
>   perf report: Do not collect sample histogram unnecessarily

Reviewed-by: Ian Rogers <irogers@google.com>

Thanks,
Ian

>  tools/perf/builtin-annotate.c          | 149 ++++--------
>  tools/perf/builtin-report.c            |   7 +-
>  tools/perf/ui/browsers/Build           |   1 +
>  tools/perf/ui/browsers/annotate-data.c | 312 +++++++++++++++++++++++++
>  tools/perf/ui/browsers/hists.c         |  31 +++
>  tools/perf/util/annotate-data.c        | 113 +++++++++
>  tools/perf/util/annotate-data.h        |   6 +
>  tools/perf/util/annotate.c             |   7 +
>  8 files changed, 515 insertions(+), 111 deletions(-)
>  create mode 100644 tools/perf/ui/browsers/annotate-data.c
>
>
> base-commit: 9c3e9af74326978ba6f4432bb038e6c80f4f56fd
> --
> 2.44.0.478.gd926399ef9-goog
>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 4/6] perf annotate-data: Support event group display in TUI
  2024-04-09 23:49 ` [PATCH 4/6] perf annotate-data: Support event group display in TUI Namhyung Kim
@ 2024-04-10 19:52   ` Arnaldo Carvalho de Melo
  2024-04-10 20:24   ` Arnaldo Carvalho de Melo
  1 sibling, 0 replies; 22+ messages in thread
From: Arnaldo Carvalho de Melo @ 2024-04-10 19:52 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Ian Rogers, Kan Liang, Jiri Olsa, Adrian Hunter, Peter Zijlstra,
	Ingo Molnar, LKML, linux-perf-users

On Tue, Apr 09, 2024 at 04:49:58PM -0700, Namhyung Kim wrote:
> Like in stdio, it should print all events in a group together.

Please provide the desired output, i.e. the "like in stdio", together
with the 'perf record' that creates a perf.data file that will then be
used with 'perf annotate' to produce the old output and then the new,
I'm trying to do that now to review the patch.

- Arnaldo
 
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> ---
>  tools/perf/ui/browsers/annotate-data.c | 50 ++++++++++++++++++++------
>  1 file changed, 40 insertions(+), 10 deletions(-)
> 
> diff --git a/tools/perf/ui/browsers/annotate-data.c b/tools/perf/ui/browsers/annotate-data.c
> index fefacaaf16db..a4a0f042f201 100644
> --- a/tools/perf/ui/browsers/annotate-data.c
> +++ b/tools/perf/ui/browsers/annotate-data.c
> @@ -10,20 +10,27 @@
>  #include "util/annotate.h"
>  #include "util/annotate-data.h"
>  #include "util/evsel.h"
> +#include "util/evlist.h"
>  #include "util/sort.h"
>  
>  struct annotated_data_browser {
>  	struct ui_browser b;
>  	struct list_head entries;
> +	int nr_events;
>  };
>  
>  struct browser_entry {
>  	struct list_head node;
>  	struct annotated_member *data;
> -	struct type_hist_entry hists;
> +	struct type_hist_entry *hists;
>  	int indent;
>  };
>  
> +static struct annotated_data_browser *get_browser(struct ui_browser *uib)
> +{
> +	return container_of(uib, struct annotated_data_browser, b);
> +}
> +
>  static void update_hist_entry(struct type_hist_entry *dst,
>  			      struct type_hist_entry *src)
>  {
> @@ -33,17 +40,21 @@ static void update_hist_entry(struct type_hist_entry *dst,
>  
>  static int get_member_overhead(struct annotated_data_type *adt,
>  			       struct browser_entry *entry,
> -			       struct evsel *evsel)
> +			       struct evsel *leader)
>  {
>  	struct annotated_member *member = entry->data;
> -	int i;
> +	int i, k;
>  
>  	for (i = 0; i < member->size; i++) {
>  		struct type_hist *h;
> +		struct evsel *evsel;
>  		int offset = member->offset + i;
>  
> -		h = adt->histograms[evsel->core.idx];
> -		update_hist_entry(&entry->hists, &h->addr[offset]);
> +		for_each_group_evsel(evsel, leader) {
> +			h = adt->histograms[evsel->core.idx];
> +			k = evsel__group_idx(evsel);
> +			update_hist_entry(&entry->hists[k], &h->addr[offset]);
> +		}
>  	}
>  	return 0;
>  }
> @@ -61,6 +72,12 @@ static int add_child_entries(struct annotated_data_browser *browser,
>  	if (entry == NULL)
>  		return -1;
>  
> +	entry->hists = calloc(browser->nr_events, sizeof(*entry->hists));
> +	if (entry->hists == NULL) {
> +		free(entry);
> +		return -1;
> +	}
> +
>  	entry->data = member;
>  	entry->indent = indent;
>  	if (get_member_overhead(adt, entry, evsel) < 0) {
> @@ -113,6 +130,7 @@ static void annotated_data_browser__delete_entries(struct annotated_data_browser
>  
>  	list_for_each_entry_safe(pos, tmp, &browser->entries, node) {
>  		list_del_init(&pos->node);
> +		free(pos->hists);
>  		free(pos);
>  	}
>  }
> @@ -126,6 +144,7 @@ static int browser__show(struct ui_browser *uib)
>  {
>  	struct hist_entry *he = uib->priv;
>  	struct annotated_data_type *adt = he->mem_type;
> +	struct annotated_data_browser *browser = get_browser(uib);
>  	const char *help = "Press 'h' for help on key bindings";
>  	char title[256];
>  
> @@ -146,7 +165,8 @@ static int browser__show(struct ui_browser *uib)
>  	else
>  		strcpy(title, "Percent");
>  
> -	ui_browser__printf(uib, " %10s %10s %10s  %s",
> +	ui_browser__printf(uib, "%*s %10s %10s %10s  %s",
> +			   11 * (browser->nr_events - 1), "",
>  			   title, "Offset", "Size", "Field");
>  	ui_browser__write_nstring(uib, "", uib->width);
>  	return 0;
> @@ -175,18 +195,20 @@ static void browser__write_overhead(struct ui_browser *uib,
>  
>  static void browser__write(struct ui_browser *uib, void *entry, int row)
>  {
> +	struct annotated_data_browser *browser = get_browser(uib);
>  	struct browser_entry *be = entry;
>  	struct annotated_member *member = be->data;
>  	struct hist_entry *he = uib->priv;
>  	struct annotated_data_type *adt = he->mem_type;
> -	struct evsel *evsel = hists_to_evsel(he->hists);
> +	struct evsel *leader = hists_to_evsel(he->hists);
> +	struct evsel *evsel;
>  
>  	if (member == NULL) {
>  		bool current = ui_browser__is_current_entry(uib, row);
>  
>  		/* print the closing bracket */
>  		ui_browser__set_percent_color(uib, 0, current);
> -		ui_browser__write_nstring(uib, "", 11);
> +		ui_browser__write_nstring(uib, "", 11 * browser->nr_events);
>  		ui_browser__printf(uib, " %10s %10s  %*s};",
>  				   "", "", be->indent * 4, "");
>  		ui_browser__write_nstring(uib, "", uib->width);
> @@ -194,8 +216,12 @@ static void browser__write(struct ui_browser *uib, void *entry, int row)
>  	}
>  
>  	/* print the number */
> -	browser__write_overhead(uib, adt->histograms[evsel->core.idx],
> -				&be->hists, row);
> +	for_each_group_evsel(evsel, leader) {
> +		struct type_hist *h = adt->histograms[evsel->core.idx];
> +		int idx = evsel__group_idx(evsel);
> +
> +		browser__write_overhead(uib, h, &be->hists[idx], row);
> +	}
>  
>  	/* print type info */
>  	if (be->indent == 0 && !member->var_name) {
> @@ -267,11 +293,15 @@ int hist_entry__annotate_data_tui(struct hist_entry *he, struct evsel *evsel,
>  			.priv	 = he,
>  			.extra_title_lines = 1,
>  		},
> +		.nr_events = 1,
>  	};
>  	int ret;
>  
>  	ui_helpline__push("Press ESC to exit");
>  
> +	if (evsel__is_group_event(evsel))
> +		browser.nr_events = evsel->core.nr_members;
> +
>  	ret = annotated_data_browser__collect_entries(&browser);
>  	if (ret == 0)
>  		ret = annotated_data_browser__run(&browser, evsel, hbt);
> -- 
> 2.44.0.478.gd926399ef9-goog

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 3/6] perf annotate-data: Add hist_entry__annotate_data_tui()
  2024-04-09 23:49 ` [PATCH 3/6] perf annotate-data: Add hist_entry__annotate_data_tui() Namhyung Kim
@ 2024-04-10 20:21   ` Arnaldo Carvalho de Melo
  2024-04-10 21:04     ` Arnaldo Carvalho de Melo
  0 siblings, 1 reply; 22+ messages in thread
From: Arnaldo Carvalho de Melo @ 2024-04-10 20:21 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Ian Rogers, Kan Liang, Jiri Olsa, Adrian Hunter, Peter Zijlstra,
	Ingo Molnar, LKML, linux-perf-users

On Tue, Apr 09, 2024 at 04:49:57PM -0700, Namhyung Kim wrote:
> Support data type profiling output on TUI.

Added the follow to the commit log message, to make reviewing easier.

As followup patches I think having the DSO name together with the type
is important, also I think we could have a first menu with all the pairs
of DSO/type, sorted top down by the types with most samples, wdyt?

Applied.

- Arnaldo

Committer testing:

First make sure that the debug information for your workload binaries
in embedded in them by building it with '-g' or install the debuginfo
packages, since our workload is 'find':

  root@number:~# type find
  find is hashed (/usr/bin/find)
  root@number:~# rpm -qf /usr/bin/find
  findutils-4.9.0-5.fc39.x86_64
  root@number:~# dnf debuginfo-install findutils
  <SNIP>
  root@number:~#

Then collect some data:

  root@number:~# echo 1 > /proc/sys/vm/drop_caches
  root@number:~# perf mem record find / > /dev/null
  [ perf record: Woken up 1 times to write data ]
  [ perf record: Captured and wrote 0.331 MB perf.data (3982 samples) ]
  root@number:~#

Finally do data-type annotation with the following command, that will
default, as 'perf report' to the --tui mode, with lines colored to
highlight the hotspots, etc.

  root@number:~# perf annotate --data-type
  Annotate type: 'struct predicate' (58 samples)
      Percent     Offset       Size  Field annotate --data-type
       100.00          0        312  struct predicate {
         0.00          0          8      PRED_FUNC        pred_func;
         0.00          8          8      char*    p_name;
         0.00         16          4      enum predicate_type      p_type;
         0.00         20          4      enum predicate_precedence        p_prec;
         0.00         24          1      _Bool    side_effects;
         0.00         25          1      _Bool    no_default_print;
         0.00         26          1      _Bool    need_stat;
         0.00         27          1      _Bool    need_type;
         0.00         28          1      _Bool    need_inum;
         0.00         32          4      enum EvaluationCost      p_cost;
         0.00         36          4      float    est_success_rate;
         0.00         40          1      _Bool    literal_control_chars;
         0.00         41          1      _Bool    artificial;
         0.00         48          8      char*    arg_text;
  <SNIP>

Reviewed-by: Ian Rogers <irogers@google.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
 
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> ---
>  tools/perf/builtin-annotate.c          |  30 ++-
>  tools/perf/ui/browsers/Build           |   1 +
>  tools/perf/ui/browsers/annotate-data.c | 282 +++++++++++++++++++++++++
>  tools/perf/util/annotate-data.c        |   5 +-
>  tools/perf/util/annotate-data.h        |   5 +-
>  5 files changed, 317 insertions(+), 6 deletions(-)
>  create mode 100644 tools/perf/ui/browsers/annotate-data.c
> 
> diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
> index 0812664faa54..6f7104f06c42 100644
> --- a/tools/perf/builtin-annotate.c
> +++ b/tools/perf/builtin-annotate.c
> @@ -469,8 +469,32 @@ static void hists__find_annotations(struct hists *hists,
>  					goto find_next;
>  			}
>  
> -			hist_entry__annotate_data_tty(he, evsel);
> -			goto find_next;
> +			if (use_browser == 1)
> +				key = hist_entry__annotate_data_tui(he, evsel, NULL);
> +			else
> +				key = hist_entry__annotate_data_tty(he, evsel);
> +
> +			switch (key) {
> +			case -1:
> +				if (!ann->skip_missing)
> +					return;
> +				/* fall through */
> +			case K_RIGHT:
> +			case '>':
> +				next = rb_next(nd);
> +				break;
> +			case K_LEFT:
> +			case '<':
> +				next = rb_prev(nd);
> +				break;
> +			default:
> +				return;
> +			}
> +
> +			if (next != NULL)
> +				nd = next;
> +
> +			continue;
>  		}
>  
>  		if (use_browser == 2) {
> @@ -873,9 +897,7 @@ int cmd_annotate(int argc, const char **argv)
>  		use_browser = 2;
>  #endif
>  
> -	/* FIXME: only support stdio for now */
>  	if (annotate.data_type) {
> -		use_browser = 0;
>  		annotate_opts.annotate_src = false;
>  		symbol_conf.annotate_data_member = true;
>  		symbol_conf.annotate_data_sample = true;
> diff --git a/tools/perf/ui/browsers/Build b/tools/perf/ui/browsers/Build
> index 7a1d5ddaf688..2608b5da3167 100644
> --- a/tools/perf/ui/browsers/Build
> +++ b/tools/perf/ui/browsers/Build
> @@ -1,4 +1,5 @@
>  perf-y += annotate.o
> +perf-y += annotate-data.o
>  perf-y += hists.o
>  perf-y += map.o
>  perf-y += scripts.o
> diff --git a/tools/perf/ui/browsers/annotate-data.c b/tools/perf/ui/browsers/annotate-data.c
> new file mode 100644
> index 000000000000..fefacaaf16db
> --- /dev/null
> +++ b/tools/perf/ui/browsers/annotate-data.c
> @@ -0,0 +1,282 @@
> +// SPDX-License-Identifier: GPL-2.0
> +#include <inttypes.h>
> +#include <string.h>
> +#include <sys/ttydefaults.h>
> +
> +#include "ui/browser.h"
> +#include "ui/helpline.h"
> +#include "ui/keysyms.h"
> +#include "ui/ui.h"
> +#include "util/annotate.h"
> +#include "util/annotate-data.h"
> +#include "util/evsel.h"
> +#include "util/sort.h"
> +
> +struct annotated_data_browser {
> +	struct ui_browser b;
> +	struct list_head entries;
> +};
> +
> +struct browser_entry {
> +	struct list_head node;
> +	struct annotated_member *data;
> +	struct type_hist_entry hists;
> +	int indent;
> +};
> +
> +static void update_hist_entry(struct type_hist_entry *dst,
> +			      struct type_hist_entry *src)
> +{
> +	dst->nr_samples += src->nr_samples;
> +	dst->period += src->period;
> +}
> +
> +static int get_member_overhead(struct annotated_data_type *adt,
> +			       struct browser_entry *entry,
> +			       struct evsel *evsel)
> +{
> +	struct annotated_member *member = entry->data;
> +	int i;
> +
> +	for (i = 0; i < member->size; i++) {
> +		struct type_hist *h;
> +		int offset = member->offset + i;
> +
> +		h = adt->histograms[evsel->core.idx];
> +		update_hist_entry(&entry->hists, &h->addr[offset]);
> +	}
> +	return 0;
> +}
> +
> +static int add_child_entries(struct annotated_data_browser *browser,
> +			     struct annotated_data_type *adt,
> +			     struct annotated_member *member,
> +			     struct evsel *evsel, int indent)
> +{
> +	struct annotated_member *pos;
> +	struct browser_entry *entry;
> +	int nr_entries = 0;
> +
> +	entry = zalloc(sizeof(*entry));
> +	if (entry == NULL)
> +		return -1;
> +
> +	entry->data = member;
> +	entry->indent = indent;
> +	if (get_member_overhead(adt, entry, evsel) < 0) {
> +		free(entry);
> +		return -1;
> +	}
> +
> +	list_add_tail(&entry->node, &browser->entries);
> +	nr_entries++;
> +
> +	list_for_each_entry(pos, &member->children, node) {
> +		int nr = add_child_entries(browser, adt, pos, evsel, indent + 1);
> +
> +		if (nr < 0)
> +			return nr;
> +
> +		nr_entries += nr;
> +	}
> +
> +	/* add an entry for the closing bracket ("}") */
> +	if (!list_empty(&member->children)) {
> +		entry = zalloc(sizeof(*entry));
> +		if (entry == NULL)
> +			return -1;
> +
> +		entry->indent = indent;
> +		list_add_tail(&entry->node, &browser->entries);
> +		nr_entries++;
> +	}
> +
> +	return nr_entries;
> +}
> +
> +static int annotated_data_browser__collect_entries(struct annotated_data_browser *browser)
> +{
> +	struct hist_entry *he = browser->b.priv;
> +	struct annotated_data_type *adt = he->mem_type;
> +	struct evsel *evsel = hists_to_evsel(he->hists);
> +
> +	INIT_LIST_HEAD(&browser->entries);
> +	browser->b.entries = &browser->entries;
> +	browser->b.nr_entries = add_child_entries(browser, adt, &adt->self,
> +						  evsel, /*indent=*/0);
> +	return 0;
> +}
> +
> +static void annotated_data_browser__delete_entries(struct annotated_data_browser *browser)
> +{
> +	struct browser_entry *pos, *tmp;
> +
> +	list_for_each_entry_safe(pos, tmp, &browser->entries, node) {
> +		list_del_init(&pos->node);
> +		free(pos);
> +	}
> +}
> +
> +static unsigned int browser__refresh(struct ui_browser *uib)
> +{
> +	return ui_browser__list_head_refresh(uib);
> +}
> +
> +static int browser__show(struct ui_browser *uib)
> +{
> +	struct hist_entry *he = uib->priv;
> +	struct annotated_data_type *adt = he->mem_type;
> +	const char *help = "Press 'h' for help on key bindings";
> +	char title[256];
> +
> +	snprintf(title, sizeof(title), "Annotate type: '%s' (%d samples)",
> +		 adt->self.type_name, he->stat.nr_events);
> +
> +	if (ui_browser__show(uib, title, help) < 0)
> +		return -1;
> +
> +	/* second line header */
> +	ui_browser__gotorc_title(uib, 0, 0);
> +	ui_browser__set_color(uib, HE_COLORSET_ROOT);
> +
> +	if (symbol_conf.show_total_period)
> +		strcpy(title, "Period");
> +	else if (symbol_conf.show_nr_samples)
> +		strcpy(title, "Samples");
> +	else
> +		strcpy(title, "Percent");
> +
> +	ui_browser__printf(uib, " %10s %10s %10s  %s",
> +			   title, "Offset", "Size", "Field");
> +	ui_browser__write_nstring(uib, "", uib->width);
> +	return 0;
> +}
> +
> +static void browser__write_overhead(struct ui_browser *uib,
> +				    struct type_hist *total,
> +				    struct type_hist_entry *hist, int row)
> +{
> +	u64 period = hist->period;
> +	double percent = total->period ? (100.0 * period / total->period) : 0;
> +	bool current = ui_browser__is_current_entry(uib, row);
> +	int nr_samples = 0;
> +
> +	ui_browser__set_percent_color(uib, percent, current);
> +
> +	if (symbol_conf.show_total_period)
> +		ui_browser__printf(uib, " %10" PRIu64, period);
> +	else if (symbol_conf.show_nr_samples)
> +		ui_browser__printf(uib, " %10d", nr_samples);
> +	else
> +		ui_browser__printf(uib, " %10.2f", percent);
> +
> +	ui_browser__set_percent_color(uib, 0, current);
> +}
> +
> +static void browser__write(struct ui_browser *uib, void *entry, int row)
> +{
> +	struct browser_entry *be = entry;
> +	struct annotated_member *member = be->data;
> +	struct hist_entry *he = uib->priv;
> +	struct annotated_data_type *adt = he->mem_type;
> +	struct evsel *evsel = hists_to_evsel(he->hists);
> +
> +	if (member == NULL) {
> +		bool current = ui_browser__is_current_entry(uib, row);
> +
> +		/* print the closing bracket */
> +		ui_browser__set_percent_color(uib, 0, current);
> +		ui_browser__write_nstring(uib, "", 11);
> +		ui_browser__printf(uib, " %10s %10s  %*s};",
> +				   "", "", be->indent * 4, "");
> +		ui_browser__write_nstring(uib, "", uib->width);
> +		return;
> +	}
> +
> +	/* print the number */
> +	browser__write_overhead(uib, adt->histograms[evsel->core.idx],
> +				&be->hists, row);
> +
> +	/* print type info */
> +	if (be->indent == 0 && !member->var_name) {
> +		ui_browser__printf(uib, " %10d %10d  %s%s",
> +				   member->offset, member->size,
> +				   member->type_name,
> +				   list_empty(&member->children) ? ";" : " {");
> +	} else {
> +		ui_browser__printf(uib, " %10d %10d  %*s%s\t%s%s",
> +				   member->offset, member->size,
> +				   be->indent * 4, "", member->type_name,
> +				   member->var_name ?: "",
> +				   list_empty(&member->children) ? ";" : " {");
> +	}
> +	/* fill the rest */
> +	ui_browser__write_nstring(uib, "", uib->width);
> +}
> +
> +static int annotated_data_browser__run(struct annotated_data_browser *browser,
> +				       struct evsel *evsel __maybe_unused,
> +				       struct hist_browser_timer *hbt)
> +{
> +	int delay_secs = hbt ? hbt->refresh : 0;
> +	int key;
> +
> +	if (browser__show(&browser->b) < 0)
> +		return -1;
> +
> +	while (1) {
> +		key = ui_browser__run(&browser->b, delay_secs);
> +
> +		switch (key) {
> +		case K_TIMER:
> +			if (hbt)
> +				hbt->timer(hbt->arg);
> +			continue;
> +		case K_F1:
> +		case 'h':
> +			ui_browser__help_window(&browser->b,
> +		"UP/DOWN/PGUP\n"
> +		"PGDN/SPACE    Navigate\n"
> +		"</>           Move to prev/next symbol\n"
> +		"q/ESC/CTRL+C  Exit\n\n");
> +			continue;
> +		case K_LEFT:
> +		case '<':
> +		case '>':
> +		case K_ESC:
> +		case 'q':
> +		case CTRL('c'):
> +			goto out;
> +		default:
> +			continue;
> +		}
> +	}
> +out:
> +	ui_browser__hide(&browser->b);
> +	return key;
> +}
> +
> +int hist_entry__annotate_data_tui(struct hist_entry *he, struct evsel *evsel,
> +				  struct hist_browser_timer *hbt)
> +{
> +	struct annotated_data_browser browser = {
> +		.b = {
> +			.refresh = browser__refresh,
> +			.seek	 = ui_browser__list_head_seek,
> +			.write	 = browser__write,
> +			.priv	 = he,
> +			.extra_title_lines = 1,
> +		},
> +	};
> +	int ret;
> +
> +	ui_helpline__push("Press ESC to exit");
> +
> +	ret = annotated_data_browser__collect_entries(&browser);
> +	if (ret == 0)
> +		ret = annotated_data_browser__run(&browser, evsel, hbt);
> +
> +	annotated_data_browser__delete_entries(&browser);
> +
> +	return ret;
> +}
> diff --git a/tools/perf/util/annotate-data.c b/tools/perf/util/annotate-data.c
> index 99c5dcdfc9df..1cd857400038 100644
> --- a/tools/perf/util/annotate-data.c
> +++ b/tools/perf/util/annotate-data.c
> @@ -1814,9 +1814,12 @@ static void print_annotated_data_type(struct annotated_data_type *mem_type,
>  	printf(";\n");
>  }
>  
> -void hist_entry__annotate_data_tty(struct hist_entry *he, struct evsel *evsel)
> +int hist_entry__annotate_data_tty(struct hist_entry *he, struct evsel *evsel)
>  {
>  	print_annotated_data_header(he, evsel);
>  	print_annotated_data_type(he->mem_type, &he->mem_type->self, evsel, 0);
>  	printf("\n");
> +
> +	/* move to the next entry */
> +	return '>';
>  }
> diff --git a/tools/perf/util/annotate-data.h b/tools/perf/util/annotate-data.h
> index 037e2622b7a3..9a6d9b519724 100644
> --- a/tools/perf/util/annotate-data.h
> +++ b/tools/perf/util/annotate-data.h
> @@ -11,6 +11,7 @@ struct annotated_op_loc;
>  struct debuginfo;
>  struct evsel;
>  struct hist_entry;
> +struct hist_browser_timer;
>  struct map_symbol;
>  struct thread;
>  
> @@ -141,7 +142,9 @@ struct annotated_data_stat {
>  };
>  extern struct annotated_data_stat ann_data_stat;
>  
> -void hist_entry__annotate_data_tty(struct hist_entry *he, struct evsel *evsel);
> +int hist_entry__annotate_data_tty(struct hist_entry *he, struct evsel *evsel);
> +int hist_entry__annotate_data_tui(struct hist_entry *he, struct evsel *evsel,
> +				  struct hist_browser_timer *hbt);
>  
>  #ifdef HAVE_DWARF_SUPPORT
>  
> -- 
> 2.44.0.478.gd926399ef9-goog
> 

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 4/6] perf annotate-data: Support event group display in TUI
  2024-04-09 23:49 ` [PATCH 4/6] perf annotate-data: Support event group display in TUI Namhyung Kim
  2024-04-10 19:52   ` Arnaldo Carvalho de Melo
@ 2024-04-10 20:24   ` Arnaldo Carvalho de Melo
  2024-04-10 20:38     ` Arnaldo Carvalho de Melo
  1 sibling, 1 reply; 22+ messages in thread
From: Arnaldo Carvalho de Melo @ 2024-04-10 20:24 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Ian Rogers, Kan Liang, Jiri Olsa, Adrian Hunter, Peter Zijlstra,
	Ingo Molnar, LKML, linux-perf-users

On Tue, Apr 09, 2024 at 04:49:58PM -0700, Namhyung Kim wrote:
> Like in stdio, it should print all events in a group together.

How to test this?

You mean something like:

root@number:~# perf record -a -e '{cpu_core/mem-loads,ldlat=30/P,cpu_core/mem-stores/P}'
^C[ perf record: Woken up 8 times to write data ]
[ perf record: Captured and wrote 4.980 MB perf.data (55825 samples) ]

root@number:~#

root@number:~# perf annotate --stdio --data-type

And then having the same output in the TUI?

Trying this...

- Arnaldo
 
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> ---
>  tools/perf/ui/browsers/annotate-data.c | 50 ++++++++++++++++++++------
>  1 file changed, 40 insertions(+), 10 deletions(-)
> 
> diff --git a/tools/perf/ui/browsers/annotate-data.c b/tools/perf/ui/browsers/annotate-data.c
> index fefacaaf16db..a4a0f042f201 100644
> --- a/tools/perf/ui/browsers/annotate-data.c
> +++ b/tools/perf/ui/browsers/annotate-data.c
> @@ -10,20 +10,27 @@
>  #include "util/annotate.h"
>  #include "util/annotate-data.h"
>  #include "util/evsel.h"
> +#include "util/evlist.h"
>  #include "util/sort.h"
>  
>  struct annotated_data_browser {
>  	struct ui_browser b;
>  	struct list_head entries;
> +	int nr_events;
>  };
>  
>  struct browser_entry {
>  	struct list_head node;
>  	struct annotated_member *data;
> -	struct type_hist_entry hists;
> +	struct type_hist_entry *hists;
>  	int indent;
>  };
>  
> +static struct annotated_data_browser *get_browser(struct ui_browser *uib)
> +{
> +	return container_of(uib, struct annotated_data_browser, b);
> +}
> +
>  static void update_hist_entry(struct type_hist_entry *dst,
>  			      struct type_hist_entry *src)
>  {
> @@ -33,17 +40,21 @@ static void update_hist_entry(struct type_hist_entry *dst,
>  
>  static int get_member_overhead(struct annotated_data_type *adt,
>  			       struct browser_entry *entry,
> -			       struct evsel *evsel)
> +			       struct evsel *leader)
>  {
>  	struct annotated_member *member = entry->data;
> -	int i;
> +	int i, k;
>  
>  	for (i = 0; i < member->size; i++) {
>  		struct type_hist *h;
> +		struct evsel *evsel;
>  		int offset = member->offset + i;
>  
> -		h = adt->histograms[evsel->core.idx];
> -		update_hist_entry(&entry->hists, &h->addr[offset]);
> +		for_each_group_evsel(evsel, leader) {
> +			h = adt->histograms[evsel->core.idx];
> +			k = evsel__group_idx(evsel);
> +			update_hist_entry(&entry->hists[k], &h->addr[offset]);
> +		}
>  	}
>  	return 0;
>  }
> @@ -61,6 +72,12 @@ static int add_child_entries(struct annotated_data_browser *browser,
>  	if (entry == NULL)
>  		return -1;
>  
> +	entry->hists = calloc(browser->nr_events, sizeof(*entry->hists));
> +	if (entry->hists == NULL) {
> +		free(entry);
> +		return -1;
> +	}
> +
>  	entry->data = member;
>  	entry->indent = indent;
>  	if (get_member_overhead(adt, entry, evsel) < 0) {
> @@ -113,6 +130,7 @@ static void annotated_data_browser__delete_entries(struct annotated_data_browser
>  
>  	list_for_each_entry_safe(pos, tmp, &browser->entries, node) {
>  		list_del_init(&pos->node);
> +		free(pos->hists);
>  		free(pos);
>  	}
>  }
> @@ -126,6 +144,7 @@ static int browser__show(struct ui_browser *uib)
>  {
>  	struct hist_entry *he = uib->priv;
>  	struct annotated_data_type *adt = he->mem_type;
> +	struct annotated_data_browser *browser = get_browser(uib);
>  	const char *help = "Press 'h' for help on key bindings";
>  	char title[256];
>  
> @@ -146,7 +165,8 @@ static int browser__show(struct ui_browser *uib)
>  	else
>  		strcpy(title, "Percent");
>  
> -	ui_browser__printf(uib, " %10s %10s %10s  %s",
> +	ui_browser__printf(uib, "%*s %10s %10s %10s  %s",
> +			   11 * (browser->nr_events - 1), "",
>  			   title, "Offset", "Size", "Field");
>  	ui_browser__write_nstring(uib, "", uib->width);
>  	return 0;
> @@ -175,18 +195,20 @@ static void browser__write_overhead(struct ui_browser *uib,
>  
>  static void browser__write(struct ui_browser *uib, void *entry, int row)
>  {
> +	struct annotated_data_browser *browser = get_browser(uib);
>  	struct browser_entry *be = entry;
>  	struct annotated_member *member = be->data;
>  	struct hist_entry *he = uib->priv;
>  	struct annotated_data_type *adt = he->mem_type;
> -	struct evsel *evsel = hists_to_evsel(he->hists);
> +	struct evsel *leader = hists_to_evsel(he->hists);
> +	struct evsel *evsel;
>  
>  	if (member == NULL) {
>  		bool current = ui_browser__is_current_entry(uib, row);
>  
>  		/* print the closing bracket */
>  		ui_browser__set_percent_color(uib, 0, current);
> -		ui_browser__write_nstring(uib, "", 11);
> +		ui_browser__write_nstring(uib, "", 11 * browser->nr_events);
>  		ui_browser__printf(uib, " %10s %10s  %*s};",
>  				   "", "", be->indent * 4, "");
>  		ui_browser__write_nstring(uib, "", uib->width);
> @@ -194,8 +216,12 @@ static void browser__write(struct ui_browser *uib, void *entry, int row)
>  	}
>  
>  	/* print the number */
> -	browser__write_overhead(uib, adt->histograms[evsel->core.idx],
> -				&be->hists, row);
> +	for_each_group_evsel(evsel, leader) {
> +		struct type_hist *h = adt->histograms[evsel->core.idx];
> +		int idx = evsel__group_idx(evsel);
> +
> +		browser__write_overhead(uib, h, &be->hists[idx], row);
> +	}
>  
>  	/* print type info */
>  	if (be->indent == 0 && !member->var_name) {
> @@ -267,11 +293,15 @@ int hist_entry__annotate_data_tui(struct hist_entry *he, struct evsel *evsel,
>  			.priv	 = he,
>  			.extra_title_lines = 1,
>  		},
> +		.nr_events = 1,
>  	};
>  	int ret;
>  
>  	ui_helpline__push("Press ESC to exit");
>  
> +	if (evsel__is_group_event(evsel))
> +		browser.nr_events = evsel->core.nr_members;
> +
>  	ret = annotated_data_browser__collect_entries(&browser);
>  	if (ret == 0)
>  		ret = annotated_data_browser__run(&browser, evsel, hbt);
> -- 
> 2.44.0.478.gd926399ef9-goog

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 4/6] perf annotate-data: Support event group display in TUI
  2024-04-10 20:24   ` Arnaldo Carvalho de Melo
@ 2024-04-10 20:38     ` Arnaldo Carvalho de Melo
  0 siblings, 0 replies; 22+ messages in thread
From: Arnaldo Carvalho de Melo @ 2024-04-10 20:38 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Ian Rogers, Kan Liang, Jiri Olsa, Adrian Hunter, Peter Zijlstra,
	Ingo Molnar, LKML, linux-perf-users

On Wed, Apr 10, 2024 at 05:24:56PM -0300, Arnaldo Carvalho de Melo wrote:
> On Tue, Apr 09, 2024 at 04:49:58PM -0700, Namhyung Kim wrote:
> > Like in stdio, it should print all events in a group together.
> 
> How to test this?
> 
> You mean something like:
> 
> root@number:~# perf record -a -e '{cpu_core/mem-loads,ldlat=30/P,cpu_core/mem-stores/P}'
> ^C[ perf record: Woken up 8 times to write data ]
> [ perf record: Captured and wrote 4.980 MB perf.data (55825 samples) ]
> 
> root@number:~#
> 
> root@number:~# perf annotate --stdio --data-type
> 
> And then having the same output in the TUI?
> 
> Trying this...

Added, the following, ok?

And the --stdio has all the missing info in TUI:

  Annotate type: 'union ' in /usr/lib64/libc.so.6 (1131 samples):
   event[0] = cpu_core/mem-loads,ldlat=30/P
   event[1] = cpu_core/mem-stores/P

Committer notes:

Collect it:

  root@number:~# perf record -a -e '{cpu_core/mem-loads,ldlat=30/P,cpu_core/mem-stores/P}'
  ^C[ perf record: Woken up 8 times to write data ]
  [ perf record: Captured and wrote 4.980 MB perf.data (55825 samples) ]
  root@number:~#

Then do it in stdio:

  root@number:~# perf annotate --stdio --data-type

  Annotate type: 'union ' in /usr/lib64/libc.so.6 (1131 samples):
   event[0] = cpu_core/mem-loads,ldlat=30/P
   event[1] = cpu_core/mem-stores/P
  ============================================================================
           Percent     offset       size  field
    100.00  100.00          0         40  union    {
    100.00  100.00          0         40      struct __pthread_mutex_s    __data {
     48.61   23.46          0          4          int     __lock;
      0.00    0.48          4          4          unsigned int    __count;
      6.38   41.32          8          4          int     __owner;
      8.74   34.02         12          4          unsigned int    __nusers;
     35.66    0.26         16          4          int     __kind;
      0.61    0.45         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;
     48.61   23.94          0          8      long int    __align;
                                          };

Now with TUI before this patch:

  root@number:~# perf annotate --tui --data-type
  Annotate type: 'union ' (790 samples)
      Percent     Offset       Size  Field
       100.00          0         40  union  {
       100.00          0         40      struct __pthread_mutex_s __data {
        48.61          0          4          int  __lock;
         0.00          4          4          unsigned int __count;
         6.38          8          4          int  __owner;
         8.74         12          4          unsigned int __nusers;
        35.66         16          4          int  __kind;
         0.61         20          2          short int    __spins;
         0.00         22          2          short int    __elision;
         0.00         24         16          __pthread_list_t     __list {
         0.00         24          8              struct __pthread_internal_list*  __prev;
         0.00         32          8              struct __pthread_internal_list*  __next;


         0.00          0          0      char*    __size;
        48.61          0          8      long int __align;
                                     };

And now after this patch:

Annotate type: 'union ' (790 samples)
               Percent     Offset       Size  Field
     100.00     100.00          0         40  union  {
     100.00     100.00          0         40      struct __pthread_mutex_s      __data {
      48.61      23.46          0          4          int       __lock;
       0.00       0.48          4          4          unsigned int      __count;
       6.38      41.32          8          4          int       __owner;
       8.74      34.02         12          4          unsigned int      __nusers;
      35.66       0.26         16          4          int       __kind;
       0.61       0.45         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;
      48.61      23.94          0          8      long int      __align;
                                              };

Reviewed-by: Ian Rogers <irogers@google.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 5/6] perf report: Add a menu item to annotate data type in TUI
  2024-04-09 23:49 ` [PATCH 5/6] perf report: Add a menu item to annotate data type " Namhyung Kim
@ 2024-04-10 20:46   ` Arnaldo Carvalho de Melo
  2024-04-10 20:50     ` Arnaldo Carvalho de Melo
  0 siblings, 1 reply; 22+ messages in thread
From: Arnaldo Carvalho de Melo @ 2024-04-10 20:46 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Ian Rogers, Kan Liang, Jiri Olsa, Adrian Hunter, Peter Zijlstra,
	Ingo Molnar, LKML, linux-perf-users

On Tue, Apr 09, 2024 at 04:49:59PM -0700, Namhyung Kim wrote:
> When the hist entry has the type info, it should be able to display the
> annotation browser for the type like in `perf annotate --data-type`.

Trying to test this with:

root@number:~# perf report --header-only |& grep "perf record"
# cmdline : /home/acme/bin/perf record -a -e {cpu_core/mem-loads,ldlat=30/P,cpu_core/mem-stores/P} 
root@number:~# perf evlist -v
cpu_core/mem-loads,ldlat=30/P: type: 4 (cpu_core), size: 136, config: 0x1cd (mem-loads), { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|CPU|PERIOD|IDENTIFIER, read_format: ID|LOST, disabled: 1, inherit: 1, freq: 1, precise_ip: 2, sample_id_all: 1, { bp_addr, config1 }: 0x1f
cpu_core/mem-stores/P: type: 4 (cpu_core), size: 136, config: 0x2cd (mem-stores), { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|CPU|PERIOD|IDENTIFIER, read_format: ID|LOST, inherit: 1, freq: 1, precise_ip: 3, sample_id_all: 1
dummy:u: type: 1 (software), size: 136, config: 0x9 (PERF_COUNT_SW_DUMMY), { sample_period, sample_freq }: 1, sample_type: IP|TID|TIME|CPU|IDENTIFIER, read_format: ID|LOST, inherit: 1, exclude_kernel: 1, exclude_hv: 1, mmap: 1, comm: 1, task: 1, sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1, ksymbol: 1, bpf_event: 1
root@number:~# perf report -s type

And when I press ESC to exit:

root@number:~# perf report -s type
perf: Segmentation fault
-------- backtrace --------
perf[0x61326b]
/lib64/libc.so.6(+0x3e9a0)[0x7f7173a5c9a0]
/lib64/libc.so.6(free+0x25)[0x7f7173abd385]
perf[0x5d5002]
perf[0x4fd007]
perf[0x523ce0]
perf[0x525ad4]
perf[0x503f43]
perf[0x557ad4]
perf[0x557eeb]
perf[0x4e5355]
perf[0x4dea42]
perf[0x528aad]
perf[0x42b559]
perf[0x4c39e9]
perf[0x4c3cf9]
perf[0x410e47]
/lib64/libc.so.6(+0x2814a)[0x7f7173a4614a]
/lib64/libc.so.6(__libc_start_main+0x8b)[0x7f7173a4620b]
perf[0x4113e5]
root@number:~#

Trying to build with debug info...

- Arnaldo
 
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> ---
>  tools/perf/builtin-report.c    |  5 +++++
>  tools/perf/ui/browsers/hists.c | 31 +++++++++++++++++++++++++++++++
>  2 files changed, 36 insertions(+)
> 
> diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
> index dcd93ee5fc24..aaa6427a1224 100644
> --- a/tools/perf/builtin-report.c
> +++ b/tools/perf/builtin-report.c
> @@ -1694,6 +1694,11 @@ int cmd_report(int argc, const char **argv)
>  	else
>  		use_browser = 0;
>  
> +	if (report.data_type && use_browser == 1) {
> +		symbol_conf.annotate_data_member = true;
> +		symbol_conf.annotate_data_sample = true;
> +	}
> +
>  	if (sort_order && strstr(sort_order, "ipc")) {
>  		parse_options_usage(report_usage, options, "s", 1);
>  		goto error;
> diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
> index 0c02b3a8e121..71b32591d61a 100644
> --- a/tools/perf/ui/browsers/hists.c
> +++ b/tools/perf/ui/browsers/hists.c
> @@ -38,6 +38,7 @@
>  #include "../ui.h"
>  #include "map.h"
>  #include "annotate.h"
> +#include "annotate-data.h"
>  #include "srcline.h"
>  #include "string2.h"
>  #include "units.h"
> @@ -2505,6 +2506,32 @@ add_annotate_opt(struct hist_browser *browser __maybe_unused,
>  	return 1;
>  }
>  
> +static int
> +do_annotate_type(struct hist_browser *browser, struct popup_action *act)
> +{
> +	struct hist_entry *he = browser->he_selection;
> +
> +	hist_entry__annotate_data_tui(he, act->evsel, browser->hbt);
> +	ui_browser__handle_resize(&browser->b);
> +	return 0;
> +}
> +
> +static int
> +add_annotate_type_opt(struct hist_browser *browser,
> +		      struct popup_action *act, char **optstr,
> +		      struct hist_entry *he)
> +{
> +	if (he == NULL || he->mem_type == NULL || he->mem_type->histograms == NULL)
> +		return 0;
> +
> +	if (asprintf(optstr, "Annotate type %s", he->mem_type->self.type_name) < 0)
> +		return 0;
> +
> +	act->evsel = hists_to_evsel(browser->hists);
> +	act->fn = do_annotate_type;
> +	return 1;
> +}
> +
>  static int
>  do_zoom_thread(struct hist_browser *browser, struct popup_action *act)
>  {
> @@ -3307,6 +3334,10 @@ static int evsel__hists_browse(struct evsel *evsel, int nr_events, const char *h
>  						       browser->he_selection->ip);
>  		}
>  skip_annotation:
> +		nr_options += add_annotate_type_opt(browser,
> +						    &actions[nr_options],
> +						    &options[nr_options],
> +						    browser->he_selection);
>  		nr_options += add_thread_opt(browser, &actions[nr_options],
>  					     &options[nr_options], thread);
>  		nr_options += add_dso_opt(browser, &actions[nr_options],
> -- 
> 2.44.0.478.gd926399ef9-goog

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 5/6] perf report: Add a menu item to annotate data type in TUI
  2024-04-10 20:46   ` Arnaldo Carvalho de Melo
@ 2024-04-10 20:50     ` Arnaldo Carvalho de Melo
  2024-04-11  0:30       ` Namhyung Kim
  0 siblings, 1 reply; 22+ messages in thread
From: Arnaldo Carvalho de Melo @ 2024-04-10 20:50 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Ian Rogers, Kan Liang, Jiri Olsa, Adrian Hunter, Peter Zijlstra,
	Ingo Molnar, LKML, linux-perf-users

On Wed, Apr 10, 2024 at 05:46:04PM -0300, Arnaldo Carvalho de Melo wrote:
> On Tue, Apr 09, 2024 at 04:49:59PM -0700, Namhyung Kim wrote:
> > When the hist entry has the type info, it should be able to display the
> > annotation browser for the type like in `perf annotate --data-type`.
> 
> Trying to test this with:
> 
> root@number:~# perf report --header-only |& grep "perf record"
> # cmdline : /home/acme/bin/perf record -a -e {cpu_core/mem-loads,ldlat=30/P,cpu_core/mem-stores/P} 
> root@number:~# perf evlist -v
> cpu_core/mem-loads,ldlat=30/P: type: 4 (cpu_core), size: 136, config: 0x1cd (mem-loads), { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|CPU|PERIOD|IDENTIFIER, read_format: ID|LOST, disabled: 1, inherit: 1, freq: 1, precise_ip: 2, sample_id_all: 1, { bp_addr, config1 }: 0x1f
> cpu_core/mem-stores/P: type: 4 (cpu_core), size: 136, config: 0x2cd (mem-stores), { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|CPU|PERIOD|IDENTIFIER, read_format: ID|LOST, inherit: 1, freq: 1, precise_ip: 3, sample_id_all: 1
> dummy:u: type: 1 (software), size: 136, config: 0x9 (PERF_COUNT_SW_DUMMY), { sample_period, sample_freq }: 1, sample_type: IP|TID|TIME|CPU|IDENTIFIER, read_format: ID|LOST, inherit: 1, exclude_kernel: 1, exclude_hv: 1, mmap: 1, comm: 1, task: 1, sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1, ksymbol: 1, bpf_event: 1
> root@number:~# perf report -s type
> 
> And when I press ESC to exit:
> 
> root@number:~# perf report -s type
> perf: Segmentation fault
> -------- backtrace --------
> perf[0x61326b]
> /lib64/libc.so.6(+0x3e9a0)[0x7f7173a5c9a0]
> /lib64/libc.so.6(free+0x25)[0x7f7173abd385]
> perf[0x5d5002]
> perf[0x4fd007]
> perf[0x523ce0]
> perf[0x525ad4]
> perf[0x503f43]
> perf[0x557ad4]
> perf[0x557eeb]
> perf[0x4e5355]
> perf[0x4dea42]
> perf[0x528aad]
> perf[0x42b559]
> perf[0x4c39e9]
> perf[0x4c3cf9]
> perf[0x410e47]
> /lib64/libc.so.6(+0x2814a)[0x7f7173a4614a]
> /lib64/libc.so.6(__libc_start_main+0x8b)[0x7f7173a4620b]
> perf[0x4113e5]
> root@number:~#
> 
> Trying to build with debug info...

Removing the O= dir and then trying with:

⬢[acme@toolbox perf-tools-next]$ alias m
alias m='rm -rf ~/libexec/perf-core/ ; make -k DEBUG=1 CORESIGHT=1 O=/tmp/build/$(basename $PWD)/ -C tools/perf install-bin && perf test python'
⬢[acme@toolbox perf-tools-next]$

I don't get a backtrace :-\ Ooops, sometimes I get it, but again without
resolving symbols:

root@number:~# perf report -s type
perf: Segmentation fault
-------- backtrace --------
perf[0x6b1087]
/lib64/libc.so.6(+0x3e9a0)[0x7fc15fa5c9a0]
/lib64/libc.so.6(free+0x25)[0x7fc15fabd385]
perf[0x66c2c0]
perf[0x66c363]
perf[0x553bc5]
perf[0x553d63]
perf[0x57ed76]
perf[0x58027e]
perf[0x5802bc]
perf[0x580325]
perf[0x5818aa]
perf[0x582241]
perf[0x58233c]
perf[0x5823fd]
perf[0x55c4ca]
perf[0x55c55f]
perf[0x5c36bf]
perf[0x5c1049]
perf[0x5c1197]
perf[0x5c7a4d]
perf[0x5c7ac7]
perf[0x531928]
perf[0x53196d]
perf[0x526a70]
perf[0x526b7d]
perf[0x585fd8]
perf[0x434503]
perf[0x5062c3]
perf[0x506532]
perf[0x506681]
perf[0x506978]
root@number:~#

Will try with gdb:

Lots of forks:

┌Merging related events...────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│                                 [  [                     from child process 2278982]                                                                                                        │
[Detaching after fork from child process 2278983]─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
[Detaching after fork from child process 2278984]
[Detaching after fork from child process 2278985]
[Detaching after fork from child process 2278986]
[Detaching after fork from child process 2278987]
[Detaching after fork from child process 2278988]
[Detaching after fork from child process 2278989]



                                                                                 ┌───────────────────────────┐                                                                                ▒
                                                                                 │Do you really want to exit?│                                                                                ▒
                                                                                 │                           │                                                                                ▒
                                                                                 │Enter: Yes, ESC: No        │                                                                                ▒
                                                                                 └───────────────────────────Program received signal SIGSEGV, Segmentation fault.                             ▒
                                                                                                                                                                 0x00007ffff6ebd385 in __GI___libc_free (mem=0x69647225202c3866) at malloc.c:3368                                                                                                                                            ▒
Downloading source file /usr/src/debug/glibc-2.38-17.fc39.x86_64/malloc/malloc.c                                                                                                              ▒
3368      if (chunk_is_mmapped (p))                       /* release mmapped memory. */                                                                                                        
(gdb) 

and:

(gdb) bt
#0  0x00007ffff6ebd385 in __GI___libc_free (mem=0x69647225202c3866) at malloc.c:3368                                                                                                          ▒
#1  0x000000000066c2c0 in delete_data_type_histograms (adt=0x8dedf0c0) at util/annotate-data.c:1655                                                                                           ▒
#2  0x000000000066c363 in annotated_data_type__tree_delete (root=0xe6bc68) at util/annotate-data.c:1669                                                                                       ▒
#3  0x0000000000553bc5 in dso__delete (dso=0xe6bbd0) at util/dso.c:1376                                                                                                                       ▒
#4  0x0000000000553d63 in dso__put (dso=0xe6bbd0) at util/dso.c:1409                                                                                                                          ▒
#5  0x000000000057ed76 in __dso__zput (dso=0xf5b540) at util/dso.h:262                                                                                                                        ▒
#6  0x000000000058027e in map__exit (map=0xf5b520) at util/map.c:300                                                                                                                          ▒
#7  0x00000000005802bc in map__delete (map=0xf5b520) at util/map.c:305cord -b ... ; perf report --total-cycles                                                                                ▒
#8  0x0000000000580325 in map__put (map=0xf5b520) at util/map.c:312
#9  0x00000000005818aa in __map__zput (map=0xf3e300) at util/map.h:196
#10 0x0000000000582241 in maps__exit (maps=0xf5aee0) at util/maps.c:246
#11 0x000000000058233c in maps__delete (maps=0xf5aee0) at util/maps.c:268
#12 0x00000000005823fd in maps__put (maps=0xf5aee0) at util/maps.c:285
#13 0x000000000055c4ca in __maps__zput (map=0x47856d8) at util/maps.h:32
#14 0x000000000055c55f in map_symbol__exit (ms=0x47856d8) at util/map_symbol.c:8
#15 0x00000000005c36bf in hist_entry__delete (he=0x4785660) at util/hist.c:1319
#16 0x00000000005c1049 in hists__delete_entry (hists=0xe68fe0, he=0x4785660) at util/hist.c:382
#17 0x00000000005c1197 in hists__delete_entries (hists=0xe68fe0) at util/hist.c:410
#18 0x00000000005c7a4d in hists__delete_all_entries (hists=0xe68fe0) at util/hist.c:2872
#19 0x00000000005c7ac7 in hists_evsel__exit (evsel=0xe68d70) at util/hist.c:2884
#20 0x0000000000531928 in evsel__exit (evsel=0xe68d70) at util/evsel.c:1489
#21 0x000000000053196d in evsel__delete (evsel=0xe68d70) at util/evsel.c:1497
#22 0x0000000000526a70 in evlist__purge (evlist=0xe67a00) at util/evlist.c:163
#23 0x0000000000526b7d in evlist__delete (evlist=0xe67a00) at util/evlist.c:185
#24 0x0000000000585fd8 in perf_session__delete (session=0xe670a0) at util/session.c:313
#25 0x0000000000434503 in cmd_report (argc=0, argv=0x7fffffffe430) at builtin-report.c:1828
#26 0x00000000005062c3 in run_builtin (p=0xe3f160 <commands+288>, argc=3, argv=0x7fffffffe430) at perf.c:350
#27 0x0000000000506532 in handle_internal_command (argc=3, argv=0x7fffffffe430) at perf.c:403
#28 0x0000000000506681 in run_argv (argcp=0x7fffffffe21c, argv=0x7fffffffe210) at perf.c:447
#29 0x0000000000506978 in main (argc=3, argv=0x7fffffffe430) at perf.c:561
(gdb) 

Continuing...

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 3/6] perf annotate-data: Add hist_entry__annotate_data_tui()
  2024-04-10 20:21   ` Arnaldo Carvalho de Melo
@ 2024-04-10 21:04     ` Arnaldo Carvalho de Melo
  2024-04-10 21:05       ` Arnaldo Carvalho de Melo
  0 siblings, 1 reply; 22+ messages in thread
From: Arnaldo Carvalho de Melo @ 2024-04-10 21:04 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Ian Rogers, Kan Liang, Jiri Olsa, Adrian Hunter, Peter Zijlstra,
	Ingo Molnar, LKML, linux-perf-users

On Wed, Apr 10, 2024 at 05:21:01PM -0300, Arnaldo Carvalho de Melo wrote:
> On Tue, Apr 09, 2024 at 04:49:57PM -0700, Namhyung Kim wrote:
> > Support data type profiling output on TUI.
> 
> Added the follow to the commit log message, to make reviewing easier.
> 
> As followup patches I think having the DSO name together with the type
> is important, also I think we could have a first menu with all the pairs
> of DSO/type, sorted top down by the types with most samples, wdyt?
> 
> Applied.
> 

There is something else here with the static build, checking...

[acme@toolbox perf-tools-next]$ git log --oneline -1 ; time make -C tools/perf build-test
4876ac6ab208b470 (HEAD -> perf-tools-next) perf tests: Remove dependency on lscpu
make: Entering directory '/home/acme/git/perf-tools-next/tools/perf'
- tarpkg: ./tests/perf-targz-src-pkg .
                 make_static: cd . && make LDFLAGS=-static NO_PERF_READ_VDSO32=1 NO_PERF_READ_VDSOX32=1 NO_JVMTI=1 NO_LIBTRACEEVENT=1 NO_LIBELF=1 -j28  DESTDIR=/tmp/tmp.jEtl6s5Npt
cd . && make LDFLAGS=-static NO_PERF_READ_VDSO32=1 NO_PERF_READ_VDSOX32=1 NO_JVMTI=1 NO_LIBTRACEEVENT=1 NO_LIBELF=1 -j28 DESTDIR=/tmp/tmp.jEtl6s5Npt
  BUILD:   Doing 'make -j28' parallel build
  HOSTCC  fixdep.o
  HOSTLD  fixdep-in.o
  LINK    fixdep
Warning: Kernel ABI header differences:
  diff -u tools/include/uapi/drm/i915_drm.h include/uapi/drm/i915_drm.h
  diff -u tools/include/uapi/linux/kvm.h include/uapi/linux/kvm.h
  diff -u tools/include/linux/bits.h include/linux/bits.h
  diff -u tools/arch/x86/include/asm/disabled-features.h arch/x86/include/asm/disabled-features.h
  diff -u tools/arch/x86/include/asm/cpufeatures.h arch/x86/include/asm/cpufeatures.h
  diff -u tools/arch/x86/include/asm/msr-index.h arch/x86/include/asm/msr-index.h
  diff -u tools/arch/x86/include/uapi/asm/kvm.h arch/x86/include/uapi/asm/kvm.h
  diff -u tools/arch/powerpc/include/uapi/asm/kvm.h arch/powerpc/include/uapi/asm/kvm.h
  diff -u tools/arch/s390/include/uapi/asm/kvm.h arch/s390/include/uapi/asm/kvm.h
  diff -u tools/arch/arm64/include/uapi/asm/kvm.h arch/arm64/include/uapi/asm/kvm.h
  diff -u tools/arch/arm64/include/asm/cputype.h arch/arm64/include/asm/cputype.h
  diff -u tools/perf/trace/beauty/arch/x86/include/asm/irq_vectors.h arch/x86/include/asm/irq_vectors.h
  diff -u tools/perf/trace/beauty/include/uapi/linux/fs.h include/uapi/linux/fs.h
  diff -u tools/perf/trace/beauty/include/uapi/linux/vhost.h include/uapi/linux/vhost.h
  diff -u tools/perf/trace/beauty/include/uapi/sound/asound.h include/uapi/sound/asound.h
Makefile.config:689: Warning: Disabled BPF skeletons as libelf is required by bpftool
Makefile.config:730: Disabling post unwind, no support found.
Makefile.config:798: No libcrypto.h found, disables jitted code injection, please install openssl-devel or libssl-dev
Makefile.config:810: slang not found, disables TUI support. Please install slang-devel, libslang-dev or libslang2-dev
Makefile.config:857: Missing perl devel files. Disabling perl scripting support, please install perl-ExtUtils-Embed/libperl-dev
Makefile.config:897: No 'Python.h' was found: disables Python support - please install python-devel/python-dev
Makefile.config:997: No liblzma found, disables xz kernel module decompression, please install xz-devel/liblzma-dev
Makefile.config:1010: No libzstd found, disables trace compression, please install libzstd-dev[el] and/or set LIBZSTD_DIR
Makefile.config:1021: No libcap found, disables capability support, please install libcap-devel/libcap-dev
Makefile.config:1034: No numa.h found, disables 'perf bench numa mem' benchmark, please install numactl-devel/libnuma-devel/libnuma-dev
Makefile.config:1093: No libbabeltrace found, disables 'perf data' CTF format support, please install libbabeltrace-dev[el]/libbabeltrace-ctf-dev
Makefile.config:1105: No libcapstone found, disables disasm engine support for 'perf script', please install libcapstone-dev/capstone-devel
Makefile.config:1170: libpfm4 not found, disables libpfm4 support. Please install libpfm4-dev

Auto-detecting system features:
...                                   dwarf: [ OFF ]
...                      dwarf_getlocations: [ OFF ]
...                                   glibc: [ on  ]
...                                  libbfd: [ OFF ]
...                          libbfd-buildid: [ OFF ]
...                                  libcap: [ OFF ]
...                                  libelf: [ OFF ]
...                                 libnuma: [ OFF ]
...                  numa_num_possible_cpus: [ OFF ]
...                                 libperl: [ OFF ]
...                               libpython: [ OFF ]
...                               libcrypto: [ OFF ]
...                               libunwind: [ OFF ]
...                      libdw-dwarf-unwind: [ OFF ]
...                             libcapstone: [ OFF ]
...                                    zlib: [ OFF ]
...                                    lzma: [ OFF ]
...                               get_cpuid: [ on  ]
...                                     bpf: [ on  ]
...                                  libaio: [ on  ]
...                                 libzstd: [ OFF ]

  GEN     common-cmds.h
  CC      dlfilters/dlfilter-test-api-v0.o
  CC      dlfilters/dlfilter-test-api-v2.o
  CC      dlfilters/dlfilter-show-cycles.o
  LINK    dlfilters/dlfilter-show-cycles.so
  GEN     /home/acme/git/perf-tools-next/tools/perf/arch/arm64/include/generated/asm/sysreg-defs.h
  LINK    dlfilters/dlfilter-test-api-v0.so
  LINK    dlfilters/dlfilter-test-api-v2.so
  PERF_VERSION = 6.8.g4876ac6ab208
  GEN     perf-archive
  GEN     perf-iostat
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libsubcmd/include/subcmd/exec-cmd.h
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libsubcmd/include/subcmd/help.h
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libsubcmd/include/subcmd/pager.h
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libsubcmd/include/subcmd/parse-options.h
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libsubcmd/include/subcmd/run-command.h
  CC      /home/acme/git/perf-tools-next/tools/perf/libsubcmd/help.o
  CC      /home/acme/git/perf-tools-next/tools/perf/libsubcmd/exec-cmd.o
  CC      /home/acme/git/perf-tools-next/tools/perf/libsubcmd/pager.o
  CC      /home/acme/git/perf-tools-next/tools/perf/libsubcmd/parse-options.o
  CC      /home/acme/git/perf-tools-next/tools/perf/libsubcmd/run-command.o
  CC      /home/acme/git/perf-tools-next/tools/perf/libsubcmd/sigchain.o
  CC      /home/acme/git/perf-tools-next/tools/perf/libsubcmd/subcmd-config.o
  INSTALL libsubcmd_headers
  LD      /home/acme/git/perf-tools-next/tools/perf/libsubcmd/libsubcmd-in.o
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/perf/bpf_perf.h
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/perf/cpumap.h
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/perf/core.h
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libapi/include/api/cpu.h
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/perf/threadmap.h
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/perf/evlist.h
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/perf/event.h
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/perf/mmap.h
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/perf/evsel.h
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/internal/cpumap.h
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libapi/include/api/debug.h
  CC      /home/acme/git/perf-tools-next/tools/perf/libperf/core.o
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/internal/evlist.h
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/internal/evsel.h
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libapi/include/api/fd/array.h
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libapi/include/api/io.h
  CC      /home/acme/git/perf-tools-next/tools/perf/libperf/cpumap.o
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/internal/lib.h
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/internal/mmap.h
  CC      /home/acme/git/perf-tools-next/tools/perf/libperf/threadmap.o
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libapi/include/api/fs/fs.h
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libapi/include/api/fs/tracing_path.h
  CC      /home/acme/git/perf-tools-next/tools/perf/libperf/evsel.o
  CC      /home/acme/git/perf-tools-next/tools/perf/libperf/evlist.o
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/internal/rc_check.h
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/internal/threadmap.h
  MKDIR   /home/acme/git/perf-tools-next/tools/perf/libapi/fd/
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/internal/xyarray.h
  CC      /home/acme/git/perf-tools-next/tools/perf/libperf/mmap.o
  CC      /home/acme/git/perf-tools-next/tools/perf/libapi/cpu.o
  CC      /home/acme/git/perf-tools-next/tools/perf/libperf/zalloc.o
  CC      /home/acme/git/perf-tools-next/tools/perf/libperf/xyarray.o
  MKDIR   /home/acme/git/perf-tools-next/tools/perf/libapi/fs/
  CC      /home/acme/git/perf-tools-next/tools/perf/libperf/lib.o
  MKDIR   /home/acme/git/perf-tools-next/tools/perf/libapi/fs/
  INSTALL libapi_headers
  CC      /home/acme/git/perf-tools-next/tools/perf/libapi/fd/array.o
  MKDIR   /home/acme/git/perf-tools-next/tools/perf/libapi/fs/
  INSTALL libperf_headers
  CC      /home/acme/git/perf-tools-next/tools/perf/libapi/debug.o
  CC      /home/acme/git/perf-tools-next/tools/perf/libapi/str_error_r.o
  CC      /home/acme/git/perf-tools-next/tools/perf/libapi/fs/fs.o
  AR      /home/acme/git/perf-tools-next/tools/perf/libsubcmd/libsubcmd.a
  CC      /home/acme/git/perf-tools-next/tools/perf/libapi/fs/tracing_path.o
  CC      /home/acme/git/perf-tools-next/tools/perf/libapi/fs/cgroup.o
  INSTALL /home/acme/git/perf-tools-next/tools/perf/libsymbol/include/symbol/kallsyms.h
  CC      /home/acme/git/perf-tools-next/tools/perf/libsymbol/kallsyms.o
  LD      /home/acme/git/perf-tools-next/tools/perf/libperf/libperf-in.o
  LD      /home/acme/git/perf-tools-next/tools/perf/libapi/fd/libapi-in.o
  INSTALL libsymbol_headers
  LD      /home/acme/git/perf-tools-next/tools/perf/libapi/fs/libapi-in.o
  AR      /home/acme/git/perf-tools-next/tools/perf/libperf/libperf.a
  LD      /home/acme/git/perf-tools-next/tools/perf/libsymbol/libsymbol-in.o
  LD      /home/acme/git/perf-tools-next/tools/perf/libapi/libapi-in.o
  AR      /home/acme/git/perf-tools-next/tools/perf/libsymbol/libsymbol.a
  AR      /home/acme/git/perf-tools-next/tools/perf/libapi/libapi.a
  CC      builtin-bench.o
  CC      builtin-annotate.o
  CC      builtin-config.o
  CC      builtin-diff.o
  CC      builtin-evlist.o
  CC      builtin-ftrace.o
  CC      builtin-help.o
  CC      builtin-buildid-list.o
  CC      builtin-buildid-cache.o
  CC      builtin-kallsyms.o
  CC      builtin-list.o
  CC      builtin-record.o
  CC      builtin-report.o
  CC      builtin-stat.o
  CC      builtin-top.o
  CC      builtin-script.o
  CC      builtin-kvm.o
  CC      builtin-inject.o
  CC      builtin-mem.o
  TEST    pmu-events/metric_test.log
  CC      builtin-data.o
  CC      builtin-version.o
  CC      builtin-c2c.o
  CC      builtin-daemon.o
  CC      bench/sched-messaging.o
  CC      arch/common.o
  CC      tests/builtin-test.o
  CC      perf.o
  CC      ui/setup.o
  LD      scripts/perf-in.o
  CC      tests/tests-scripts.o
  CC      bench/sched-pipe.o
  CC      tests/parse-events.o
  CC      ui/helpline.o
  CC      tests/dso-data.o
  CC      bench/sched-seccomp-notify.o
  CC      tests/attr.o
  CC      tests/vmlinux-kallsyms.o
  CC      ui/progress.o
  CC      bench/syscall.o
  CC      tests/perf-record.o
  CC      arch/x86/util/header.o
  CC      ui/util.o
  CC      bench/mem-functions.o
  CC      tests/evsel-roundtrip-name.o
  CC      tests/fdarray.o
  CC      tests/pmu.o
  CC      arch/x86/tests/arch-tests.o
  CC      ui/hist.o
  CC      bench/futex-hash.o
  CC      bench/futex-wake.o
  CC      bench/futex-wake-parallel.o
  CC      arch/x86/tests/sample-parsing.o
  CC      arch/x86/tests/hybrid.o
  CC      tests/pmu-events.o
  CC      arch/x86/tests/intel-pt-test.o
  CC      arch/x86/util/tsc.o
  CC      ui/stdio/hist.o
  CC      bench/futex-requeue.o
  CC      bench/futex-lock-pi.o
  CC      arch/x86/util/pmu.o
  CC      tests/hists_common.o
  CC      arch/x86/tests/bp-modify.o
  CC      arch/x86/util/perf_regs.o
  CC      arch/x86/util/topdown.o
  CC      bench/epoll-wait.o
  CC      arch/x86/tests/amd-ibs-via-core-pmu.o
  CC      arch/x86/util/machine.o
  CC      tests/hists_link.o
  CC      bench/epoll-ctl.o
  CC      arch/x86/util/event.o
  CC      bench/synthesize.o
  CC      tests/hists_filter.o
  CC      arch/x86/util/evlist.o
  CC      bench/kallsyms-parse.o
  CC      arch/x86/util/mem-events.o
  CC      bench/find-bit-bench.o
  CC      tests/hists_output.o
  CC      bench/inject-buildid.o
  CC      bench/evlist-open-close.o
  CC      tests/hists_cumulate.o
  CC      tests/python-use.o
  CC      bench/breakpoint.o
  CC      arch/x86/util/evsel.o
  LD      ui/perf-in.o
  CC      tests/bp_signal.o
  CC      arch/x86/util/iostat.o
  CC      bench/pmu-scan.o
  CC      bench/uprobe.o
  CC      arch/x86/util/env.o
  CC      util/arm64-frame-pointer-unwind-support.o
  CC      util/addr_location.o
  CC      bench/mem-memcpy-x86-64-asm.o
  LD      arch/x86/tests/perf-in.o
  CC      tests/bp_signal_overflow.o
  CC      arch/x86/util/auxtrace.o
  CC      bench/mem-memset-x86-64-asm.o
  CC      arch/x86/util/archinsn.o
  CC      tests/bp_account.o
  CC      arch/x86/util/intel-pt.o
  CC      util/annotate.o
  CC      arch/x86/util/intel-bts.o
  CC      util/block-info.o
  CC      tests/wp.o
  CC      util/block-range.o
  CC      util/build-id.o
  CC      tests/task-exit.o
  CC      util/cacheline.o
  CC      util/config.o
  CC      tests/sw-clock.o
  CC      util/copyfile.o
  CC      tests/mmap-thread-lookup.o
  CC      util/ctype.o
  CC      tests/thread-maps-share.o
  CC      tests/keep-tracking.o
  CC      util/db-export.o
  CC      tests/code-reading.o
  CC      util/disasm.o
  LD      bench/perf-in.o
  CC      util/env.o
  CC      tests/sample-parsing.o
  CC      util/event.o
  CC      tests/parse-no-sample-id-all.o
  CC      tests/kmod-path.o
  CC      tests/thread-map.o
  CC      util/evlist.o
  CC      tests/topology.o
  CC      util/sideband_evlist.o
  LD      arch/x86/util/perf-in.o
  CC      util/evsel.o
  CC      tests/mem.o
  CC      util/evsel_fprintf.o
  CC      tests/cpumap.o
  CC      tests/stat.o
  CC      util/perf_event_attr_fprintf.o
  CC      tests/event_update.o
  CC      util/evswitch.o
  CC      tests/event-times.o
  CC      util/find_bit.o
  CC      tests/expr.o
  CC      util/get_current_dir_name.o
  CC      tests/backward-ring-buffer.o
  CC      util/levenshtein.o
  CC      tests/sdt.o
  CC      tests/is_printable_array.o
  CC      util/mmap.o
  LD      arch/x86/perf-in.o
  CC      util/memswap.o
  CC      tests/bitmap.o
  BISON   util/parse-events-bison.c
  CC      tests/perf-hooks.o
  CC      util/print-events.o
  CC      tests/unit_number__scnprintf.o
  CC      util/tracepoint.o
  CC      util/perf_regs.o
  CC      tests/mem2node.o
  CC      util/perf-regs-arch/perf_regs_aarch64.o
  LD      arch/perf-in.o
  CC      tests/maps.o
  CC      util/perf-regs-arch/perf_regs_arm.o
  CC      tests/time-utils-test.o
  CC      util/arm-spe-decoder/arm-spe-pkt-decoder.o
  CC      util/intel-pt-decoder/intel-pt-pkt-decoder.o
  CC      util/arm-spe-decoder/arm-spe-decoder.o
  CC      tests/genelf.o
  CC      util/perf-regs-arch/perf_regs_csky.o
  CC      tests/api-io.o
  GEN     util/intel-pt-decoder/inat-tables.c
  CC      tests/demangle-java-test.o
  CC      util/perf-regs-arch/perf_regs_loongarch.o
  CC      util/path.o
  CC      util/perf-regs-arch/perf_regs_mips.o
  CC      tests/demangle-ocaml-test.o
  CC      util/hisi-ptt-decoder/hisi-ptt-pkt-decoder.o
  LD      util/scripting-engines/perf-in.o
  CC      util/perf-regs-arch/perf_regs_powerpc.o
  CC      util/print_binary.o
  CC      tests/pfm.o
  CC      util/perf-regs-arch/perf_regs_riscv.o
  CC      util/intel-pt-decoder/intel-pt-log.o
  CC      util/intel-pt-decoder/intel-pt-decoder.o
  CC      util/perf-regs-arch/perf_regs_s390.o
  CC      util/print_insn.o
  CC      tests/parse-metric.o
  CC      util/perf-regs-arch/perf_regs_x86.o
  CC      tests/pe-file-parsing.o
  CC      tests/expand-cgroup.o
  CC      util/rlimit.o
  CC      tests/perf-time-to-tsc.o
  CC      tests/dlfilter-test.o
  CC      util/argv_split.o
  LD      util/arm-spe-decoder/perf-in.o
  CC      tests/sigtrap.o
  CC      util/rbtree.o
  CC      util/libstring.o
  CC      tests/event_groups.o
  CC      util/bitmap.o
  LD      util/hisi-ptt-decoder/perf-in.o
  CC      util/hweight.o
  CC      util/smt.o
  CC      tests/symbols.o
  CC      tests/util.o
  LD      util/perf-regs-arch/perf-in.o
  CC      util/strbuf.o
  CC      util/string.o
  CC      util/strlist.o
  CC      util/strfilter.o
  CC      util/top.o
  CC      util/usage.o
  CC      tests/workloads/noploop.o
  GEN     pmu-events/pmu-events.c
  CC      util/dso.o
  CC      tests/workloads/thloop.o
  CC      util/dsos.o
  CC      tests/workloads/leafloop.o
  CC      tests/workloads/sqrtloop.o
  CC      tests/workloads/brstack.o
  CC      util/symbol.o
  CC      tests/workloads/datasym.o
  CC      util/symbol_fprintf.o
  CC      util/map_symbol.o
  CC      util/color.o
  CC      util/color_config.o
  CC      util/intel-pt-decoder/intel-pt-insn-decoder.o
  CC      util/metricgroup.o
  CC      util/header.o
  CC      util/callchain.o
  CC      util/values.o
  CC      util/debug.o
  CC      util/fncache.o
  CC      util/machine.o
  LD      tests/workloads/perf-in.o
  CC      util/map.o
  CC      util/maps.o
  CC      util/pstack.o
  CC      util/session.o
  LD      util/intel-pt-decoder/perf-in.o
  CC      util/sample-raw.o
  CC      util/s390-sample-raw.o
  CC      util/amd-sample-raw.o
  LD      tests/perf-in.o
  CC      util/ordered-events.o
  CC      util/namespaces.o
  CC      util/comm.o
  CC      util/threads.o
  CC      util/thread.o
  CC      util/thread_map.o
  BISON   util/pmu-bison.c
  CC      util/pmus.o
  CC      util/svghelper.o
  CC      util/trace-event-scripting.o
  CC      util/sort.o
  CC      util/hist.o
  CC      util/util.o
  CC      util/cpumap.o
  CC      util/affinity.o
  CC      util/cputopo.o
  CC      util/cgroup.o
  CC      util/target.o
  CC      util/rblist.o
  CC      util/intlist.o
  CC      util/vdso.o
  CC      util/counts.o
  CC      util/stat.o
  CC      util/stat-shadow.o
  CC      util/stat-display.o
  CC      util/perf_api_probe.o
  CC      util/record.o
  CC      util/srcline.o
  CC      util/srccode.o
  CC      util/synthetic-events.o
  CC      util/data.o
  CC      util/tsc.o
  CC      util/cloexec.o
  CC      util/call-path.o
  CC      util/rwsem.o
  CC      util/thread-stack.o
  CC      util/spark.o
  CC      util/topdown.o
  CC      util/iostat.o
  CC      util/stream.o
  CC      util/auxtrace.o
  CC      util/intel-pt.o
  CC      util/intel-bts.o
  CC      util/arm-spe.o
  CC      util/hisi-ptt.o
  CC      util/s390-cpumsf.o
  CC      util/cs-etm-base.o
  CC      util/parse-branch-options.o
  CC      util/dump-insn.o
  CC      util/parse-regs-options.o
  CC      util/parse-sublevel-options.o
  CC      util/term.o
  CC      util/help-unknown-cmd.o
  CC      util/dlfilter.o
  CC      util/mem-events.o
  CC      util/vsprintf.o
  CC      util/units.o
  CC      util/time-utils.o
  BISON   util/expr-bison.c
  CC      util/branch.o
  CC      util/mem2node.o
  CC      util/clockid.o
  CC      util/list_sort.o
  CC      util/mutex.o
  CC      util/sharded_mutex.o
  CC      util/hashmap.o
  CC      util/symbol-minimal.o
  CC      util/data-convert-json.o
  CC      util/demangle-ocaml.o
  CC      util/demangle-java.o
  CC      util/demangle-rust.o
  CC      util/perf-hooks.o
  FLEX    util/parse-events-flex.c
  FLEX    util/pmu-flex.c
  CC      util/parse-events-bison.o
  CC      util/pmu-bison.o
  CC      util/pmu.o
  CC      util/pmu-flex.o
  CC      util/parse-events.o
  CC      util/parse-events-flex.o
  FLEX    util/expr-flex.c
  CC      util/expr-bison.o
  CC      util/expr-flex.o
  CC      util/expr.o
  LD      util/perf-in.o
  LD      perf-in.o
  CC      pmu-events/pmu-events.o
  LD      pmu-events/pmu-events-in.o
  LINK    perf
/usr/bin/ld: perf-in.o: in function `dlfilter__new':
(.text+0x145617): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/bin/ld: perf-in.o: in function `target__parse_uid':
(.text+0x108cfe): warning: Using 'getpwnam_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/bin/ld: (.text+0x108d7b): warning: Using 'getpwuid_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/bin/ld: perf-in.o: in function `hists__find_annotations':
builtin-annotate.c:(.text+0x95f): undefined reference to `hist_entry__annotate_data_tty'
/usr/bin/ld: builtin-annotate.c:(.text+0xad3): undefined reference to `hist_entry__annotate_data_tui'
collect2: error: ld returned 1 exit status
make[4]: *** [Makefile.perf:733: perf] Error 1
make[3]: *** [Makefile.perf:264: sub-make] Error 2
make[2]: *** [Makefile:70: all] Error 2
  test: test -x ./perf
make[1]: *** [tests/make:330: make_static] Error 1
make: *** [Makefile:103: build-test] Error 2
make: Leaving directory '/home/acme/git/perf-tools-next/tools/perf'

real	0m21.481s
user	1m35.872s
sys	0m22.854s
⬢[acme@toolbox perf-tools-next]$ 



^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 3/6] perf annotate-data: Add hist_entry__annotate_data_tui()
  2024-04-10 21:04     ` Arnaldo Carvalho de Melo
@ 2024-04-10 21:05       ` Arnaldo Carvalho de Melo
  2024-04-10 21:12         ` Arnaldo Carvalho de Melo
  0 siblings, 1 reply; 22+ messages in thread
From: Arnaldo Carvalho de Melo @ 2024-04-10 21:05 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Ian Rogers, Kan Liang, Jiri Olsa, Adrian Hunter, Peter Zijlstra,
	Ingo Molnar, LKML, linux-perf-users

On Wed, Apr 10, 2024 at 06:04:26PM -0300, Arnaldo Carvalho de Melo wrote:
> On Wed, Apr 10, 2024 at 05:21:01PM -0300, Arnaldo Carvalho de Melo wrote:
> > On Tue, Apr 09, 2024 at 04:49:57PM -0700, Namhyung Kim wrote:
> > > Support data type profiling output on TUI.
> > 
> > Added the follow to the commit log message, to make reviewing easier.
> > 
> > As followup patches I think having the DSO name together with the type
> > is important, also I think we could have a first menu with all the pairs
> > of DSO/type, sorted top down by the types with most samples, wdyt?
> > 
> > Applied.
> > 
> 
> There is something else here with the static build, checking...

Probably because of:

Makefile.config:810: slang not found, disables TUI support. Please install slang-devel, libslang-dev or libslang2-dev

Fixing...

- Arnaldo
 
> [acme@toolbox perf-tools-next]$ git log --oneline -1 ; time make -C tools/perf build-test
> 4876ac6ab208b470 (HEAD -> perf-tools-next) perf tests: Remove dependency on lscpu
> make: Entering directory '/home/acme/git/perf-tools-next/tools/perf'
> - tarpkg: ./tests/perf-targz-src-pkg .
>                  make_static: cd . && make LDFLAGS=-static NO_PERF_READ_VDSO32=1 NO_PERF_READ_VDSOX32=1 NO_JVMTI=1 NO_LIBTRACEEVENT=1 NO_LIBELF=1 -j28  DESTDIR=/tmp/tmp.jEtl6s5Npt
> cd . && make LDFLAGS=-static NO_PERF_READ_VDSO32=1 NO_PERF_READ_VDSOX32=1 NO_JVMTI=1 NO_LIBTRACEEVENT=1 NO_LIBELF=1 -j28 DESTDIR=/tmp/tmp.jEtl6s5Npt
>   BUILD:   Doing 'make -j28' parallel build
>   HOSTCC  fixdep.o
>   HOSTLD  fixdep-in.o
>   LINK    fixdep
> Warning: Kernel ABI header differences:
>   diff -u tools/include/uapi/drm/i915_drm.h include/uapi/drm/i915_drm.h
>   diff -u tools/include/uapi/linux/kvm.h include/uapi/linux/kvm.h
>   diff -u tools/include/linux/bits.h include/linux/bits.h
>   diff -u tools/arch/x86/include/asm/disabled-features.h arch/x86/include/asm/disabled-features.h
>   diff -u tools/arch/x86/include/asm/cpufeatures.h arch/x86/include/asm/cpufeatures.h
>   diff -u tools/arch/x86/include/asm/msr-index.h arch/x86/include/asm/msr-index.h
>   diff -u tools/arch/x86/include/uapi/asm/kvm.h arch/x86/include/uapi/asm/kvm.h
>   diff -u tools/arch/powerpc/include/uapi/asm/kvm.h arch/powerpc/include/uapi/asm/kvm.h
>   diff -u tools/arch/s390/include/uapi/asm/kvm.h arch/s390/include/uapi/asm/kvm.h
>   diff -u tools/arch/arm64/include/uapi/asm/kvm.h arch/arm64/include/uapi/asm/kvm.h
>   diff -u tools/arch/arm64/include/asm/cputype.h arch/arm64/include/asm/cputype.h
>   diff -u tools/perf/trace/beauty/arch/x86/include/asm/irq_vectors.h arch/x86/include/asm/irq_vectors.h
>   diff -u tools/perf/trace/beauty/include/uapi/linux/fs.h include/uapi/linux/fs.h
>   diff -u tools/perf/trace/beauty/include/uapi/linux/vhost.h include/uapi/linux/vhost.h
>   diff -u tools/perf/trace/beauty/include/uapi/sound/asound.h include/uapi/sound/asound.h
> Makefile.config:689: Warning: Disabled BPF skeletons as libelf is required by bpftool
> Makefile.config:730: Disabling post unwind, no support found.
> Makefile.config:798: No libcrypto.h found, disables jitted code injection, please install openssl-devel or libssl-dev
> Makefile.config:810: slang not found, disables TUI support. Please install slang-devel, libslang-dev or libslang2-dev
> Makefile.config:857: Missing perl devel files. Disabling perl scripting support, please install perl-ExtUtils-Embed/libperl-dev
> Makefile.config:897: No 'Python.h' was found: disables Python support - please install python-devel/python-dev
> Makefile.config:997: No liblzma found, disables xz kernel module decompression, please install xz-devel/liblzma-dev
> Makefile.config:1010: No libzstd found, disables trace compression, please install libzstd-dev[el] and/or set LIBZSTD_DIR
> Makefile.config:1021: No libcap found, disables capability support, please install libcap-devel/libcap-dev
> Makefile.config:1034: No numa.h found, disables 'perf bench numa mem' benchmark, please install numactl-devel/libnuma-devel/libnuma-dev
> Makefile.config:1093: No libbabeltrace found, disables 'perf data' CTF format support, please install libbabeltrace-dev[el]/libbabeltrace-ctf-dev
> Makefile.config:1105: No libcapstone found, disables disasm engine support for 'perf script', please install libcapstone-dev/capstone-devel
> Makefile.config:1170: libpfm4 not found, disables libpfm4 support. Please install libpfm4-dev
> 
> Auto-detecting system features:
> ...                                   dwarf: [ OFF ]
> ...                      dwarf_getlocations: [ OFF ]
> ...                                   glibc: [ on  ]
> ...                                  libbfd: [ OFF ]
> ...                          libbfd-buildid: [ OFF ]
> ...                                  libcap: [ OFF ]
> ...                                  libelf: [ OFF ]
> ...                                 libnuma: [ OFF ]
> ...                  numa_num_possible_cpus: [ OFF ]
> ...                                 libperl: [ OFF ]
> ...                               libpython: [ OFF ]
> ...                               libcrypto: [ OFF ]
> ...                               libunwind: [ OFF ]
> ...                      libdw-dwarf-unwind: [ OFF ]
> ...                             libcapstone: [ OFF ]
> ...                                    zlib: [ OFF ]
> ...                                    lzma: [ OFF ]
> ...                               get_cpuid: [ on  ]
> ...                                     bpf: [ on  ]
> ...                                  libaio: [ on  ]
> ...                                 libzstd: [ OFF ]
> 
>   GEN     common-cmds.h
>   CC      dlfilters/dlfilter-test-api-v0.o
>   CC      dlfilters/dlfilter-test-api-v2.o
>   CC      dlfilters/dlfilter-show-cycles.o
>   LINK    dlfilters/dlfilter-show-cycles.so
>   GEN     /home/acme/git/perf-tools-next/tools/perf/arch/arm64/include/generated/asm/sysreg-defs.h
>   LINK    dlfilters/dlfilter-test-api-v0.so
>   LINK    dlfilters/dlfilter-test-api-v2.so
>   PERF_VERSION = 6.8.g4876ac6ab208
>   GEN     perf-archive
>   GEN     perf-iostat
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libsubcmd/include/subcmd/exec-cmd.h
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libsubcmd/include/subcmd/help.h
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libsubcmd/include/subcmd/pager.h
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libsubcmd/include/subcmd/parse-options.h
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libsubcmd/include/subcmd/run-command.h
>   CC      /home/acme/git/perf-tools-next/tools/perf/libsubcmd/help.o
>   CC      /home/acme/git/perf-tools-next/tools/perf/libsubcmd/exec-cmd.o
>   CC      /home/acme/git/perf-tools-next/tools/perf/libsubcmd/pager.o
>   CC      /home/acme/git/perf-tools-next/tools/perf/libsubcmd/parse-options.o
>   CC      /home/acme/git/perf-tools-next/tools/perf/libsubcmd/run-command.o
>   CC      /home/acme/git/perf-tools-next/tools/perf/libsubcmd/sigchain.o
>   CC      /home/acme/git/perf-tools-next/tools/perf/libsubcmd/subcmd-config.o
>   INSTALL libsubcmd_headers
>   LD      /home/acme/git/perf-tools-next/tools/perf/libsubcmd/libsubcmd-in.o
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/perf/bpf_perf.h
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/perf/cpumap.h
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/perf/core.h
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libapi/include/api/cpu.h
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/perf/threadmap.h
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/perf/evlist.h
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/perf/event.h
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/perf/mmap.h
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/perf/evsel.h
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/internal/cpumap.h
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libapi/include/api/debug.h
>   CC      /home/acme/git/perf-tools-next/tools/perf/libperf/core.o
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/internal/evlist.h
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/internal/evsel.h
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libapi/include/api/fd/array.h
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libapi/include/api/io.h
>   CC      /home/acme/git/perf-tools-next/tools/perf/libperf/cpumap.o
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/internal/lib.h
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/internal/mmap.h
>   CC      /home/acme/git/perf-tools-next/tools/perf/libperf/threadmap.o
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libapi/include/api/fs/fs.h
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libapi/include/api/fs/tracing_path.h
>   CC      /home/acme/git/perf-tools-next/tools/perf/libperf/evsel.o
>   CC      /home/acme/git/perf-tools-next/tools/perf/libperf/evlist.o
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/internal/rc_check.h
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/internal/threadmap.h
>   MKDIR   /home/acme/git/perf-tools-next/tools/perf/libapi/fd/
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libperf/include/internal/xyarray.h
>   CC      /home/acme/git/perf-tools-next/tools/perf/libperf/mmap.o
>   CC      /home/acme/git/perf-tools-next/tools/perf/libapi/cpu.o
>   CC      /home/acme/git/perf-tools-next/tools/perf/libperf/zalloc.o
>   CC      /home/acme/git/perf-tools-next/tools/perf/libperf/xyarray.o
>   MKDIR   /home/acme/git/perf-tools-next/tools/perf/libapi/fs/
>   CC      /home/acme/git/perf-tools-next/tools/perf/libperf/lib.o
>   MKDIR   /home/acme/git/perf-tools-next/tools/perf/libapi/fs/
>   INSTALL libapi_headers
>   CC      /home/acme/git/perf-tools-next/tools/perf/libapi/fd/array.o
>   MKDIR   /home/acme/git/perf-tools-next/tools/perf/libapi/fs/
>   INSTALL libperf_headers
>   CC      /home/acme/git/perf-tools-next/tools/perf/libapi/debug.o
>   CC      /home/acme/git/perf-tools-next/tools/perf/libapi/str_error_r.o
>   CC      /home/acme/git/perf-tools-next/tools/perf/libapi/fs/fs.o
>   AR      /home/acme/git/perf-tools-next/tools/perf/libsubcmd/libsubcmd.a
>   CC      /home/acme/git/perf-tools-next/tools/perf/libapi/fs/tracing_path.o
>   CC      /home/acme/git/perf-tools-next/tools/perf/libapi/fs/cgroup.o
>   INSTALL /home/acme/git/perf-tools-next/tools/perf/libsymbol/include/symbol/kallsyms.h
>   CC      /home/acme/git/perf-tools-next/tools/perf/libsymbol/kallsyms.o
>   LD      /home/acme/git/perf-tools-next/tools/perf/libperf/libperf-in.o
>   LD      /home/acme/git/perf-tools-next/tools/perf/libapi/fd/libapi-in.o
>   INSTALL libsymbol_headers
>   LD      /home/acme/git/perf-tools-next/tools/perf/libapi/fs/libapi-in.o
>   AR      /home/acme/git/perf-tools-next/tools/perf/libperf/libperf.a
>   LD      /home/acme/git/perf-tools-next/tools/perf/libsymbol/libsymbol-in.o
>   LD      /home/acme/git/perf-tools-next/tools/perf/libapi/libapi-in.o
>   AR      /home/acme/git/perf-tools-next/tools/perf/libsymbol/libsymbol.a
>   AR      /home/acme/git/perf-tools-next/tools/perf/libapi/libapi.a
>   CC      builtin-bench.o
>   CC      builtin-annotate.o
>   CC      builtin-config.o
>   CC      builtin-diff.o
>   CC      builtin-evlist.o
>   CC      builtin-ftrace.o
>   CC      builtin-help.o
>   CC      builtin-buildid-list.o
>   CC      builtin-buildid-cache.o
>   CC      builtin-kallsyms.o
>   CC      builtin-list.o
>   CC      builtin-record.o
>   CC      builtin-report.o
>   CC      builtin-stat.o
>   CC      builtin-top.o
>   CC      builtin-script.o
>   CC      builtin-kvm.o
>   CC      builtin-inject.o
>   CC      builtin-mem.o
>   TEST    pmu-events/metric_test.log
>   CC      builtin-data.o
>   CC      builtin-version.o
>   CC      builtin-c2c.o
>   CC      builtin-daemon.o
>   CC      bench/sched-messaging.o
>   CC      arch/common.o
>   CC      tests/builtin-test.o
>   CC      perf.o
>   CC      ui/setup.o
>   LD      scripts/perf-in.o
>   CC      tests/tests-scripts.o
>   CC      bench/sched-pipe.o
>   CC      tests/parse-events.o
>   CC      ui/helpline.o
>   CC      tests/dso-data.o
>   CC      bench/sched-seccomp-notify.o
>   CC      tests/attr.o
>   CC      tests/vmlinux-kallsyms.o
>   CC      ui/progress.o
>   CC      bench/syscall.o
>   CC      tests/perf-record.o
>   CC      arch/x86/util/header.o
>   CC      ui/util.o
>   CC      bench/mem-functions.o
>   CC      tests/evsel-roundtrip-name.o
>   CC      tests/fdarray.o
>   CC      tests/pmu.o
>   CC      arch/x86/tests/arch-tests.o
>   CC      ui/hist.o
>   CC      bench/futex-hash.o
>   CC      bench/futex-wake.o
>   CC      bench/futex-wake-parallel.o
>   CC      arch/x86/tests/sample-parsing.o
>   CC      arch/x86/tests/hybrid.o
>   CC      tests/pmu-events.o
>   CC      arch/x86/tests/intel-pt-test.o
>   CC      arch/x86/util/tsc.o
>   CC      ui/stdio/hist.o
>   CC      bench/futex-requeue.o
>   CC      bench/futex-lock-pi.o
>   CC      arch/x86/util/pmu.o
>   CC      tests/hists_common.o
>   CC      arch/x86/tests/bp-modify.o
>   CC      arch/x86/util/perf_regs.o
>   CC      arch/x86/util/topdown.o
>   CC      bench/epoll-wait.o
>   CC      arch/x86/tests/amd-ibs-via-core-pmu.o
>   CC      arch/x86/util/machine.o
>   CC      tests/hists_link.o
>   CC      bench/epoll-ctl.o
>   CC      arch/x86/util/event.o
>   CC      bench/synthesize.o
>   CC      tests/hists_filter.o
>   CC      arch/x86/util/evlist.o
>   CC      bench/kallsyms-parse.o
>   CC      arch/x86/util/mem-events.o
>   CC      bench/find-bit-bench.o
>   CC      tests/hists_output.o
>   CC      bench/inject-buildid.o
>   CC      bench/evlist-open-close.o
>   CC      tests/hists_cumulate.o
>   CC      tests/python-use.o
>   CC      bench/breakpoint.o
>   CC      arch/x86/util/evsel.o
>   LD      ui/perf-in.o
>   CC      tests/bp_signal.o
>   CC      arch/x86/util/iostat.o
>   CC      bench/pmu-scan.o
>   CC      bench/uprobe.o
>   CC      arch/x86/util/env.o
>   CC      util/arm64-frame-pointer-unwind-support.o
>   CC      util/addr_location.o
>   CC      bench/mem-memcpy-x86-64-asm.o
>   LD      arch/x86/tests/perf-in.o
>   CC      tests/bp_signal_overflow.o
>   CC      arch/x86/util/auxtrace.o
>   CC      bench/mem-memset-x86-64-asm.o
>   CC      arch/x86/util/archinsn.o
>   CC      tests/bp_account.o
>   CC      arch/x86/util/intel-pt.o
>   CC      util/annotate.o
>   CC      arch/x86/util/intel-bts.o
>   CC      util/block-info.o
>   CC      tests/wp.o
>   CC      util/block-range.o
>   CC      util/build-id.o
>   CC      tests/task-exit.o
>   CC      util/cacheline.o
>   CC      util/config.o
>   CC      tests/sw-clock.o
>   CC      util/copyfile.o
>   CC      tests/mmap-thread-lookup.o
>   CC      util/ctype.o
>   CC      tests/thread-maps-share.o
>   CC      tests/keep-tracking.o
>   CC      util/db-export.o
>   CC      tests/code-reading.o
>   CC      util/disasm.o
>   LD      bench/perf-in.o
>   CC      util/env.o
>   CC      tests/sample-parsing.o
>   CC      util/event.o
>   CC      tests/parse-no-sample-id-all.o
>   CC      tests/kmod-path.o
>   CC      tests/thread-map.o
>   CC      util/evlist.o
>   CC      tests/topology.o
>   CC      util/sideband_evlist.o
>   LD      arch/x86/util/perf-in.o
>   CC      util/evsel.o
>   CC      tests/mem.o
>   CC      util/evsel_fprintf.o
>   CC      tests/cpumap.o
>   CC      tests/stat.o
>   CC      util/perf_event_attr_fprintf.o
>   CC      tests/event_update.o
>   CC      util/evswitch.o
>   CC      tests/event-times.o
>   CC      util/find_bit.o
>   CC      tests/expr.o
>   CC      util/get_current_dir_name.o
>   CC      tests/backward-ring-buffer.o
>   CC      util/levenshtein.o
>   CC      tests/sdt.o
>   CC      tests/is_printable_array.o
>   CC      util/mmap.o
>   LD      arch/x86/perf-in.o
>   CC      util/memswap.o
>   CC      tests/bitmap.o
>   BISON   util/parse-events-bison.c
>   CC      tests/perf-hooks.o
>   CC      util/print-events.o
>   CC      tests/unit_number__scnprintf.o
>   CC      util/tracepoint.o
>   CC      util/perf_regs.o
>   CC      tests/mem2node.o
>   CC      util/perf-regs-arch/perf_regs_aarch64.o
>   LD      arch/perf-in.o
>   CC      tests/maps.o
>   CC      util/perf-regs-arch/perf_regs_arm.o
>   CC      tests/time-utils-test.o
>   CC      util/arm-spe-decoder/arm-spe-pkt-decoder.o
>   CC      util/intel-pt-decoder/intel-pt-pkt-decoder.o
>   CC      util/arm-spe-decoder/arm-spe-decoder.o
>   CC      tests/genelf.o
>   CC      util/perf-regs-arch/perf_regs_csky.o
>   CC      tests/api-io.o
>   GEN     util/intel-pt-decoder/inat-tables.c
>   CC      tests/demangle-java-test.o
>   CC      util/perf-regs-arch/perf_regs_loongarch.o
>   CC      util/path.o
>   CC      util/perf-regs-arch/perf_regs_mips.o
>   CC      tests/demangle-ocaml-test.o
>   CC      util/hisi-ptt-decoder/hisi-ptt-pkt-decoder.o
>   LD      util/scripting-engines/perf-in.o
>   CC      util/perf-regs-arch/perf_regs_powerpc.o
>   CC      util/print_binary.o
>   CC      tests/pfm.o
>   CC      util/perf-regs-arch/perf_regs_riscv.o
>   CC      util/intel-pt-decoder/intel-pt-log.o
>   CC      util/intel-pt-decoder/intel-pt-decoder.o
>   CC      util/perf-regs-arch/perf_regs_s390.o
>   CC      util/print_insn.o
>   CC      tests/parse-metric.o
>   CC      util/perf-regs-arch/perf_regs_x86.o
>   CC      tests/pe-file-parsing.o
>   CC      tests/expand-cgroup.o
>   CC      util/rlimit.o
>   CC      tests/perf-time-to-tsc.o
>   CC      tests/dlfilter-test.o
>   CC      util/argv_split.o
>   LD      util/arm-spe-decoder/perf-in.o
>   CC      tests/sigtrap.o
>   CC      util/rbtree.o
>   CC      util/libstring.o
>   CC      tests/event_groups.o
>   CC      util/bitmap.o
>   LD      util/hisi-ptt-decoder/perf-in.o
>   CC      util/hweight.o
>   CC      util/smt.o
>   CC      tests/symbols.o
>   CC      tests/util.o
>   LD      util/perf-regs-arch/perf-in.o
>   CC      util/strbuf.o
>   CC      util/string.o
>   CC      util/strlist.o
>   CC      util/strfilter.o
>   CC      util/top.o
>   CC      util/usage.o
>   CC      tests/workloads/noploop.o
>   GEN     pmu-events/pmu-events.c
>   CC      util/dso.o
>   CC      tests/workloads/thloop.o
>   CC      util/dsos.o
>   CC      tests/workloads/leafloop.o
>   CC      tests/workloads/sqrtloop.o
>   CC      tests/workloads/brstack.o
>   CC      util/symbol.o
>   CC      tests/workloads/datasym.o
>   CC      util/symbol_fprintf.o
>   CC      util/map_symbol.o
>   CC      util/color.o
>   CC      util/color_config.o
>   CC      util/intel-pt-decoder/intel-pt-insn-decoder.o
>   CC      util/metricgroup.o
>   CC      util/header.o
>   CC      util/callchain.o
>   CC      util/values.o
>   CC      util/debug.o
>   CC      util/fncache.o
>   CC      util/machine.o
>   LD      tests/workloads/perf-in.o
>   CC      util/map.o
>   CC      util/maps.o
>   CC      util/pstack.o
>   CC      util/session.o
>   LD      util/intel-pt-decoder/perf-in.o
>   CC      util/sample-raw.o
>   CC      util/s390-sample-raw.o
>   CC      util/amd-sample-raw.o
>   LD      tests/perf-in.o
>   CC      util/ordered-events.o
>   CC      util/namespaces.o
>   CC      util/comm.o
>   CC      util/threads.o
>   CC      util/thread.o
>   CC      util/thread_map.o
>   BISON   util/pmu-bison.c
>   CC      util/pmus.o
>   CC      util/svghelper.o
>   CC      util/trace-event-scripting.o
>   CC      util/sort.o
>   CC      util/hist.o
>   CC      util/util.o
>   CC      util/cpumap.o
>   CC      util/affinity.o
>   CC      util/cputopo.o
>   CC      util/cgroup.o
>   CC      util/target.o
>   CC      util/rblist.o
>   CC      util/intlist.o
>   CC      util/vdso.o
>   CC      util/counts.o
>   CC      util/stat.o
>   CC      util/stat-shadow.o
>   CC      util/stat-display.o
>   CC      util/perf_api_probe.o
>   CC      util/record.o
>   CC      util/srcline.o
>   CC      util/srccode.o
>   CC      util/synthetic-events.o
>   CC      util/data.o
>   CC      util/tsc.o
>   CC      util/cloexec.o
>   CC      util/call-path.o
>   CC      util/rwsem.o
>   CC      util/thread-stack.o
>   CC      util/spark.o
>   CC      util/topdown.o
>   CC      util/iostat.o
>   CC      util/stream.o
>   CC      util/auxtrace.o
>   CC      util/intel-pt.o
>   CC      util/intel-bts.o
>   CC      util/arm-spe.o
>   CC      util/hisi-ptt.o
>   CC      util/s390-cpumsf.o
>   CC      util/cs-etm-base.o
>   CC      util/parse-branch-options.o
>   CC      util/dump-insn.o
>   CC      util/parse-regs-options.o
>   CC      util/parse-sublevel-options.o
>   CC      util/term.o
>   CC      util/help-unknown-cmd.o
>   CC      util/dlfilter.o
>   CC      util/mem-events.o
>   CC      util/vsprintf.o
>   CC      util/units.o
>   CC      util/time-utils.o
>   BISON   util/expr-bison.c
>   CC      util/branch.o
>   CC      util/mem2node.o
>   CC      util/clockid.o
>   CC      util/list_sort.o
>   CC      util/mutex.o
>   CC      util/sharded_mutex.o
>   CC      util/hashmap.o
>   CC      util/symbol-minimal.o
>   CC      util/data-convert-json.o
>   CC      util/demangle-ocaml.o
>   CC      util/demangle-java.o
>   CC      util/demangle-rust.o
>   CC      util/perf-hooks.o
>   FLEX    util/parse-events-flex.c
>   FLEX    util/pmu-flex.c
>   CC      util/parse-events-bison.o
>   CC      util/pmu-bison.o
>   CC      util/pmu.o
>   CC      util/pmu-flex.o
>   CC      util/parse-events.o
>   CC      util/parse-events-flex.o
>   FLEX    util/expr-flex.c
>   CC      util/expr-bison.o
>   CC      util/expr-flex.o
>   CC      util/expr.o
>   LD      util/perf-in.o
>   LD      perf-in.o
>   CC      pmu-events/pmu-events.o
>   LD      pmu-events/pmu-events-in.o
>   LINK    perf
> /usr/bin/ld: perf-in.o: in function `dlfilter__new':
> (.text+0x145617): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
> /usr/bin/ld: perf-in.o: in function `target__parse_uid':
> (.text+0x108cfe): warning: Using 'getpwnam_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
> /usr/bin/ld: (.text+0x108d7b): warning: Using 'getpwuid_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
> /usr/bin/ld: perf-in.o: in function `hists__find_annotations':
> builtin-annotate.c:(.text+0x95f): undefined reference to `hist_entry__annotate_data_tty'
> /usr/bin/ld: builtin-annotate.c:(.text+0xad3): undefined reference to `hist_entry__annotate_data_tui'
> collect2: error: ld returned 1 exit status
> make[4]: *** [Makefile.perf:733: perf] Error 1
> make[3]: *** [Makefile.perf:264: sub-make] Error 2
> make[2]: *** [Makefile:70: all] Error 2
>   test: test -x ./perf
> make[1]: *** [tests/make:330: make_static] Error 1
> make: *** [Makefile:103: build-test] Error 2
> make: Leaving directory '/home/acme/git/perf-tools-next/tools/perf'
> 
> real	0m21.481s
> user	1m35.872s
> sys	0m22.854s
> ⬢[acme@toolbox perf-tools-next]$ 
> 
> 

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 3/6] perf annotate-data: Add hist_entry__annotate_data_tui()
  2024-04-10 21:05       ` Arnaldo Carvalho de Melo
@ 2024-04-10 21:12         ` Arnaldo Carvalho de Melo
  2024-04-10 21:17           ` Arnaldo Carvalho de Melo
  0 siblings, 1 reply; 22+ messages in thread
From: Arnaldo Carvalho de Melo @ 2024-04-10 21:12 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Ian Rogers, Kan Liang, Jiri Olsa, Adrian Hunter, Peter Zijlstra,
	Ingo Molnar, LKML, linux-perf-users

On Wed, Apr 10, 2024 at 06:05:27PM -0300, Arnaldo Carvalho de Melo wrote:
> On Wed, Apr 10, 2024 at 06:04:26PM -0300, Arnaldo Carvalho de Melo wrote:
> > On Wed, Apr 10, 2024 at 05:21:01PM -0300, Arnaldo Carvalho de Melo wrote:
> > > On Tue, Apr 09, 2024 at 04:49:57PM -0700, Namhyung Kim wrote:
> > > > Support data type profiling output on TUI.
> > > 
> > > Added the follow to the commit log message, to make reviewing easier.
> > > 
> > > As followup patches I think having the DSO name together with the type
> > > is important, also I think we could have a first menu with all the pairs
> > > of DSO/type, sorted top down by the types with most samples, wdyt?
> > > 
> > > Applied.
> > > 
> > 
> > There is something else here with the static build, checking...
> 
> Probably because of:
> 
> Makefile.config:810: slang not found, disables TUI support. Please install slang-devel, libslang-dev or libslang2-dev
> 
> Fixing...

Trying with:

diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
index 6f7104f06c42d98a..458eafe65e4aa16f 100644
--- a/tools/perf/builtin-annotate.c
+++ b/tools/perf/builtin-annotate.c
@@ -469,9 +469,11 @@ static void hists__find_annotations(struct hists *hists,
 					goto find_next;
 			}
 
+#ifdef HAVE_SLANG_SUPPORT
 			if (use_browser == 1)
 				key = hist_entry__annotate_data_tui(he, evsel, NULL);
 			else
+#endif
 				key = hist_entry__annotate_data_tty(he, evsel);
 
 			switch (key) {

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* Re: [PATCH 3/6] perf annotate-data: Add hist_entry__annotate_data_tui()
  2024-04-10 21:12         ` Arnaldo Carvalho de Melo
@ 2024-04-10 21:17           ` Arnaldo Carvalho de Melo
  2024-04-10 21:20             ` Arnaldo Carvalho de Melo
  0 siblings, 1 reply; 22+ messages in thread
From: Arnaldo Carvalho de Melo @ 2024-04-10 21:17 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Ian Rogers, Kan Liang, Jiri Olsa, Adrian Hunter, Peter Zijlstra,
	Ingo Molnar, LKML, linux-perf-users

On Wed, Apr 10, 2024 at 06:12:32PM -0300, Arnaldo Carvalho de Melo wrote:
> On Wed, Apr 10, 2024 at 06:05:27PM -0300, Arnaldo Carvalho de Melo wrote:
> > On Wed, Apr 10, 2024 at 06:04:26PM -0300, Arnaldo Carvalho de Melo wrote:
> > > On Wed, Apr 10, 2024 at 05:21:01PM -0300, Arnaldo Carvalho de Melo wrote:
> > > > On Tue, Apr 09, 2024 at 04:49:57PM -0700, Namhyung Kim wrote:
> > > > > Support data type profiling output on TUI.
> > > > 
> > > > Added the follow to the commit log message, to make reviewing easier.
> > > > 
> > > > As followup patches I think having the DSO name together with the type
> > > > is important, also I think we could have a first menu with all the pairs
> > > > of DSO/type, sorted top down by the types with most samples, wdyt?
> > > > 
> > > > Applied.
> > > > 
> > > 
> > > There is something else here with the static build, checking...
> > 
> > Probably because of:
> > 
> > Makefile.config:810: slang not found, disables TUI support. Please install slang-devel, libslang-dev or libslang2-dev
> > 
> > Fixing...
> 
> Trying with:

Not really, I need to check for HAVE_DWARF_SUPPORT as well? Doing that

- Arnaldo
 
> diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
> index 6f7104f06c42d98a..458eafe65e4aa16f 100644
> --- a/tools/perf/builtin-annotate.c
> +++ b/tools/perf/builtin-annotate.c
> @@ -469,9 +469,11 @@ static void hists__find_annotations(struct hists *hists,
>  					goto find_next;
>  			}
>  
> +#ifdef HAVE_SLANG_SUPPORT
>  			if (use_browser == 1)
>  				key = hist_entry__annotate_data_tui(he, evsel, NULL);
>  			else
> +#endif
>  				key = hist_entry__annotate_data_tty(he, evsel);
>  
>  			switch (key) {

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 3/6] perf annotate-data: Add hist_entry__annotate_data_tui()
  2024-04-10 21:17           ` Arnaldo Carvalho de Melo
@ 2024-04-10 21:20             ` Arnaldo Carvalho de Melo
  2024-04-10 21:32               ` Arnaldo Carvalho de Melo
  0 siblings, 1 reply; 22+ messages in thread
From: Arnaldo Carvalho de Melo @ 2024-04-10 21:20 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Ian Rogers, Kan Liang, Jiri Olsa, Adrian Hunter, Peter Zijlstra,
	Ingo Molnar, LKML, linux-perf-users

On Wed, Apr 10, 2024 at 06:17:16PM -0300, Arnaldo Carvalho de Melo wrote:
> On Wed, Apr 10, 2024 at 06:12:32PM -0300, Arnaldo Carvalho de Melo wrote:
> > On Wed, Apr 10, 2024 at 06:05:27PM -0300, Arnaldo Carvalho de Melo wrote:
> > > On Wed, Apr 10, 2024 at 06:04:26PM -0300, Arnaldo Carvalho de Melo wrote:
> > > > On Wed, Apr 10, 2024 at 05:21:01PM -0300, Arnaldo Carvalho de Melo wrote:
> > > > > On Tue, Apr 09, 2024 at 04:49:57PM -0700, Namhyung Kim wrote:
> > > > > > Support data type profiling output on TUI.
> > > > > 
> > > > > Added the follow to the commit log message, to make reviewing easier.
> > > > > 
> > > > > As followup patches I think having the DSO name together with the type
> > > > > is important, also I think we could have a first menu with all the pairs
> > > > > of DSO/type, sorted top down by the types with most samples, wdyt?
> > > > > 
> > > > > Applied.
> > > > > 
> > > > 
> > > > There is something else here with the static build, checking...
> > > 
> > > Probably because of:
> > > 
> > > Makefile.config:810: slang not found, disables TUI support. Please install slang-devel, libslang-dev or libslang2-dev
> > > 
> > > Fixing...
> > 
> > Trying with:
> 
> Not really, I need to check for HAVE_DWARF_SUPPORT as well? Doing that

Attempting with:

⬢[acme@toolbox perf-tools-next]$ git diff
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
index 458eafe65e4aa16f..521ec7e226e29e6b 100644
--- a/tools/perf/builtin-annotate.c
+++ b/tools/perf/builtin-annotate.c
@@ -469,7 +469,7 @@ static void hists__find_annotations(struct hists *hists,
                                        goto find_next;
                        }
 
-#ifdef HAVE_SLANG_SUPPORT
+#if defined(HAVE_SLANG_SUPPORT) && defined(HAVE_DWARF_SUPPORT)
                        if (use_browser == 1)
                                key = hist_entry__annotate_data_tui(he, evsel, NULL);
                        else
⬢[acme@toolbox perf-tools-next]$

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* Re: [PATCH 3/6] perf annotate-data: Add hist_entry__annotate_data_tui()
  2024-04-10 21:20             ` Arnaldo Carvalho de Melo
@ 2024-04-10 21:32               ` Arnaldo Carvalho de Melo
  2024-04-10 23:49                 ` Namhyung Kim
  0 siblings, 1 reply; 22+ messages in thread
From: Arnaldo Carvalho de Melo @ 2024-04-10 21:32 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Ian Rogers, Kan Liang, Jiri Olsa, Adrian Hunter, Peter Zijlstra,
	Ingo Molnar, LKML, linux-perf-users

On Wed, Apr 10, 2024 at 06:20:06PM -0300, Arnaldo Carvalho de Melo wrote:
> On Wed, Apr 10, 2024 at 06:17:16PM -0300, Arnaldo Carvalho de Melo wrote:
> > On Wed, Apr 10, 2024 at 06:12:32PM -0300, Arnaldo Carvalho de Melo wrote:
> > > On Wed, Apr 10, 2024 at 06:05:27PM -0300, Arnaldo Carvalho de Melo wrote:
> > > > On Wed, Apr 10, 2024 at 06:04:26PM -0300, Arnaldo Carvalho de Melo wrote:
> > > > > On Wed, Apr 10, 2024 at 05:21:01PM -0300, Arnaldo Carvalho de Melo wrote:
> > > > > > On Tue, Apr 09, 2024 at 04:49:57PM -0700, Namhyung Kim wrote:
> > > > > > > Support data type profiling output on TUI.
> > > > > > 
> > > > > > Added the follow to the commit log message, to make reviewing easier.
> > > > > > 
> > > > > > As followup patches I think having the DSO name together with the type
> > > > > > is important, also I think we could have a first menu with all the pairs
> > > > > > of DSO/type, sorted top down by the types with most samples, wdyt?
> > > > > > 
> > > > > > Applied.
> > > > > > 
> > > > > 
> > > > > There is something else here with the static build, checking...
> > > > 
> > > > Probably because of:
> > > > 
> > > > Makefile.config:810: slang not found, disables TUI support. Please install slang-devel, libslang-dev or libslang2-dev
> > > > 
> > > > Fixing...
> > > 
> > > Trying with:
> > 
> > Not really, I need to check for HAVE_DWARF_SUPPORT as well? Doing that
> 
> Attempting with:

Nope, the surgery needed is a bit bigger, as you made
hist_entry__annotate_data_tty dependent on DWARF but calls it without
checking HAVE_DWARF_SUPPORT from builtin-annotate.c.

I put what I have in tmp.perf-tools-next, please take a look, I'll
continue  tomorrow.

- Arnaldo
 
> ⬢[acme@toolbox perf-tools-next]$ git diff
> diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
> index 458eafe65e4aa16f..521ec7e226e29e6b 100644
> --- a/tools/perf/builtin-annotate.c
> +++ b/tools/perf/builtin-annotate.c
> @@ -469,7 +469,7 @@ static void hists__find_annotations(struct hists *hists,
>                                         goto find_next;
>                         }
>  
> -#ifdef HAVE_SLANG_SUPPORT
> +#if defined(HAVE_SLANG_SUPPORT) && defined(HAVE_DWARF_SUPPORT)
>                         if (use_browser == 1)
>                                 key = hist_entry__annotate_data_tui(he, evsel, NULL);
>                         else
> ⬢[acme@toolbox perf-tools-next]$

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 3/6] perf annotate-data: Add hist_entry__annotate_data_tui()
  2024-04-10 21:32               ` Arnaldo Carvalho de Melo
@ 2024-04-10 23:49                 ` Namhyung Kim
  0 siblings, 0 replies; 22+ messages in thread
From: Namhyung Kim @ 2024-04-10 23:49 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Ian Rogers, Kan Liang, Jiri Olsa, Adrian Hunter, Peter Zijlstra,
	Ingo Molnar, LKML, linux-perf-users

On Wed, Apr 10, 2024 at 2:32 PM Arnaldo Carvalho de Melo
<acme@kernel.org> wrote:
>
> On Wed, Apr 10, 2024 at 06:20:06PM -0300, Arnaldo Carvalho de Melo wrote:
> > On Wed, Apr 10, 2024 at 06:17:16PM -0300, Arnaldo Carvalho de Melo wrote:
> > > On Wed, Apr 10, 2024 at 06:12:32PM -0300, Arnaldo Carvalho de Melo wrote:
> > > > On Wed, Apr 10, 2024 at 06:05:27PM -0300, Arnaldo Carvalho de Melo wrote:
> > > > > On Wed, Apr 10, 2024 at 06:04:26PM -0300, Arnaldo Carvalho de Melo wrote:
> > > > > > On Wed, Apr 10, 2024 at 05:21:01PM -0300, Arnaldo Carvalho de Melo wrote:
> > > > > > > On Tue, Apr 09, 2024 at 04:49:57PM -0700, Namhyung Kim wrote:
> > > > > > > > Support data type profiling output on TUI.
> > > > > > >
> > > > > > > Added the follow to the commit log message, to make reviewing easier.
> > > > > > >
> > > > > > > As followup patches I think having the DSO name together with the type
> > > > > > > is important, also I think we could have a first menu with all the pairs
> > > > > > > of DSO/type, sorted top down by the types with most samples, wdyt?
> > > > > > >
> > > > > > > Applied.
> > > > > > >
> > > > > >
> > > > > > There is something else here with the static build, checking...
> > > > >
> > > > > Probably because of:
> > > > >
> > > > > Makefile.config:810: slang not found, disables TUI support. Please install slang-devel, libslang-dev or libslang2-dev
> > > > >
> > > > > Fixing...
> > > >
> > > > Trying with:
> > >
> > > Not really, I need to check for HAVE_DWARF_SUPPORT as well? Doing that
> >
> > Attempting with:
>
> Nope, the surgery needed is a bit bigger, as you made
> hist_entry__annotate_data_tty dependent on DWARF but calls it without
> checking HAVE_DWARF_SUPPORT from builtin-annotate.c.
>
> I put what I have in tmp.perf-tools-next, please take a look, I'll
> continue  tomorrow.

Oops, thanks a lot for fighting with this.  I think I can add a
dummy version in case it doesn't have the slang support.
I'll send v2 including all your other improvements.

Thanks,
Namhyung

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 5/6] perf report: Add a menu item to annotate data type in TUI
  2024-04-10 20:50     ` Arnaldo Carvalho de Melo
@ 2024-04-11  0:30       ` Namhyung Kim
  0 siblings, 0 replies; 22+ messages in thread
From: Namhyung Kim @ 2024-04-11  0:30 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Ian Rogers, Kan Liang, Jiri Olsa, Adrian Hunter, Peter Zijlstra,
	Ingo Molnar, LKML, linux-perf-users

On Wed, Apr 10, 2024 at 1:50 PM Arnaldo Carvalho de Melo
<acme@kernel.org> wrote:
> (gdb) bt
> #0  0x00007ffff6ebd385 in __GI___libc_free (mem=0x69647225202c3866) at malloc.c:3368                                                                                                          ▒
> #1  0x000000000066c2c0 in delete_data_type_histograms (adt=0x8dedf0c0) at util/annotate-data.c:1655                                                                                           ▒
> #2  0x000000000066c363 in annotated_data_type__tree_delete (root=0xe6bc68) at util/annotate-data.c:1669                                                                                       ▒
> #3  0x0000000000553bc5 in dso__delete (dso=0xe6bbd0) at util/dso.c:1376                                                                                                                       ▒
> #4  0x0000000000553d63 in dso__put (dso=0xe6bbd0) at util/dso.c:1409                                                                                                                          ▒
> #5  0x000000000057ed76 in __dso__zput (dso=0xf5b540) at util/dso.h:262                                                                                                                        ▒
> #6  0x000000000058027e in map__exit (map=0xf5b520) at util/map.c:300                                                                                                                          ▒
> #7  0x00000000005802bc in map__delete (map=0xf5b520) at util/map.c:305cord -b ... ; perf report --total-cycles                                                                                ▒
> #8  0x0000000000580325 in map__put (map=0xf5b520) at util/map.c:312
> #9  0x00000000005818aa in __map__zput (map=0xf3e300) at util/map.h:196
> #10 0x0000000000582241 in maps__exit (maps=0xf5aee0) at util/maps.c:246
> #11 0x000000000058233c in maps__delete (maps=0xf5aee0) at util/maps.c:268
> #12 0x00000000005823fd in maps__put (maps=0xf5aee0) at util/maps.c:285
> #13 0x000000000055c4ca in __maps__zput (map=0x47856d8) at util/maps.h:32
> #14 0x000000000055c55f in map_symbol__exit (ms=0x47856d8) at util/map_symbol.c:8
> #15 0x00000000005c36bf in hist_entry__delete (he=0x4785660) at util/hist.c:1319
> #16 0x00000000005c1049 in hists__delete_entry (hists=0xe68fe0, he=0x4785660) at util/hist.c:382
> #17 0x00000000005c1197 in hists__delete_entries (hists=0xe68fe0) at util/hist.c:410
> #18 0x00000000005c7a4d in hists__delete_all_entries (hists=0xe68fe0) at util/hist.c:2872
> #19 0x00000000005c7ac7 in hists_evsel__exit (evsel=0xe68d70) at util/hist.c:2884
> #20 0x0000000000531928 in evsel__exit (evsel=0xe68d70) at util/evsel.c:1489
> #21 0x000000000053196d in evsel__delete (evsel=0xe68d70) at util/evsel.c:1497
> #22 0x0000000000526a70 in evlist__purge (evlist=0xe67a00) at util/evlist.c:163
> #23 0x0000000000526b7d in evlist__delete (evlist=0xe67a00) at util/evlist.c:185
> #24 0x0000000000585fd8 in perf_session__delete (session=0xe670a0) at util/session.c:313
> #25 0x0000000000434503 in cmd_report (argc=0, argv=0x7fffffffe430) at builtin-report.c:1828
> #26 0x00000000005062c3 in run_builtin (p=0xe3f160 <commands+288>, argc=3, argv=0x7fffffffe430) at perf.c:350
> #27 0x0000000000506532 in handle_internal_command (argc=3, argv=0x7fffffffe430) at perf.c:403
> #28 0x0000000000506681 in run_argv (argcp=0x7fffffffe21c, argv=0x7fffffffe210) at perf.c:447
> #29 0x0000000000506978 in main (argc=3, argv=0x7fffffffe430) at perf.c:561
> (gdb)
>

Thanks for the report.  I think I missed stack canary not handling
histogram updates.  The data file I tested with TUI didn't have an
entry for stack canary so I didn't catch this.  For some reason, I
still cannot reproduce it on my box.  Anyway I will fix in v2.

For the verification, it'd be nice if you can print the type name
in the delete_data_type__histogram().

  (gdb) p adt->self.type_name


Thanks,
Namhyung

^ permalink raw reply	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2024-04-11  0:30 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-04-09 23:49 [PATCHSET 0/6] perf annotate: Add TUI support for data type profiling (v1) Namhyung Kim
2024-04-09 23:49 ` [PATCH 1/6] perf annotate: Show progress of sample processing Namhyung Kim
2024-04-09 23:49 ` [PATCH 2/6] perf annotate-data: Add hist_entry__annotate_data_tty() Namhyung Kim
2024-04-09 23:49 ` [PATCH 3/6] perf annotate-data: Add hist_entry__annotate_data_tui() Namhyung Kim
2024-04-10 20:21   ` Arnaldo Carvalho de Melo
2024-04-10 21:04     ` Arnaldo Carvalho de Melo
2024-04-10 21:05       ` Arnaldo Carvalho de Melo
2024-04-10 21:12         ` Arnaldo Carvalho de Melo
2024-04-10 21:17           ` Arnaldo Carvalho de Melo
2024-04-10 21:20             ` Arnaldo Carvalho de Melo
2024-04-10 21:32               ` Arnaldo Carvalho de Melo
2024-04-10 23:49                 ` Namhyung Kim
2024-04-09 23:49 ` [PATCH 4/6] perf annotate-data: Support event group display in TUI Namhyung Kim
2024-04-10 19:52   ` Arnaldo Carvalho de Melo
2024-04-10 20:24   ` Arnaldo Carvalho de Melo
2024-04-10 20:38     ` Arnaldo Carvalho de Melo
2024-04-09 23:49 ` [PATCH 5/6] perf report: Add a menu item to annotate data type " Namhyung Kim
2024-04-10 20:46   ` Arnaldo Carvalho de Melo
2024-04-10 20:50     ` Arnaldo Carvalho de Melo
2024-04-11  0:30       ` Namhyung Kim
2024-04-09 23:50 ` [PATCH 6/6] perf report: Do not collect sample histogram unnecessarily Namhyung Kim
2024-04-10 16:29 ` [PATCHSET 0/6] perf annotate: Add TUI support for data type profiling (v1) Ian Rogers

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.