perf hists: Reimplement hists__has_callchains()

There are places where we have only access to struct hists and need to
know if any of its hist_entries has callchains, like when drawing
headers for the various output modes (stdio, TUI, etc), so, when adding
a new hist_entry, check if it has callchains, storing this info for
later use by hists__has_callchains().

This reimplementation is necessary because not always a 'struct hists'
is allocated together with a 'struct perf evsel', so we can't go from
'hists' to 'perf_event_attr.sample_type & PERF_SAMPLE_CALLCHAIN'.

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jin Yao <yao.jin@linux.intel.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: https://lkml.kernel.org/n/tip-hg5g7yddjio3ljwyqnnaj5dt@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Arnaldo Carvalho de Melo 2018-06-07 14:42:27 -03:00
parent 29f9fcdd3f
commit c9d3662870
2 changed files with 6 additions and 4 deletions

View file

@ -621,9 +621,11 @@ __hists__add_entry(struct hists *hists,
.raw_data = sample->raw_data, .raw_data = sample->raw_data,
.raw_size = sample->raw_size, .raw_size = sample->raw_size,
.ops = ops, .ops = ops,
}; }, *he = hists__findnew_entry(hists, &entry, al, sample_self);
return hists__findnew_entry(hists, &entry, al, sample_self); if (!hists->has_callchains && he && he->callchain_size != 0)
hists->has_callchains = true;
return he;
} }
struct hist_entry *hists__add_entry(struct hists *hists, struct hist_entry *hists__add_entry(struct hists *hists,

View file

@ -85,6 +85,7 @@ struct hists {
struct events_stats stats; struct events_stats stats;
u64 event_stream; u64 event_stream;
u16 col_len[HISTC_NR_COLS]; u16 col_len[HISTC_NR_COLS];
bool has_callchains;
int socket_filter; int socket_filter;
struct perf_hpp_list *hpp_list; struct perf_hpp_list *hpp_list;
struct list_head hpp_formats; struct list_head hpp_formats;
@ -222,8 +223,7 @@ static inline struct hists *evsel__hists(struct perf_evsel *evsel)
static __pure inline bool hists__has_callchains(struct hists *hists) static __pure inline bool hists__has_callchains(struct hists *hists)
{ {
const struct perf_evsel *evsel = hists_to_evsel(hists); return hists->has_callchains;
return evsel__has_callchain(evsel);
} }
int hists__init(void); int hists__init(void);