perf, tools: Support direct --user-regs arguments
PATCH 1/2 perf, tools: Support direct --user-regs arguments
From: Andi Kleen <[email protected]>
USER_REGS can currently only collected implicitely with call graph recording. Sometimes it is useful to see them separately, and filter them. Add a new --user-regs option to record that is similar to --intr-regs, but acts on user regs.
--- tools/perf/Documentation/perf-record.txt | 2 ++ tools/perf/builtin-record.c | 3 +++ tools/perf/perf.h | 1 + tools/perf/util/evsel.c | 7 ++++++- 4 files changed, 12 insertions(+), 1 deletion(-)
tools/perf/Documentation/perf-record.txt +2 -0
@@ -374,6 +374,8 @@ symbolic names, e.g. on x86, ax, si. To list the available registers use --intr-regs=\?. To name registers, pass a comma separated list such as --intr-regs=ax,bx. The list of register is architecture dependent. +--user-regs:: +Capture user registers at sample time. Same arguments as -I. --running-time:: Record running and enabled time for read events (:S)
tools/perf/builtin-record.c +3 -0
@@ -1641,6 +1641,9 @@ static struct option __record_options[] = {OPT_CALLBACK_OPTARG ('I' ,"intr-regs" , &record.opts.sample_intr_regs,NULL ,"any register" ,"sample selected machine registers on interrupt," " use -I ? to list register names" , parse_regs), +OPT_CALLBACK_OPTARG (0 ,"user-regs" , &record.opts.sample_user_regs,NULL ,"any register" , +"sample selected machine registers on interrupt," +" use -I ? to list register names" , parse_regs),OPT_BOOLEAN (0 ,"running-time" , &record.opts.running_time,"Record running/enabled time of read (:S) events" ), OPT_CALLBACK('k', "clockid", &record.opts,
tools/perf/perf.h +1 -0
@@ -64,6 +64,7 @@ struct record_opts {unsigned int user_freq;u64 branch_stack;u64 sample_intr_regs; +u64 sample_user_regs;u64 default_interval;u64 user_interval;size_t auxtrace_snapshot_size;
tools/perf/util/evsel.c +6 -1
@@ -678,7 +678,7 @@ void perf_evsel__config_callchain(struct perf_evsel *evsel,if (!function) {perf_evsel__set_sample_bit (evsel,REGS_USER );perf_evsel__set_sample_bit (evsel,STACK_USER ); - attr->sample_regs_user =PERF_REGS_MASK ; + attr->sample_regs_user |=PERF_REGS_MASK ; attr->sample_stack_user = param->dump_size; attr->exclude_callchain_user =1 ; }else {
@@ -931,6 +931,11 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts,perf_evsel__set_sample_bit (evsel,REGS_INTR ); } +if (opts->sample_user_regs) { + attr->sample_regs_user |= opts->sample_user_regs; +perf_evsel__set_sample_bit (evsel,REGS_USER ); + } +if (target__has_cpu (&opts->target) || opts->sample_cpu)perf_evsel__set_sample_bit (evsel,CPU );
Signature · 1 line
2.9.5
PATCH 2/2 perf, tools: Support user regs in perf script
From: Andi Kleen <[email protected]>
Teach perf script to print user regs.
% perf record --user-regs=ip,sp ...
% perf script -F ip,sym,uregs
...
ffffffff9e060c24 native_write_msr ABI:2 SP:0x7ffd0ea06c38 IP:0x7fe77f55b637 ffffffff9e060c24 native_write_msr ABI:2 SP:0x7ffd0ea06c38 IP:0x7fe77f55b637 ffffffff9e060c24 native_write_msr ABI:2 SP:0x7ffd0ea06c38 IP:0x7fe77f55b637 ffffffff9e060c24 native_write_msr ABI:2 SP:0x7ffd0ea06c38 IP:0x7fe77f55b637
ffffffff9e00cc12 intel_pmu_handle_irq ABI:2 SP:0x7ffd0ea06c38 IP:0x7fe77f55b637
--- tools/perf/Documentation/perf-script.txt | 2 +- tools/perf/builtin-script.c | 30 +++++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-)
tools/perf/Documentation/perf-script.txt +1 -1
@@ -116,7 +116,7 @@ OPTIONS --fields:: Comma separated list of fields to print. Options are: comm, tid, pid, time, cpu, event, trace, ip, sym, dso, addr, symoff, - srcline, period, iregs, brstack, brstacksym, flags, bpf-output, brstackinsn, brstackoff, + srcline, period, iregs, uregs, brstack, brstacksym, flags, bpf-output, brstackinsn, brstackoff, callindent, insn, insnlen, synth. Field list can be prepended with the type, trace, sw or hw, to indicate to which event type the field list applies.
tools/perf/builtin-script.c +29 -1
@@ -87,6 +87,7 @@ enum perf_output_field {PERF_OUTPUT_BRSTACKINSN =1U <<23 ,PERF_OUTPUT_BRSTACKOFF =1U <<24 ,PERF_OUTPUT_SYNTH =1U <<25 , + PERF_OUTPUT_UREGS = 1U << 26, }; struct output_option {
@@ -108,6 +109,7 @@ struct output_option { {.str = "srcline", .field = PERF_OUTPUT_SRCLINE}, {.str = "period", .field = PERF_OUTPUT_PERIOD}, {.str = "iregs", .field = PERF_OUTPUT_IREGS}, + {.str = "uregs", .field = PERF_OUTPUT_UREGS}, {.str = "brstack", .field = PERF_OUTPUT_BRSTACK}, {.str = "brstacksym", .field = PERF_OUTPUT_BRSTACKSYM}, {.str = "data_src", .field = PERF_OUTPUT_DATA_SRC},
@@ -382,6 +384,11 @@ static int perf_evsel__check_attr(struct perf_evsel *evsel, PERF_OUTPUT_IREGS))return -EINVAL ; +if (PRINT_FIELD (UREGS ) && +perf_evsel__check_stype (evsel,PERF_SAMPLE_REGS_USER ,"UREGS" , +PERF_OUTPUT_UREGS )) +return -EINVAL ; +return 0 ; }
@@ -501,6 +508,24 @@ static void print_sample_iregs(struct perf_sample *sample, } } +static void print_sample_uregs (struct perf_sample *sample, +struct perf_event_attr *attr) +{ +struct regs_dump *regs = &sample->user_regs; +uint64_t mask = attr->sample_regs_user; +unsigned i =0 , r; + +if (!regs || !regs->regs) +return ; + +printf (" ABI:%lu " , regs->abi); + +for_each_set_bit (r, (unsigned long *) &mask,sizeof (mask) *8 ) { +u64 val = regs->regs[i++]; +printf ("%5s:0x%" PRIx64" " ,perf_reg_name (r), val); + } +} +static void print_sample_start (struct perf_sample *sample,struct thread *thread,struct perf_evsel *evsel)
@@ -1436,6 +1461,9 @@ static void process_event(struct perf_script *script,if (PRINT_FIELD (IREGS ))print_sample_iregs (sample, attr); +if (PRINT_FIELD (UREGS )) +print_sample_uregs (sample, attr); +if (PRINT_FIELD (BRSTACK ))print_sample_brstack (sample, thread, attr);else if (PRINT_FIELD (BRSTACKSYM ))
@@ -2728,7 +2756,7 @@ int cmd_script(int argc, const char **argv) "+field to add and -field to remove." "Valid types: hw,sw,trace,raw,synth. " "Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso," - "addr,symoff,period,iregs,brstack,brstacksym,flags," + "addr,symoff,period,iregs,uregs,brstack,brstacksym,flags," "bpf-output,callindent,insn,insnlen,brstackinsn,synth", parse_output_fields), OPT_BOOLEAN('a', "all-cpus", &system_wide,
Signature · 1 line
2.9.5
Arnaldo Carvalho de Melo
maintainerRe: [PATCH 2/2] perf, tools: Support user regs in perf script
Em Tue, Sep 05, 2017 at 10:00:29AM -0700, Andi Kleen escreveu:
Quoted 6 lines
From: Andi Kleen <[email protected]>
Teach perf script to print user regs.
% perf record --user-regs=ip,sp ...
% perf script -F ip,sym,uregs
Applied the first patch, but this one isn't applying, please check.
Last changes here on builtin-script.c:
[acme@jouet linux]$ git log --oneline -10 tools/perf/builtin-script.c49d58f04eb6c perf script: Support physical address2ec5cab604b2 perf script: Remove some bogus error handlinge9def1b2e74e perf tools: Add feature header record to pipe-mode114f709e01e6 perf tool: Add show_feature_header to perf_tool644e0840ad46 (tag: perf-core-for-mingo-4.13-20170630) perf auxtrace: Add CPU filter support 65c5e18f9df0 perf script: Add synthesized Intel PT power and ptwrite events47e780848e62 perf script: Add 'synth' field for synthesized event payloads1405720d4f26 perf script: Add 'synth' event type for synthesized events701516ae3dec (tag: perf-core-for-mingo-4.13-20170621) perf script: Fix message because field list option is -F not -f 106dacd86f04 perf script: Support -F brstackoff,dso
[acme@jouet linux]$
Quoted 103 lines
ffffffff9e060c24 native_write_msr ABI:2 SP:0x7ffd0ea06c38 IP:0x7fe77f55b637 ffffffff9e060c24 native_write_msr ABI:2 SP:0x7ffd0ea06c38 IP:0x7fe77f55b637 ffffffff9e060c24 native_write_msr ABI:2 SP:0x7ffd0ea06c38 IP:0x7fe77f55b637 ffffffff9e060c24 native_write_msr ABI:2 SP:0x7ffd0ea06c38 IP:0x7fe77f55b637
ffffffff9e00cc12intel_pmu_handle_irqABI:2 SP:0x7ffd0ea06c38 IP:0x7fe77f55b637Signed-off-by Andi Kleen <[email protected]>--- tools/perf/Documentation/perf-script.txt | 2 +- tools/perf/builtin-script.c | 30 +++++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-)tools/perf/Documentation/perf-script.txt +1
-1@@ -116,7 +116,7 @@ OPTIONS --fields:: Comma separated list of fields to print. Options are: comm, tid, pid, time, cpu, event, trace, ip, sym, dso, addr, symoff, - srcline, period, iregs, brstack, brstacksym, flags, bpf-output, brstackinsn, brstackoff, + srcline, period, iregs, uregs, brstack, brstacksym, flags, bpf-output, brstackinsn, brstackoff, callindent, insn, insnlen, synth. Field list can be prepended with the type, trace, sw or hw, to indicate to which event type the field list applies.tools/perf/builtin-script.c +29
-1@@ -87,6 +87,7 @@ enum perf_output_field {PERF_OUTPUT_BRSTACKINSN =1U <<23 ,PERF_OUTPUT_BRSTACKOFF =1U <<24 ,PERF_OUTPUT_SYNTH =1U <<25 , + PERF_OUTPUT_UREGS = 1U << 26, }; struct output_option {@@ -108,6 +109,7 @@ struct output_option { {.str = "srcline", .field = PERF_OUTPUT_SRCLINE}, {.str = "period", .field = PERF_OUTPUT_PERIOD}, {.str = "iregs", .field = PERF_OUTPUT_IREGS}, + {.str = "uregs", .field = PERF_OUTPUT_UREGS}, {.str = "brstack", .field = PERF_OUTPUT_BRSTACK}, {.str = "brstacksym", .field = PERF_OUTPUT_BRSTACKSYM}, {.str = "data_src", .field = PERF_OUTPUT_DATA_SRC},@@ -382,6 +384,11 @@ static int perf_evsel__check_attr(struct perf_evsel *evsel, PERF_OUTPUT_IREGS))return -EINVAL ; +if (PRINT_FIELD (UREGS ) && +perf_evsel__check_stype (evsel,PERF_SAMPLE_REGS_USER ,"UREGS" , +PERF_OUTPUT_UREGS )) +return -EINVAL ; +return 0 ; }@@ -501,6 +508,24 @@ static void print_sample_iregs(struct perf_sample *sample, } } +static void print_sample_uregs (struct perf_sample *sample, +struct perf_event_attr *attr) +{ +struct regs_dump *regs = &sample->user_regs; +uint64_t mask = attr->sample_regs_user; +unsigned i =0 , r; + +if (!regs || !regs->regs) +return ; + +printf (" ABI:%lu " , regs->abi); + +for_each_set_bit (r, (unsigned long *) &mask,sizeof (mask) *8 ) { +u64 val = regs->regs[i++]; +printf ("%5s:0x%" PRIx64" " ,perf_reg_name (r), val); + } +} +static void print_sample_start (struct perf_sample *sample,struct thread *thread,struct perf_evsel *evsel)@@ -1436,6 +1461,9 @@ static void process_event(struct perf_script *script,if (PRINT_FIELD (IREGS ))print_sample_iregs (sample, attr); +if (PRINT_FIELD (UREGS )) +print_sample_uregs (sample, attr); +if (PRINT_FIELD (BRSTACK ))print_sample_brstack (sample, thread, attr);else if (PRINT_FIELD (BRSTACKSYM ))@@ -2728,7 +2756,7 @@ int cmd_script(int argc, const char **argv) "+field to add and -field to remove." "Valid types: hw,sw,trace,raw,synth. " "Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso," - "addr,symoff,period,iregs,brstack,brstacksym,flags," + "addr,symoff,period,iregs,uregs,brstack,brstacksym,flags," "bpf-output,callindent,insn,insnlen,brstackinsn,synth", parse_output_fields), OPT_BOOLEAN('a', "all-cpus", &system_wide,Signature · 1 line
2.9.5
Re: [PATCH 2/2] perf, tools: Support user regs in perf script
Quoted 9 lines · Arnaldo Carvalho de Melo
Em Tue, Sep 05, 2017 at 10:00:29AM -0700, Andi Kleen escreveu:
Quoted 6 lines
From: Andi Kleen <[email protected]>
Teach perf script to print user regs.
% perf record --user-regs=ip,sp ...
% perf script -F ip,sym,uregsApplied the first patch, but this one isn't applying, please check.
It conflicts with the physical address patches, will rebase and resend.
Or it's usually just trivial conflicts with the perf script options if you want to take a stab.
-Andi
Arnaldo Carvalho de Melo
maintainerRe: [PATCH 2/2] perf, tools: Support user regs in perf script
Em Tue, Sep 05, 2017 at 11:28:20AM -0700, Andi Kleen escreveu:
Quoted 9 lines · Arnaldo Carvalho de Melo
Quoted 8 lines
Em Tue, Sep 05, 2017 at 10:00:29AM -0700, Andi Kleen escreveu:
Quoted 6 lines
From: Andi Kleen <[email protected]>
Teach perf script to print user regs.
% perf record --user-regs=ip,sp ...
% perf script -F ip,sym,uregs
Quoted 7 lines
Quoted 1 line
Applied the first patch, but this one isn't applying, please check.
It conflicts with the physical address patches, will rebase and resend.
Or it's usually just trivial conflicts with the perf script options if you want to take a stab.
yeah, done.
- Arnaldo
Arnaldo Carvalho de Melo
maintainerRe: [PATCH 2/2] perf, tools: Support user regs in perf script
Em Tue, Sep 05, 2017 at 03:47:35PM -0300, Arnaldo Carvalho de Melo escreveu:
Quoted 12 lines
Em Tue, Sep 05, 2017 at 11:28:20AM -0700, Andi Kleen escreveu:
Quoted 11 lines · Arnaldo Carvalho de Melo
Quoted 9 lines
Em Tue, Sep 05, 2017 at 10:00:29AM -0700, Andi Kleen escreveu:
Quoted 6 lines
From: Andi Kleen <[email protected]>
Teach perf script to print user regs.
% perf record --user-regs=ip,sp ...
% perf script -F ip,sym,uregsApplied the first patch, but this one isn't applying, please check.
Quoted 7 lines
Quoted 5 lines
It conflicts with the physical address patches, will rebase and resend.
Or it's usually just trivial conflicts with the perf script options if you want to take a stab.
yeah, done.
But you did it in a different order, i.e. in some hunks you put it before the code handling phys_addr, so I'll use your patch instead, since you did it anyway.
- Arnaldo
tip-bot for Andi Kleen
merge bot[tip:perf/core] perf record: Support direct --user-regs arguments
In reply to Andi Kleenperf record: Support direct --user-regs arguments
Commit-ID: 84c417422798c897f637b0249f64a52807b4a61b Gitweb: http://git.kernel.org/tip/84c417422798c897f637b0249f64a52807b4a61b Author: Andi Kleen <[email protected]> AuthorDate: Tue, 5 Sep 2017 10:00:28 -0700 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 13 Sep 2017 09:49:14 -0300
perf record: Support direct --user-regs arguments
USER_REGS can currently only collected implicitely with call graph recording. Sometimes it is useful to see them separately, and filter them. Add a new --user-regs option to record that is similar to --intr-regs, but acts on user regs.
--- tools/perf/Documentation/perf-record.txt | 2 ++ tools/perf/builtin-record.c | 3 +++ tools/perf/perf.h | 1 + tools/perf/util/evsel.c | 7 ++++++- 4 files changed, 12 insertions(+), 1 deletion(-)
tools/perf/Documentation/perf-record.txt +2 -0
@@ -377,6 +377,8 @@ symbolic names, e.g. on x86, ax, si. To list the available registers use --intr-regs=\?. To name registers, pass a comma separated list such as --intr-regs=ax,bx. The list of register is architecture dependent. +--user-regs:: +Capture user registers at sample time. Same arguments as -I. --running-time:: Record running and enabled time for read events (:S)
tools/perf/builtin-record.c +3 -0
@@ -1643,6 +1643,9 @@ static struct option __record_options[] = {OPT_CALLBACK_OPTARG ('I' ,"intr-regs" , &record.opts.sample_intr_regs,NULL ,"any register" ,"sample selected machine registers on interrupt," " use -I ? to list register names" , parse_regs), +OPT_CALLBACK_OPTARG (0 ,"user-regs" , &record.opts.sample_user_regs,NULL ,"any register" , +"sample selected machine registers on interrupt," +" use -I ? to list register names" , parse_regs),OPT_BOOLEAN (0 ,"running-time" , &record.opts.running_time,"Record running/enabled time of read (:S) events" ), OPT_CALLBACK('k', "clockid", &record.opts,
tools/perf/perf.h +1 -0
@@ -65,6 +65,7 @@ struct record_opts {unsigned int user_freq;u64 branch_stack;u64 sample_intr_regs; +u64 sample_user_regs;u64 default_interval;u64 user_interval;size_t auxtrace_snapshot_size;
tools/perf/util/evsel.c +6 -1
@@ -678,7 +678,7 @@ void perf_evsel__config_callchain(struct perf_evsel *evsel,if (!function) {perf_evsel__set_sample_bit (evsel,REGS_USER );perf_evsel__set_sample_bit (evsel,STACK_USER ); - attr->sample_regs_user =PERF_REGS_MASK ; + attr->sample_regs_user |=PERF_REGS_MASK ; attr->sample_stack_user = param->dump_size; attr->exclude_callchain_user =1 ; }else {
@@ -931,6 +931,11 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts,perf_evsel__set_sample_bit (evsel,REGS_INTR ); } +if (opts->sample_user_regs) { + attr->sample_regs_user |= opts->sample_user_regs; +perf_evsel__set_sample_bit (evsel,REGS_USER ); + } +if (target__has_cpu (&opts->target) || opts->sample_cpu)perf_evsel__set_sample_bit (evsel,CPU );