Commit eac23d1c authored by Ian Munsie's avatar Ian Munsie Committed by Arnaldo Carvalho de Melo

perf record,report,annotate,diff: Process events in order

This patch changes perf report to ask for the ID info on all events be
default if recording from multiple CPUs.

Perf report, annotate and diff will now process the events in order if
the kernel is able to provide timestamps on all events. This ensures
that events such as COMM and MMAP which are necessary to correctly
interpret samples are processed prior to those samples so that they are
attributed correctly.

Before:
 # perf record ./cachetest
 # perf report

 # Events: 6K cycles
 #
 # Overhead  Command      Shared Object                           Symbol
 # ........  .......  .................  ...............................
 #
     74.11%    :3259  [unknown]          [k] 0x4a6c
      1.50%  cachetest  ld-2.11.2.so       [.] 0x1777c
      1.46%    :3259  [kernel.kallsyms]  [k] .perf_event_mmap_ctx
      1.25%    :3259  [kernel.kallsyms]  [k] restore
      0.74%    :3259  [kernel.kallsyms]  [k] ._raw_spin_lock
      0.71%    :3259  [kernel.kallsyms]  [k] .filemap_fault
      0.66%    :3259  [kernel.kallsyms]  [k] .memset
      0.54%  cachetest  [kernel.kallsyms]  [k] .sha_transform
      0.54%    :3259  [kernel.kallsyms]  [k] .copy_4K_page
      0.54%    :3259  [kernel.kallsyms]  [k] .find_get_page
      0.52%    :3259  [kernel.kallsyms]  [k] .trace_hardirqs_off
      0.50%    :3259  [kernel.kallsyms]  [k] .__do_fault
<SNIP>

After:
 # perf report

 # Events: 6K cycles
 #
 # Overhead  Command      Shared Object                           Symbol
 # ........  .......  .................  ...............................
 #
     44.28%  cachetest  cachetest          [.] sumArrayNaive
     22.53%  cachetest  cachetest          [.] sumArrayOptimal
      6.59%  cachetest  ld-2.11.2.so       [.] 0x1777c
      2.13%  cachetest  [unknown]          [k] 0x340
      1.46%  cachetest  [kernel.kallsyms]  [k] .perf_event_mmap_ctx
      1.25%  cachetest  [kernel.kallsyms]  [k] restore
      0.74%  cachetest  [kernel.kallsyms]  [k] ._raw_spin_lock
      0.71%  cachetest  [kernel.kallsyms]  [k] .filemap_fault
      0.66%  cachetest  [kernel.kallsyms]  [k] .memset
      0.54%  cachetest  [kernel.kallsyms]  [k] .copy_4K_page
      0.54%  cachetest  [kernel.kallsyms]  [k] .find_get_page
      0.54%  cachetest  [kernel.kallsyms]  [k] .sha_transform
      0.52%  cachetest  [kernel.kallsyms]  [k] .trace_hardirqs_off
      0.50%  cachetest  [kernel.kallsyms]  [k] .__do_fault
<SNIP>

Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
LKML-Reference: <1291872833-839-1-git-send-email-imunsie@au1.ibm.com>
Signed-off-by: default avatarIan Munsie <imunsie@au1.ibm.com>
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 21ef97f0
...@@ -375,6 +375,8 @@ static struct perf_event_ops event_ops = { ...@@ -375,6 +375,8 @@ static struct perf_event_ops event_ops = {
.mmap = event__process_mmap, .mmap = event__process_mmap,
.comm = event__process_comm, .comm = event__process_comm,
.fork = event__process_task, .fork = event__process_task,
.ordered_samples = true,
.ordering_requires_timestamps = true,
}; };
static int __cmd_annotate(void) static int __cmd_annotate(void)
......
...@@ -61,6 +61,8 @@ static struct perf_event_ops event_ops = { ...@@ -61,6 +61,8 @@ static struct perf_event_ops event_ops = {
.exit = event__process_task, .exit = event__process_task,
.fork = event__process_task, .fork = event__process_task,
.lost = event__process_lost, .lost = event__process_lost,
.ordered_samples = true,
.ordering_requires_timestamps = true,
}; };
static void perf_session__insert_hist_entry_by_name(struct rb_root *root, static void perf_session__insert_hist_entry_by_name(struct rb_root *root,
......
...@@ -285,7 +285,7 @@ static void create_counter(int counter, int cpu) ...@@ -285,7 +285,7 @@ static void create_counter(int counter, int cpu)
if (system_wide) if (system_wide)
attr->sample_type |= PERF_SAMPLE_CPU; attr->sample_type |= PERF_SAMPLE_CPU;
if (sample_time) if (sample_time || system_wide || !no_inherit || cpu_list)
attr->sample_type |= PERF_SAMPLE_TIME; attr->sample_type |= PERF_SAMPLE_TIME;
if (raw_samples) { if (raw_samples) {
...@@ -327,6 +327,9 @@ static void create_counter(int counter, int cpu) ...@@ -327,6 +327,9 @@ static void create_counter(int counter, int cpu)
* Old kernel, no attr->sample_id_type_all field * Old kernel, no attr->sample_id_type_all field
*/ */
sample_id_all_avail = false; sample_id_all_avail = false;
if (!sample_time && !raw_samples)
attr->sample_type &= ~PERF_SAMPLE_TIME;
goto retry_sample_id; goto retry_sample_id;
} }
......
...@@ -244,6 +244,8 @@ static struct perf_event_ops event_ops = { ...@@ -244,6 +244,8 @@ static struct perf_event_ops event_ops = {
.event_type = event__process_event_type, .event_type = event__process_event_type,
.tracing_data = event__process_tracing_data, .tracing_data = event__process_tracing_data,
.build_id = event__process_build_id, .build_id = event__process_build_id,
.ordered_samples = true,
.ordering_requires_timestamps = true,
}; };
extern volatile int session_done; extern volatile int session_done;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment