Skip to contentSkip to conversation

perf hists: Save the callchain_size in struct hist_entry

tip:perf/urgent tip-bot for Arnaldo Carvalho de Melo 1 participant 1 message Jun 14, 2018 perf events

lore
Share & tools
lore
#0 lore raw
Commit-ID:  41477acf092251eb0cfe83068f48dbcb2521478a
Gitweb:     https://git.kernel.org/tip/41477acf092251eb0cfe83068f48dbcb2521478a
Author:     Arnaldo Carvalho de Melo <[email protected]>
AuthorDate: Thu, 7 Jun 2018 14:19:54 -0300
Committer:  Arnaldo Carvalho de Melo <[email protected]>
CommitDate: Thu, 7 Jun 2018 14:22:53 -0300

perf hists: Save the callchain_size in struct hist_entry

So that we can figure out the real size of the struct and also be able to tell if callchains may be present in this histogram entry.

Since we can't always guarantee that from hist_entry->hists we can use hists_to_evsel, to then look at evsel->attr.sample_type for PERF_SAMPLE_CALLCHAIN, like with the 'perf c2c' tool, that uses plain 'struct hists' instances, we need another way of deciding if a specific hist_entry instance has callchains associated with it, i.e. if its hist_entry->callchain[0] has space allocated for.

---
 tools/perf/util/hist.c | 6 ++++--
 tools/perf/util/sort.h | 2 ++
 2 files changed, 6 insertions(+), 2 deletions(-)
tools/perf/util/hist.c +4 -2
index 52e8fda93a47..0441a92b855f 100644
@@ -370,9 +370,11 @@ void hists__delete_entries(struct hists *hists)
 
 static int hist_entry__init(struct hist_entry *he,
 			    struct hist_entry *template,
-			    bool sample_self)
+			    bool sample_self,
+			    size_t callchain_size)
 {
 	*he = *template;
+	he->callchain_size = callchain_size;
 
 	if (symbol_conf.cumulate_callchain) {
 		he->stat_acc = malloc(sizeof(he->stat));
@@ -473,7 +475,7 @@ static struct hist_entry *hist_entry__new(struct hist_entry *template,
 
 	he = ops->new(callchain_size);
 	if (he) {
-		err = hist_entry__init(he, template, sample_self);
+		err = hist_entry__init(he, template, sample_self, callchain_size);
 		if (err) {
 			ops->free(he);
 			he = NULL;
tools/perf/util/sort.h +2 -0
index 7cf2d5cc038e..9ab9257ed887 100644
@@ -112,6 +112,8 @@ struct hist_entry {
 
 	char			level;
 	u8			filtered;
+
+	u16			callchain_size;
 	union {
 		/*
 		 * Since perf diff only supports the stdio output, TUI