diff options
author | Andi Kleen <ak@linux.intel.com> | 2018-09-24 13:07:32 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2018-10-24 14:29:56 -0400 |
commit | fe57120e18a1f9124ca758c89cc54f91333d1847 (patch) | |
tree | 20ebe6d2578d8b5ccd518dddaa750e8a76ee0d0d /tools/perf/builtin-script.c | |
parent | 99f753f048b3f02f31a56951781672021af6cd0d (diff) |
perf script: Support total cycles count
For 'perf script' brstackinsn also print a running cycles count. This
makes it easier to calculate cycle deltas for code sections measured
with LBRs.
% perf record -b -a sleep 1
% perf script -F +brstackinsn
...
00007f73ecc41083 insn: 74 06 # PRED 9 cycles [17] 1.11 IPC
00007f73ecc4108b insn: a8 10
00007f73ecc4108d insn: 74 71 # PRED 1 cycles [18] 1.00 IPC
00007f73ecc41100 insn: 48 8b 46 10
00007f73ecc41104 insn: 4c 8b 38
00007f73ecc41107 insn: 4d 85 ff
00007f73ecc4110a insn: 0f 84 b0 00 00 00
00007f73ecc41110 insn: 83 43 58 01
00007f73ecc41114 insn: 48 89 df
00007f73ecc41117 insn: e8 94 73 04 00 # PRED 6 cycles [24] 1.00 IPC
Signed-off-by: Andi Kleen <ak@linux.intel.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Link: http://lkml.kernel.org/r/20180924170732.GA28040@tassilo.jf.intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/builtin-script.c')
-rw-r--r-- | tools/perf/builtin-script.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index 9d2249ea75e3..b5bc85bd0bbe 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c | |||
@@ -913,7 +913,7 @@ static int grab_bb(u8 *buffer, u64 start, u64 end, | |||
913 | 913 | ||
914 | static int ip__fprintf_jump(uint64_t ip, struct branch_entry *en, | 914 | static int ip__fprintf_jump(uint64_t ip, struct branch_entry *en, |
915 | struct perf_insn *x, u8 *inbuf, int len, | 915 | struct perf_insn *x, u8 *inbuf, int len, |
916 | int insn, FILE *fp) | 916 | int insn, FILE *fp, int *total_cycles) |
917 | { | 917 | { |
918 | int printed = fprintf(fp, "\t%016" PRIx64 "\t%-30s\t#%s%s%s%s", ip, | 918 | int printed = fprintf(fp, "\t%016" PRIx64 "\t%-30s\t#%s%s%s%s", ip, |
919 | dump_insn(x, ip, inbuf, len, NULL), | 919 | dump_insn(x, ip, inbuf, len, NULL), |
@@ -922,7 +922,8 @@ static int ip__fprintf_jump(uint64_t ip, struct branch_entry *en, | |||
922 | en->flags.in_tx ? " INTX" : "", | 922 | en->flags.in_tx ? " INTX" : "", |
923 | en->flags.abort ? " ABORT" : ""); | 923 | en->flags.abort ? " ABORT" : ""); |
924 | if (en->flags.cycles) { | 924 | if (en->flags.cycles) { |
925 | printed += fprintf(fp, " %d cycles", en->flags.cycles); | 925 | *total_cycles += en->flags.cycles; |
926 | printed += fprintf(fp, " %d cycles [%d]", en->flags.cycles, *total_cycles); | ||
926 | if (insn) | 927 | if (insn) |
927 | printed += fprintf(fp, " %.2f IPC", (float)insn / en->flags.cycles); | 928 | printed += fprintf(fp, " %.2f IPC", (float)insn / en->flags.cycles); |
928 | } | 929 | } |
@@ -979,6 +980,7 @@ static int perf_sample__fprintf_brstackinsn(struct perf_sample *sample, | |||
979 | u8 buffer[MAXBB]; | 980 | u8 buffer[MAXBB]; |
980 | unsigned off; | 981 | unsigned off; |
981 | struct symbol *lastsym = NULL; | 982 | struct symbol *lastsym = NULL; |
983 | int total_cycles = 0; | ||
982 | 984 | ||
983 | if (!(br && br->nr)) | 985 | if (!(br && br->nr)) |
984 | return 0; | 986 | return 0; |
@@ -999,7 +1001,7 @@ static int perf_sample__fprintf_brstackinsn(struct perf_sample *sample, | |||
999 | printed += ip__fprintf_sym(br->entries[nr - 1].from, thread, | 1001 | printed += ip__fprintf_sym(br->entries[nr - 1].from, thread, |
1000 | x.cpumode, x.cpu, &lastsym, attr, fp); | 1002 | x.cpumode, x.cpu, &lastsym, attr, fp); |
1001 | printed += ip__fprintf_jump(br->entries[nr - 1].from, &br->entries[nr - 1], | 1003 | printed += ip__fprintf_jump(br->entries[nr - 1].from, &br->entries[nr - 1], |
1002 | &x, buffer, len, 0, fp); | 1004 | &x, buffer, len, 0, fp, &total_cycles); |
1003 | } | 1005 | } |
1004 | 1006 | ||
1005 | /* Print all blocks */ | 1007 | /* Print all blocks */ |
@@ -1027,7 +1029,8 @@ static int perf_sample__fprintf_brstackinsn(struct perf_sample *sample, | |||
1027 | 1029 | ||
1028 | printed += ip__fprintf_sym(ip, thread, x.cpumode, x.cpu, &lastsym, attr, fp); | 1030 | printed += ip__fprintf_sym(ip, thread, x.cpumode, x.cpu, &lastsym, attr, fp); |
1029 | if (ip == end) { | 1031 | if (ip == end) { |
1030 | printed += ip__fprintf_jump(ip, &br->entries[i], &x, buffer + off, len - off, insn, fp); | 1032 | printed += ip__fprintf_jump(ip, &br->entries[i], &x, buffer + off, len - off, insn, fp, |
1033 | &total_cycles); | ||
1031 | break; | 1034 | break; |
1032 | } else { | 1035 | } else { |
1033 | printed += fprintf(fp, "\t%016" PRIx64 "\t%s\n", ip, | 1036 | printed += fprintf(fp, "\t%016" PRIx64 "\t%s\n", ip, |