lkml.org 
[lkml]   [2017]   [Aug]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V2 1/5] perf tools: support new sample type for physical address
    Date
    From: Kan Liang <kan.liang@intel.com>

    Support new sample type PERF_SAMPLE_PHYS_ADDR for physical address.

    Add new option --phys-data to record sample physical address.

    Signed-off-by: Kan Liang <kan.liang@intel.com>
    ---
    tools/include/uapi/linux/perf_event.h | 4 +++-
    tools/perf/Documentation/perf-record.txt | 5 ++++-
    tools/perf/builtin-record.c | 2 ++
    tools/perf/perf.h | 1 +
    tools/perf/util/event.h | 1 +
    tools/perf/util/evsel.c | 17 +++++++++++++++++
    6 files changed, 28 insertions(+), 2 deletions(-)

    diff --git a/tools/include/uapi/linux/perf_event.h b/tools/include/uapi/linux/perf_event.h
    index 2a37ae9..140ae63 100644
    --- a/tools/include/uapi/linux/perf_event.h
    +++ b/tools/include/uapi/linux/perf_event.h
    @@ -139,8 +139,9 @@ enum perf_event_sample_format {
    PERF_SAMPLE_IDENTIFIER = 1U << 16,
    PERF_SAMPLE_TRANSACTION = 1U << 17,
    PERF_SAMPLE_REGS_INTR = 1U << 18,
    + PERF_SAMPLE_PHYS_ADDR = 1U << 19,

    - PERF_SAMPLE_MAX = 1U << 19, /* non-ABI */
    + PERF_SAMPLE_MAX = 1U << 20, /* non-ABI */
    };

    /*
    @@ -814,6 +815,7 @@ enum perf_event_type {
    * { u64 transaction; } && PERF_SAMPLE_TRANSACTION
    * { u64 abi; # enum perf_sample_regs_abi
    * u64 regs[weight(mask)]; } && PERF_SAMPLE_REGS_INTR
    + * { u64 phys_addr;} && PERF_SAMPLE_PHYS_ADDR
    * };
    */
    PERF_RECORD_SAMPLE = 9,
    diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt
    index 9bdea04..e397453 100644
    --- a/tools/perf/Documentation/perf-record.txt
    +++ b/tools/perf/Documentation/perf-record.txt
    @@ -249,7 +249,10 @@ OPTIONS

    -d::
    --data::
    - Record the sample addresses.
    + Record the sample virtual addresses.
    +
    +--phys-data::
    + Record the sample physical addresses.

    -T::
    --timestamp::
    diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
    index 36d7117..56f8142 100644
    --- a/tools/perf/builtin-record.c
    +++ b/tools/perf/builtin-record.c
    @@ -1604,6 +1604,8 @@ static struct option __record_options[] = {
    OPT_BOOLEAN('s', "stat", &record.opts.inherit_stat,
    "per thread counts"),
    OPT_BOOLEAN('d', "data", &record.opts.sample_address, "Record the sample addresses"),
    + OPT_BOOLEAN(0, "phys-data", &record.opts.sample_phys_addr,
    + "Record the sample physical addresses"),
    OPT_BOOLEAN(0, "sample-cpu", &record.opts.sample_cpu, "Record the sample cpu"),
    OPT_BOOLEAN_SET('T', "timestamp", &record.opts.sample_time,
    &record.opts.sample_time_set,
    diff --git a/tools/perf/perf.h b/tools/perf/perf.h
    index 2c010dd..dc442ba 100644
    --- a/tools/perf/perf.h
    +++ b/tools/perf/perf.h
    @@ -43,6 +43,7 @@ struct record_opts {
    bool no_samples;
    bool raw_samples;
    bool sample_address;
    + bool sample_phys_addr;
    bool sample_weight;
    bool sample_time;
    bool sample_time_set;
    diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
    index 423ac82..ee7bcc8 100644
    --- a/tools/perf/util/event.h
    +++ b/tools/perf/util/event.h
    @@ -200,6 +200,7 @@ struct perf_sample {
    u32 cpu;
    u32 raw_size;
    u64 data_src;
    + u64 phys_addr;
    u32 flags;
    u16 insn_len;
    u8 cpumode;
    diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
    index a5888c7..228a78d 100644
    --- a/tools/perf/util/evsel.c
    +++ b/tools/perf/util/evsel.c
    @@ -950,6 +950,9 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts,
    if (opts->sample_address)
    perf_evsel__set_sample_bit(evsel, DATA_SRC);

    + if (opts->sample_phys_addr)
    + perf_evsel__set_sample_bit(evsel, PHYS_ADDR);
    +
    if (opts->no_buffering) {
    attr->watermark = 0;
    attr->wakeup_events = 1;
    @@ -2201,6 +2204,12 @@ int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event,
    }
    }

    + data->phys_addr = 0;
    + if (type & PERF_SAMPLE_PHYS_ADDR) {
    + data->phys_addr = *array;
    + array++;
    + }
    +
    return 0;
    }

    @@ -2306,6 +2315,9 @@ size_t perf_event__sample_event_size(const struct perf_sample *sample, u64 type,
    }
    }

    + if (type & PERF_SAMPLE_PHYS_ADDR)
    + result += sizeof(u64);
    +
    return result;
    }

    @@ -2495,6 +2507,11 @@ int perf_event__synthesize_sample(union perf_event *event, u64 type,
    }
    }

    + if (type & PERF_SAMPLE_PHYS_ADDR) {
    + *array = sample->phys_addr;
    + array++;
    + }
    +
    return 0;
    }

    --
    2.4.3
    \
     
     \ /
      Last update: 2017-08-29 19:14    [W:4.601 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site