lkml.org 
[lkml]   [2015]   [Oct]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 22/57] perf tools: Add attr_update event name type
    Date
    Adding name type attr update event, that stores/transfer
    events name. Event's name is stored within perf.data's
    EVENT_DESC feature, but we don't have if we get report
    data from pipe.

    Link: http://lkml.kernel.org/n/tip-j8b9c0ev11zisop3qup1hdy8@git.kernel.org
    Signed-off-by: Jiri Olsa <jolsa@kernel.org>
    ---
    tools/perf/tests/attr_update.c | 25 +++++++++++++++++++++++++
    tools/perf/util/event.h | 1 +
    tools/perf/util/header.c | 21 +++++++++++++++++++++
    tools/perf/util/header.h | 3 +++
    4 files changed, 50 insertions(+)

    diff --git a/tools/perf/tests/attr_update.c b/tools/perf/tests/attr_update.c
    index 854a04c37ad6..a88c0d7d9d08 100644
    --- a/tools/perf/tests/attr_update.c
    +++ b/tools/perf/tests/attr_update.c
    @@ -34,10 +34,30 @@ static int process_event_scale(struct perf_tool *tool __maybe_unused,
    return 0;
    }

    +struct event_name {
    + struct perf_tool tool;
    + const char *name;
    +};
    +
    +static int process_event_name(struct perf_tool *tool,
    + union perf_event *event,
    + struct perf_sample *sample __maybe_unused,
    + struct machine *machine __maybe_unused)
    +{
    + struct event_name *tmp = container_of(tool, struct event_name, tool);
    + struct attr_update_event *ev = (struct attr_update_event*) event;
    +
    + TEST_ASSERT_VAL("wrong id", ev->id == 123);
    + TEST_ASSERT_VAL("wrong id", ev->type == PERF_ATTR_UPDATE__NAME);
    + TEST_ASSERT_VAL("wrong name", !strcmp(ev->data, tmp->name));
    + return 0;
    +}
    +
    int test__attr_update(void)
    {
    struct perf_evlist *evlist;
    struct perf_evsel *evsel;
    + struct event_name tmp;

    evlist = perf_evlist__new_default();
    TEST_ASSERT_VAL("failed to get evlist", evlist);
    @@ -59,5 +79,10 @@ int test__attr_update(void)
    TEST_ASSERT_VAL("failed to synthesize attr update scale",
    !perf_event__synthesize_attr_update_scale(NULL, evsel, process_event_scale));

    + tmp.name = perf_evsel__name(evsel);
    +
    + TEST_ASSERT_VAL("failed to synthesize attr update name",
    + !perf_event__synthesize_attr_update_name(&tmp.tool, evsel, process_event_name));
    +
    return 0;
    }
    diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
    index c3c5085a2855..066429535349 100644
    --- a/tools/perf/util/event.h
    +++ b/tools/perf/util/event.h
    @@ -312,6 +312,7 @@ struct attr_event {
    enum {
    PERF_ATTR_UPDATE__UNIT = 0,
    PERF_ATTR_UPDATE__SCALE = 1,
    + PERF_ATTR_UPDATE__NAME = 2,
    };

    struct attr_update_event_scale {
    diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
    index b7a9237ff0b9..1516e7146b84 100644
    --- a/tools/perf/util/header.c
    +++ b/tools/perf/util/header.c
    @@ -2743,6 +2743,24 @@ perf_event__synthesize_attr_update_scale(struct perf_tool *tool,
    return err;
    }

    +int
    +perf_event__synthesize_attr_update_name(struct perf_tool *tool,
    + struct perf_evsel *evsel,
    + perf_event__handler_t process)
    +{
    + struct attr_update_event *ev;
    + size_t len = strlen(evsel->name);
    + int err;
    +
    + ev = attr_update_event__alloc(len + 1, PERF_ATTR_UPDATE__NAME, evsel->id[0]);
    + if (ev == NULL)
    + return -ENOMEM;
    +
    + strncpy(ev->data, evsel->name, len);
    + err = process(tool, (union perf_event*) ev, NULL, NULL);
    + free(ev);
    + return err;
    +}

    int perf_event__synthesize_attrs(struct perf_tool *tool,
    struct perf_session *session,
    @@ -2825,6 +2843,9 @@ int perf_event__process_attr_update(struct perf_tool *tool __maybe_unused,
    case PERF_ATTR_UPDATE__UNIT:
    evsel->unit = strdup(ev->data);
    break;
    + case PERF_ATTR_UPDATE__NAME:
    + evsel->name = strdup(ev->data);
    + break;
    case PERF_ATTR_UPDATE__SCALE:
    ev_scale = (struct attr_update_event_scale *) ev->data;
    evsel->scale = ev_scale->scale;
    diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h
    index 628ee46e14fd..cb538ade38d3 100644
    --- a/tools/perf/util/header.h
    +++ b/tools/perf/util/header.h
    @@ -111,6 +111,9 @@ int perf_event__synthesize_attr_update_unit(struct perf_tool *tool,
    int perf_event__synthesize_attr_update_scale(struct perf_tool *tool,
    struct perf_evsel *evsel,
    perf_event__handler_t process);
    +int perf_event__synthesize_attr_update_name(struct perf_tool *tool,
    + struct perf_evsel *evsel,
    + perf_event__handler_t process);
    int perf_event__process_attr(struct perf_tool *tool, union perf_event *event,
    struct perf_evlist **pevlist);
    int perf_event__process_attr_update(struct perf_tool *tool __maybe_unused,
    --
    2.4.3


    \
     
     \ /
      Last update: 2015-10-16 13:01    [W:4.193 / U:0.288 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site