lkml.org 
[lkml]   [2013]   [Aug]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V10 12/13] perf tools: add a function to calculate sample event size
    Date
    Add perf_event__sample_event_size() which can be used when
    synthesizing sample events to determine how big the resulting
    event will be, and therefore how much memory to allocate.

    Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
    ---
    tools/perf/util/event.h | 2 ++
    tools/perf/util/evsel.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++
    2 files changed, 94 insertions(+)

    diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
    index c5f87e1..7d41716 100644
    --- a/tools/perf/util/event.h
    +++ b/tools/perf/util/event.h
    @@ -244,6 +244,8 @@ int perf_event__preprocess_sample(const union perf_event *self,

    const char *perf_event__name(unsigned int id);

    +size_t perf_event__sample_event_size(const struct perf_sample *sample, u64 type,
    + u64 sample_regs_user, u64 read_format);
    int perf_event__synthesize_sample(union perf_event *event, u64 type,
    u64 sample_regs_user, u64 read_format,
    const struct perf_sample *sample,
    diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
    index 798ac62..491372f 100644
    --- a/tools/perf/util/evsel.c
    +++ b/tools/perf/util/evsel.c
    @@ -1442,6 +1442,98 @@ int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event,
    return 0;
    }

    +size_t perf_event__sample_event_size(const struct perf_sample *sample, u64 type,
    + u64 sample_regs_user, u64 read_format)
    +{
    + size_t sz, result = sizeof(struct sample_event);
    +
    + if (type & PERF_SAMPLE_IDENTIFIER)
    + result += sizeof(u64);
    +
    + if (type & PERF_SAMPLE_IP)
    + result += sizeof(u64);
    +
    + if (type & PERF_SAMPLE_TID)
    + result += sizeof(u64);
    +
    + if (type & PERF_SAMPLE_TIME)
    + result += sizeof(u64);
    +
    + if (type & PERF_SAMPLE_ADDR)
    + result += sizeof(u64);
    +
    + if (type & PERF_SAMPLE_ID)
    + result += sizeof(u64);
    +
    + if (type & PERF_SAMPLE_STREAM_ID)
    + result += sizeof(u64);
    +
    + if (type & PERF_SAMPLE_CPU)
    + result += sizeof(u64);
    +
    + if (type & PERF_SAMPLE_PERIOD)
    + result += sizeof(u64);
    +
    + if (type & PERF_SAMPLE_READ) {
    + result += sizeof(u64);
    + if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED)
    + result += sizeof(u64);
    + if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING)
    + result += sizeof(u64);
    + /* PERF_FORMAT_ID is forced for PERF_SAMPLE_READ */
    + if (read_format & PERF_FORMAT_GROUP) {
    + sz = sample->read.group.nr *
    + sizeof(struct sample_read_value);
    + result += sz;
    + } else {
    + result += sizeof(u64);
    + }
    + }
    +
    + if (type & PERF_SAMPLE_CALLCHAIN) {
    + sz = (sample->callchain->nr + 1) * sizeof(u64);
    + result += sz;
    + }
    +
    + if (type & PERF_SAMPLE_RAW) {
    + result += sizeof(u32);
    + result += sample->raw_size;
    + }
    +
    + if (type & PERF_SAMPLE_BRANCH_STACK) {
    + sz = sample->branch_stack->nr * sizeof(struct branch_entry);
    + sz += sizeof(u64);
    + result += sz;
    + }
    +
    + if (type & PERF_SAMPLE_REGS_USER) {
    + if (sample->user_regs.regs && sample_regs_user) {
    + result += sizeof(u64);
    + sz = hweight_long(sample_regs_user) * sizeof(u64);
    + result += sz;
    + } else {
    + result += sizeof(u64);
    + }
    + }
    +
    + if (type & PERF_SAMPLE_STACK_USER) {
    + sz = sample->user_stack.size;
    + result += sizeof(u64);
    + if (sz) {
    + result += sz;
    + result += sizeof(u64);
    + }
    + }
    +
    + if (type & PERF_SAMPLE_WEIGHT)
    + result += sizeof(u64);
    +
    + if (type & PERF_SAMPLE_DATA_SRC)
    + result += sizeof(u64);
    +
    + return result;
    +}
    +
    int perf_event__synthesize_sample(union perf_event *event, u64 type,
    u64 sample_regs_user, u64 read_format,
    const struct perf_sample *sample,
    --
    1.7.11.7


    \
     
     \ /
      Last update: 2013-08-09 13:21    [W:4.168 / U:0.144 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site