lkml.org 
[lkml]   [2019]   [Jun]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 06/11] perf intel-pt: Synthesize PEBS sample basic information
    Date
    Synthesize a PEBS sample using basic information (ip, timestamp) only.
    Other PEBS information will be added in later patches.

    Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
    ---
    tools/perf/util/intel-pt.c | 52 ++++++++++++++++++++++++++++++++++++--
    1 file changed, 50 insertions(+), 2 deletions(-)

    diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c
    index 1f5520f964ab..4517c02fa478 100644
    --- a/tools/perf/util/intel-pt.c
    +++ b/tools/perf/util/intel-pt.c
    @@ -1443,9 +1443,57 @@ static int intel_pt_synth_pwrx_sample(struct intel_pt_queue *ptq)
    pt->pwr_events_sample_type);
    }

    -static int intel_pt_synth_pebs_sample(struct intel_pt_queue *ptq __maybe_unused)
    +static int intel_pt_synth_pebs_sample(struct intel_pt_queue *ptq)
    {
    - return 0;
    + const struct intel_pt_blk_items *items = &ptq->state->items;
    + struct perf_sample sample = { .ip = 0, };
    + union perf_event *event = ptq->event_buf;
    + struct intel_pt *pt = ptq->pt;
    + struct perf_evsel *evsel = pt->pebs_evsel;
    + u64 sample_type = evsel->attr.sample_type;
    + u64 id = evsel->id[0];
    + u8 cpumode;
    +
    + if (intel_pt_skip_event(pt))
    + return 0;
    +
    + intel_pt_prep_a_sample(ptq, event, &sample);
    +
    + sample.id = id;
    + sample.stream_id = id;
    +
    + if (!evsel->attr.freq)
    + sample.period = evsel->attr.sample_period;
    +
    + /* No support for non-zero CS base */
    + if (items->has_ip)
    + sample.ip = items->ip;
    + else if (items->has_rip)
    + sample.ip = items->rip;
    + else
    + sample.ip = ptq->state->from_ip;
    +
    + /* No support for guest mode at this time */
    + cpumode = sample.ip < ptq->pt->kernel_start ?
    + PERF_RECORD_MISC_USER :
    + PERF_RECORD_MISC_KERNEL;
    +
    + event->sample.header.misc = cpumode | PERF_RECORD_MISC_EXACT_IP;
    +
    + sample.cpumode = cpumode;
    +
    + if (sample_type & PERF_SAMPLE_TIME) {
    + u64 timestamp = 0;
    +
    + if (items->has_timestamp)
    + timestamp = items->timestamp;
    + else if (!pt->timeless_decoding)
    + timestamp = ptq->timestamp;
    + if (timestamp)
    + sample.time = tsc_to_perf_time(timestamp, &pt->tc);
    + }
    +
    + return intel_pt_deliver_synth_event(pt, ptq, event, &sample, sample_type);
    }

    static int intel_pt_synth_error(struct intel_pt *pt, int code, int cpu,
    --
    2.17.1
    \
     
     \ /
      Last update: 2019-06-10 09:30    [W:4.126 / U:0.276 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site