diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2014-10-09 12:13:41 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2014-10-09 12:13:41 -0400 |
commit | 4ea062ed431d00153af0ac370cb6fef0620e5fa1 (patch) | |
tree | c4e7ad89b37d57751802524212291d1a8a89b7e3 /tools/perf/builtin-diff.c | |
parent | 49c23f2d541ebf7ae5e9fff03301f4e7145cc979 (diff) |
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>
Diffstat (limited to 'tools/perf/builtin-diff.c')
-rw-r--r-- | tools/perf/builtin-diff.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c index a3ce19f7aebd..8c5c11ca8c53 100644 --- a/tools/perf/builtin-diff.c +++ b/tools/perf/builtin-diff.c | |||
@@ -327,6 +327,7 @@ static int diff__process_sample_event(struct perf_tool *tool __maybe_unused, | |||
327 | struct machine *machine) | 327 | struct machine *machine) |
328 | { | 328 | { |
329 | struct addr_location al; | 329 | struct addr_location al; |
330 | struct hists *hists = evsel__hists(evsel); | ||
330 | 331 | ||
331 | if (perf_event__preprocess_sample(event, machine, &al, sample) < 0) { | 332 | if (perf_event__preprocess_sample(event, machine, &al, sample) < 0) { |
332 | pr_warning("problem processing %d event, skipping it.\n", | 333 | pr_warning("problem processing %d event, skipping it.\n", |
@@ -334,7 +335,7 @@ static int diff__process_sample_event(struct perf_tool *tool __maybe_unused, | |||
334 | return -1; | 335 | return -1; |
335 | } | 336 | } |
336 | 337 | ||
337 | if (hists__add_entry(&evsel->hists, &al, sample->period, | 338 | if (hists__add_entry(hists, &al, sample->period, |
338 | sample->weight, sample->transaction)) { | 339 | sample->weight, sample->transaction)) { |
339 | pr_warning("problem incrementing symbol period, skipping event\n"); | 340 | pr_warning("problem incrementing symbol period, skipping event\n"); |
340 | return -1; | 341 | return -1; |
@@ -346,9 +347,9 @@ static int diff__process_sample_event(struct perf_tool *tool __maybe_unused, | |||
346 | * hists__output_resort() and precompute needs the total | 347 | * hists__output_resort() and precompute needs the total |
347 | * period in order to sort entries by percentage delta. | 348 | * period in order to sort entries by percentage delta. |
348 | */ | 349 | */ |
349 | evsel->hists.stats.total_period += sample->period; | 350 | hists->stats.total_period += sample->period; |
350 | if (!al.filtered) | 351 | if (!al.filtered) |
351 | evsel->hists.stats.total_non_filtered_period += sample->period; | 352 | hists->stats.total_non_filtered_period += sample->period; |
352 | 353 | ||
353 | return 0; | 354 | return 0; |
354 | } | 355 | } |
@@ -382,7 +383,7 @@ static void perf_evlist__collapse_resort(struct perf_evlist *evlist) | |||
382 | struct perf_evsel *evsel; | 383 | struct perf_evsel *evsel; |
383 | 384 | ||
384 | evlist__for_each(evlist, evsel) { | 385 | evlist__for_each(evlist, evsel) { |
385 | struct hists *hists = &evsel->hists; | 386 | struct hists *hists = evsel__hists(evsel); |
386 | 387 | ||
387 | hists__collapse_resort(hists, NULL); | 388 | hists__collapse_resort(hists, NULL); |
388 | } | 389 | } |
@@ -631,24 +632,26 @@ static void data_process(void) | |||
631 | bool first = true; | 632 | bool first = true; |
632 | 633 | ||
633 | evlist__for_each(evlist_base, evsel_base) { | 634 | evlist__for_each(evlist_base, evsel_base) { |
635 | struct hists *hists_base = evsel__hists(evsel_base); | ||
634 | struct data__file *d; | 636 | struct data__file *d; |
635 | int i; | 637 | int i; |
636 | 638 | ||
637 | data__for_each_file_new(i, d) { | 639 | data__for_each_file_new(i, d) { |
638 | struct perf_evlist *evlist = d->session->evlist; | 640 | struct perf_evlist *evlist = d->session->evlist; |
639 | struct perf_evsel *evsel; | 641 | struct perf_evsel *evsel; |
642 | struct hists *hists; | ||
640 | 643 | ||
641 | evsel = evsel_match(evsel_base, evlist); | 644 | evsel = evsel_match(evsel_base, evlist); |
642 | if (!evsel) | 645 | if (!evsel) |
643 | continue; | 646 | continue; |
644 | 647 | ||
645 | d->hists = &evsel->hists; | 648 | hists = evsel__hists(evsel); |
649 | d->hists = hists; | ||
646 | 650 | ||
647 | hists__match(&evsel_base->hists, &evsel->hists); | 651 | hists__match(hists_base, hists); |
648 | 652 | ||
649 | if (!show_baseline_only) | 653 | if (!show_baseline_only) |
650 | hists__link(&evsel_base->hists, | 654 | hists__link(hists_base, hists); |
651 | &evsel->hists); | ||
652 | } | 655 | } |
653 | 656 | ||
654 | fprintf(stdout, "%s# Event '%s'\n#\n", first ? "" : "\n", | 657 | fprintf(stdout, "%s# Event '%s'\n#\n", first ? "" : "\n", |
@@ -659,7 +662,7 @@ static void data_process(void) | |||
659 | if (verbose || data__files_cnt > 2) | 662 | if (verbose || data__files_cnt > 2) |
660 | data__fprintf(); | 663 | data__fprintf(); |
661 | 664 | ||
662 | hists__process(&evsel_base->hists); | 665 | hists__process(hists_base); |
663 | } | 666 | } |
664 | } | 667 | } |
665 | 668 | ||