|
@@ -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);
|
|
@@ -1029,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);
|
|
@@ -1087,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);
|
|
@@ -1199,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;
|