diff options
Diffstat (limited to 'tools/perf/util/intel-pt.c')
| -rw-r--r-- | tools/perf/util/intel-pt.c | 27 | 
1 files changed, 24 insertions, 3 deletions
diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c index 05d815851be1..137196990012 100644 --- a/tools/perf/util/intel-pt.c +++ b/tools/perf/util/intel-pt.c @@ -100,6 +100,8 @@ struct intel_pt {  	u64 cyc_bit;  	u64 noretcomp_bit;  	unsigned max_non_turbo_ratio; + +	unsigned long num_events;  };  enum switch_state { @@ -972,6 +974,10 @@ static int intel_pt_synth_branch_sample(struct intel_pt_queue *ptq)  	if (pt->branches_filter && !(pt->branches_filter & ptq->flags))  		return 0; +	if (pt->synth_opts.initial_skip && +	    pt->num_events++ < pt->synth_opts.initial_skip) +		return 0; +  	event->sample.header.type = PERF_RECORD_SAMPLE;  	event->sample.header.misc = PERF_RECORD_MISC_USER;  	event->sample.header.size = sizeof(struct perf_event_header); @@ -979,6 +985,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; @@ -1028,6 +1035,10 @@ static int intel_pt_synth_instruction_sample(struct intel_pt_queue *ptq)  	union perf_event *event = ptq->event_buf;  	struct perf_sample sample = { .ip = 0, }; +	if (pt->synth_opts.initial_skip && +	    pt->num_events++ < pt->synth_opts.initial_skip) +		return 0; +  	event->sample.header.type = PERF_RECORD_SAMPLE;  	event->sample.header.misc = PERF_RECORD_MISC_USER;  	event->sample.header.size = sizeof(struct perf_event_header); @@ -1035,6 +1046,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; @@ -1085,6 +1097,10 @@ static int intel_pt_synth_transaction_sample(struct intel_pt_queue *ptq)  	union perf_event *event = ptq->event_buf;  	struct perf_sample sample = { .ip = 0, }; +	if (pt->synth_opts.initial_skip && +	    pt->num_events++ < pt->synth_opts.initial_skip) +		return 0; +  	event->sample.header.type = PERF_RECORD_SAMPLE;  	event->sample.header.misc = PERF_RECORD_MISC_USER;  	event->sample.header.size = sizeof(struct perf_event_header); @@ -1092,6 +1108,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; @@ -1127,7 +1144,7 @@ static int intel_pt_synth_transaction_sample(struct intel_pt_queue *ptq)  		pr_err("Intel Processor Trace: failed to deliver transaction event, error %d\n",  		       ret); -	if (pt->synth_opts.callchain) +	if (pt->synth_opts.last_branch)  		intel_pt_reset_last_branch_rb(ptq);  	return ret; @@ -1196,14 +1213,18 @@ static int intel_pt_sample(struct intel_pt_queue *ptq)  	ptq->have_sample = false;  	if (pt->sample_instructions && -	    (state->type & INTEL_PT_INSTRUCTION)) { +	    (state->type & INTEL_PT_INSTRUCTION) && +	    (!pt->synth_opts.initial_skip || +	     pt->num_events++ >= pt->synth_opts.initial_skip)) {  		err = intel_pt_synth_instruction_sample(ptq);  		if (err)  			return err;  	}  	if (pt->sample_transactions && -	    (state->type & INTEL_PT_TRANSACTION)) { +	    (state->type & INTEL_PT_TRANSACTION) && +	    (!pt->synth_opts.initial_skip || +	     pt->num_events++ >= pt->synth_opts.initial_skip)) {  		err = intel_pt_synth_transaction_sample(ptq);  		if (err)  			return err;  |