perf tools: Add missing initialization of perf_sample.cpumode in synthesized samples
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-ID: 3ea223adcb0c5893a6dc8ed3a84dce264cbb61d6 Gitweb: http://git.kernel.org/tip/3ea223adcb0c5893a6dc8ed3a84dce264cbb61d6 Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Tue, 29 Mar 2016 18:46:04 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Tue, 29 Mar 2016 20:03:56 -0300
perf tools: Add missing initialization of perf_sample.cpumode in synthesized samples
In 473398a21d28 ("perf tools: Add cpumode to struct perf_sample"), I missed some places where perf_sample fields are directly initialized in addition to what is done in perf_evsel__parse_sample(), namely when synthesizing PERF_RECORD_{MMAP*,COMM,FORK,EXIT} for pre-existing threads and also in intel_pt and intel_bts when synthesizing events from processor trace, the jitdump code also was affected, fix it.
The problem was noticed with running:
# perf record -e intel_pt//u true # perf script
Where the samples wouldn't get resolved because perf_sample.cpumode would be left as zero, i.e. PERF_RECORD_MISC_CPUMODE_UNKNOWN, not resolving as kernel, hypervisor or user cpu modes.
Cc Alexander Shishkin <[email protected]>
Cc Andi Kleen <[email protected]>
Cc David Ahern <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Peter Zijlstra <[email protected]>
Cc Stephane Eranian <[email protected]>
Cc Thomas Gleixner <[email protected]>
Fixes 473398a21d28 ("perf tools: Add cpumode to struct perf_sample")
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/event.c | 23 ++++++++++++++++------- tools/perf/util/intel-bts.c | 1 + tools/perf/util/intel-pt.c | 3 +++ tools/perf/util/jitdump.c | 2 ++ 4 files changed, 22 insertions(+), 7 deletions(-)
tools/perf/util/event.c +16 -7
@@ -56,13 +56,22 @@ const char *perf_event__name(unsigned int id)return perf_event__names[id]; } -static struct perf_sample synth_sample = { +static int perf_tool__process_synth_event (struct perf_tool *tool, +union perf_event *event, +struct machine *machine, +perf_event__handler_t process) +{ +struct perf_sample synth_sample = { .pid =-1 , .tid =-1 , .time =-1 , .stream_id =-1 , .cpu =-1 , .period =1 , + .cpumode = event->header.misc &PERF_RECORD_MISC_CPUMODE_MASK , + }; + +return process (tool, event, &synth_sample, machine); };/*
@@ -186,7 +195,7 @@ pid_t perf_event__synthesize_comm(struct perf_tool *tool,if (perf_event__prepare_comm (event, pid, machine, &tgid, &ppid) !=0 )return -1 ; -if (process (tool, event, &synth_sample, machine) !=0 ) +if (perf_tool__process_synth_event (tool, event, machine, process) !=0 )return -1 ;return tgid;
@@ -218,7 +227,7 @@ static int perf_event__synthesize_fork(struct perf_tool *tool, event->fork.header.size = (sizeof (event->fork) + machine->id_hdr_size); -if (process (tool, event, &synth_sample, machine) !=0 ) +if (perf_tool__process_synth_event (tool, event, machine, process) !=0 )return -1 ;return 0 ;
@@ -344,7 +353,7 @@ out: event->mmap2.pid = tgid; event->mmap2.tid = pid; -if (process (tool, event, &synth_sample, machine) !=0 ) { +if (perf_tool__process_synth_event (tool, event, machine, process) !=0 ) { rc =-1 ;break ; }
@@ -402,7 +411,7 @@ int perf_event__synthesize_modules(struct perf_tool *tool,memcpy (event->mmap.filename, pos->dso->long_name, pos->dso->long_name_len +1 ); -if (process (tool, event, &synth_sample, machine) !=0 ) { +if (perf_tool__process_synth_event (tool, event, machine, process) !=0 ) { rc =-1 ;break ; }
@@ -472,7 +481,7 @@ static int __event__synthesize_thread(union perf_event *comm_event,/* * Send the prepared comm event */ -if (process (tool, comm_event, &synth_sample, machine) !=0 ) +if (perf_tool__process_synth_event (tool, comm_event, machine, process) !=0 )break ; rc =0 ;
@@ -701,7 +710,7 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool, event->mmap.len = map->end - event->mmap.start; event->mmap.pid = machine->pid; - err =process (tool, event, &synth_sample, machine); + err =perf_tool__process_synth_event (tool, event, machine, process);free (event);return err;
tools/perf/util/intel-bts.c +1 -0
@@ -279,6 +279,7 @@ static int intel_bts_synth_branch_sample(struct intel_bts_queue *btsq, event.sample.header.misc =PERF_RECORD_MISC_USER ; event.sample.header.size =sizeof (struct perf_event_header ); + sample.cpumode =PERF_RECORD_MISC_USER ; sample.ip =le64_to_cpu (branch->from); sample.pid = btsq->pid; sample.tid = btsq->tid;
tools/perf/util/intel-pt.c +3 -0
@@ -979,6 +979,7 @@ static int intel_pt_synth_branch_sample(struct intel_pt_queue *ptq)if (!pt->timeless_decoding) sample.time =tsc_to_perf_time (ptq->timestamp, &pt->tc); + sample.cpumode =PERF_RECORD_MISC_USER ; sample.ip = ptq->state->from_ip; sample.pid = ptq->pid; sample.tid = ptq->tid;
@@ -1035,6 +1036,7 @@ static int intel_pt_synth_instruction_sample(struct intel_pt_queue *ptq)if (!pt->timeless_decoding) sample.time =tsc_to_perf_time (ptq->timestamp, &pt->tc); + sample.cpumode =PERF_RECORD_MISC_USER ; sample.ip = ptq->state->from_ip; sample.pid = ptq->pid; sample.tid = ptq->tid;
@@ -1092,6 +1094,7 @@ static int intel_pt_synth_transaction_sample(struct intel_pt_queue *ptq)if (!pt->timeless_decoding) sample.time =tsc_to_perf_time (ptq->timestamp, &pt->tc); + sample.cpumode =PERF_RECORD_MISC_USER ; sample.ip = ptq->state->from_ip; sample.pid = ptq->pid; sample.tid = ptq->tid;
tools/perf/util/jitdump.c +2 -0
@@ -417,6 +417,7 @@ static int jit_repipe_code_load(struct jit_buf_desc *jd, union jr_entry *jr)* use first address as sample address */ memset (&sample,0 ,sizeof (sample)); + sample.cpumode =PERF_RECORD_MISC_USER ; sample.pid = pid; sample.tid = tid; sample.time = id->time;
@@ -505,6 +506,7 @@ static int jit_repipe_code_move(struct jit_buf_desc *jd, union jr_entry *jr)* use first address as sample address */ memset (&sample,0 ,sizeof (sample)); + sample.cpumode =PERF_RECORD_MISC_USER ; sample.pid = pid; sample.tid = tid; sample.time = id->time;