[tip:perf/core] perf stat record: Write stat events on record

tip-bot for Jiri Olsa
2015-12-18T09:13:43Z

Commit-ID: 5a6ea81b8f9ce2736759d256ac4d63be65751199
Gitweb: http://git.kernel.org/tip/5a6ea81b8f9ce2736759d256ac4d63be65751199
Author: Jiri Olsa <jolsa@kernel.org>
AuthorDate: Thu, 5 Nov 2015 15:40:51 +0100
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Thu, 17 Dec 2015 16:00:22 -0300

perf stat record: Write stat events on record

Writing stat events on 'perf stat record' at the time we read counter
values from kernel.

Committer note:

After the patch:

$ perf stat record usleep 1

Performance counter stats for 'usleep 1':

0.598006 task-clock (msec) # 0.484 CPUs utilized
1 context-switches # 0.002 M/sec
0 cpu-migrations # 0.000 K/sec
52 page-faults # 0.087 M/sec
882,744 cycles # 1.476 GHz
581,416 stalled-cycles-frontend # 65.86% frontend cycles idle
<not supported> stalled-cycles-backend
636,479 instructions # 0.72 insns per cycle
# 0.91 stalled cycles per insn
129,334 branches # 216.275 M/sec
7,512 branch-misses # 5.81% of all branches

0.001235157 seconds time elapsed

$ oldperf evlist
task-clock
context-switches
cpu-migrations
page-faults
cycles
stalled-cycles-frontend
stalled-cycles-backend
instructions
branches
branch-misses
$ oldperf report --stdio
Error:
The perf.data file has no samples!
# To display the perf.data header info, please use --header/--header-only options.
#
$ perf report -D | grep PERF_RECORD
0x5b0 [0x28]: PERF_RECORD_THREAD_MAP nr: 1 thread: 5504
0x5d8 [0x12]: PERF_RECORD_CPU_MAP nr: 1 cpu: 65535
0x5ea [0x40]: PERF_RECORD_STAT_CONFIG
0x62a [0x30]: PERF_RECORD_STAT
0x65a [0x30]: PERF_RECORD_STAT
0x68a [0x30]: PERF_RECORD_STAT
0x6ba [0x30]: PERF_RECORD_STAT
0x6ea [0x30]: PERF_RECORD_STAT
0x71a [0x30]: PERF_RECORD_STAT
0x74a [0x30]: PERF_RECORD_STAT
0x77a [0x30]: PERF_RECORD_STAT
0x7aa [0x30]: PERF_RECORD_STAT
-1 -1 0x7da [0x40]: PERF_RECORD_MMAP -1/0: [0xffffffff81000000(0x1f000000) @ 0xffffffff81000000]: x [kernel.kallsyms]_text
$

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Tested-by: Kan Liang <kan.liang@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1446734469-11352-8-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/builtin-stat.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)

diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 8a2f9ce..32aa2ea 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -231,6 +231,18 @@ static int process_synthesized_event(struct perf_tool *tool __maybe_unused,
return 0;
}

+#define SID(e, x, y) xyarray__entry(e->sample_id, x, y)
+
+static int
+perf_evsel__write_stat_event(struct perf_evsel *counter, u32 cpu, u32 thread,
+ struct perf_counts_values *count)
+{
+ struct perf_sample_id *sid = SID(counter, cpu, thread);
+
+ return perf_event__synthesize_stat(NULL, cpu, thread, sid->id, count,
+ process_synthesized_event, NULL);
+}
+
/*
* Read out the results of a single counter:
* do not aggregate counts across CPUs in system-wide mode
@@ -254,6 +266,13 @@ static int read_counter(struct perf_evsel *counter)
count = perf_counts(counter->counts, cpu, thread);
if (perf_evsel__read(counter, cpu, thread, count))
return -1;
+
+ if (STAT_RECORD) {
+ if (perf_evsel__write_stat_event(counter, cpu, thread, count)) {
+ pr_err("failed to write stat event\n");
+ return -1;
+ }
+ }
}
}