perf evsel: Add hists helper
Not all tools need a hists instance per perf_evsel, so lets pave the way to remove evsel->hists while leaving a way to access the hists from a specially allocated evsel, one that comes with space at the end where lives the evsel. Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Borislav Petkov <bp@suse.de> Cc: David Ahern <dsahern@gmail.com> Cc: Don Zickus <dzickus@redhat.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jean Pihet <jean.pihet@linaro.org> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/n/tip-qlktkhe31w4mgtbd84035sr2@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
@@ -102,6 +102,11 @@ union u64_swap {
|
||||
|
||||
#define hists_to_evsel(h) container_of(h, struct perf_evsel, hists)
|
||||
|
||||
static inline struct hists *evsel__hists(struct perf_evsel *evsel)
|
||||
{
|
||||
return &evsel->hists;
|
||||
}
|
||||
|
||||
struct cpu_map;
|
||||
struct thread_map;
|
||||
struct perf_evlist;
|
||||
|
||||
+13
-9
@@ -509,6 +509,7 @@ iter_add_single_mem_entry(struct hist_entry_iter *iter, struct addr_location *al
|
||||
{
|
||||
u64 cost;
|
||||
struct mem_info *mi = iter->priv;
|
||||
struct hists *hists = evsel__hists(iter->evsel);
|
||||
struct hist_entry *he;
|
||||
|
||||
if (mi == NULL)
|
||||
@@ -525,7 +526,7 @@ iter_add_single_mem_entry(struct hist_entry_iter *iter, struct addr_location *al
|
||||
* and this is indirectly achieved by passing period=weight here
|
||||
* and the he_stat__add_period() function.
|
||||
*/
|
||||
he = __hists__add_entry(&iter->evsel->hists, al, iter->parent, NULL, mi,
|
||||
he = __hists__add_entry(hists, al, iter->parent, NULL, mi,
|
||||
cost, cost, 0, true);
|
||||
if (!he)
|
||||
return -ENOMEM;
|
||||
@@ -539,13 +540,14 @@ iter_finish_mem_entry(struct hist_entry_iter *iter,
|
||||
struct addr_location *al __maybe_unused)
|
||||
{
|
||||
struct perf_evsel *evsel = iter->evsel;
|
||||
struct hists *hists = evsel__hists(evsel);
|
||||
struct hist_entry *he = iter->he;
|
||||
int err = -EINVAL;
|
||||
|
||||
if (he == NULL)
|
||||
goto out;
|
||||
|
||||
hists__inc_nr_samples(&evsel->hists, he->filtered);
|
||||
hists__inc_nr_samples(hists, he->filtered);
|
||||
|
||||
err = hist_entry__append_callchain(he, iter->sample);
|
||||
|
||||
@@ -611,6 +613,7 @@ iter_add_next_branch_entry(struct hist_entry_iter *iter, struct addr_location *a
|
||||
{
|
||||
struct branch_info *bi;
|
||||
struct perf_evsel *evsel = iter->evsel;
|
||||
struct hists *hists = evsel__hists(evsel);
|
||||
struct hist_entry *he = NULL;
|
||||
int i = iter->curr;
|
||||
int err = 0;
|
||||
@@ -624,12 +627,12 @@ iter_add_next_branch_entry(struct hist_entry_iter *iter, struct addr_location *a
|
||||
* The report shows the percentage of total branches captured
|
||||
* and not events sampled. Thus we use a pseudo period of 1.
|
||||
*/
|
||||
he = __hists__add_entry(&evsel->hists, al, iter->parent, &bi[i], NULL,
|
||||
he = __hists__add_entry(hists, al, iter->parent, &bi[i], NULL,
|
||||
1, 1, 0, true);
|
||||
if (he == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
hists__inc_nr_samples(&evsel->hists, he->filtered);
|
||||
hists__inc_nr_samples(hists, he->filtered);
|
||||
|
||||
out:
|
||||
iter->he = he;
|
||||
@@ -661,7 +664,7 @@ iter_add_single_normal_entry(struct hist_entry_iter *iter, struct addr_location
|
||||
struct perf_sample *sample = iter->sample;
|
||||
struct hist_entry *he;
|
||||
|
||||
he = __hists__add_entry(&evsel->hists, al, iter->parent, NULL, NULL,
|
||||
he = __hists__add_entry(evsel__hists(evsel), al, iter->parent, NULL, NULL,
|
||||
sample->period, sample->weight,
|
||||
sample->transaction, true);
|
||||
if (he == NULL)
|
||||
@@ -684,7 +687,7 @@ iter_finish_normal_entry(struct hist_entry_iter *iter,
|
||||
|
||||
iter->he = NULL;
|
||||
|
||||
hists__inc_nr_samples(&evsel->hists, he->filtered);
|
||||
hists__inc_nr_samples(evsel__hists(evsel), he->filtered);
|
||||
|
||||
return hist_entry__append_callchain(he, sample);
|
||||
}
|
||||
@@ -717,12 +720,13 @@ iter_add_single_cumulative_entry(struct hist_entry_iter *iter,
|
||||
struct addr_location *al)
|
||||
{
|
||||
struct perf_evsel *evsel = iter->evsel;
|
||||
struct hists *hists = evsel__hists(evsel);
|
||||
struct perf_sample *sample = iter->sample;
|
||||
struct hist_entry **he_cache = iter->priv;
|
||||
struct hist_entry *he;
|
||||
int err = 0;
|
||||
|
||||
he = __hists__add_entry(&evsel->hists, al, iter->parent, NULL, NULL,
|
||||
he = __hists__add_entry(hists, al, iter->parent, NULL, NULL,
|
||||
sample->period, sample->weight,
|
||||
sample->transaction, true);
|
||||
if (he == NULL)
|
||||
@@ -739,7 +743,7 @@ iter_add_single_cumulative_entry(struct hist_entry_iter *iter,
|
||||
*/
|
||||
callchain_cursor_commit(&callchain_cursor);
|
||||
|
||||
hists__inc_nr_samples(&evsel->hists, he->filtered);
|
||||
hists__inc_nr_samples(hists, he->filtered);
|
||||
|
||||
return err;
|
||||
}
|
||||
@@ -795,7 +799,7 @@ iter_add_next_cumulative_entry(struct hist_entry_iter *iter,
|
||||
}
|
||||
}
|
||||
|
||||
he = __hists__add_entry(&evsel->hists, al, iter->parent, NULL, NULL,
|
||||
he = __hists__add_entry(evsel__hists(evsel), al, iter->parent, NULL, NULL,
|
||||
sample->period, sample->weight,
|
||||
sample->transaction, false);
|
||||
if (he == NULL)
|
||||
|
||||
@@ -827,7 +827,7 @@ int perf_session__deliver_event(struct perf_session *session,
|
||||
* future probably it'll be a good idea to restrict event
|
||||
* processing via perf_session to files with both set.
|
||||
*/
|
||||
hists__inc_nr_events(&evsel->hists, event->header.type);
|
||||
hists__inc_nr_events(evsel__hists(evsel), event->header.type);
|
||||
}
|
||||
|
||||
machine = perf_session__find_machine_for_cpumode(session, event,
|
||||
@@ -1398,7 +1398,7 @@ size_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp)
|
||||
|
||||
evlist__for_each(session->evlist, pos) {
|
||||
ret += fprintf(fp, "%s stats:\n", perf_evsel__name(pos));
|
||||
ret += events_stats__fprintf(&pos->hists.stats, fp);
|
||||
ret += events_stats__fprintf(&evsel__hists(pos)->stats, fp);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -1218,7 +1218,7 @@ static int __sort__hpp_header(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
|
||||
hse = container_of(fmt, struct hpp_sort_entry, hpp);
|
||||
|
||||
if (!len)
|
||||
len = hists__col_len(&evsel->hists, hse->se->se_width_idx);
|
||||
len = hists__col_len(evsel__hists(evsel), hse->se->se_width_idx);
|
||||
|
||||
return scnprintf(hpp->buf, hpp->size, "%-*.*s", len, len, fmt->name);
|
||||
}
|
||||
@@ -1233,7 +1233,7 @@ static int __sort__hpp_width(struct perf_hpp_fmt *fmt,
|
||||
hse = container_of(fmt, struct hpp_sort_entry, hpp);
|
||||
|
||||
if (!len)
|
||||
len = hists__col_len(&evsel->hists, hse->se->se_width_idx);
|
||||
len = hists__col_len(evsel__hists(evsel), hse->se->se_width_idx);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user