perf tools: Add event_update user level event
authorJiri Olsa <jolsa@kernel.org>
Sun, 25 Oct 2015 14:51:36 +0000 (15:51 +0100)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 17 Dec 2015 18:10:16 +0000 (15:10 -0300)
It'll serve as a base event for additional event attributes details,
that are not part of the attr event.

At the moment this event is just a dummy one without any specific
functionality. The type value will distinguish the update event details.
It'll come in the following patches.

The idea for this event is to be extensible for any update that the
event might need in the future.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Tested-by: Kan Liang <kan.liang@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1445784728-21732-21-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/event.c
tools/perf/util/event.h
tools/perf/util/header.c
tools/perf/util/header.h
tools/perf/util/session.c
tools/perf/util/tool.h

index e4c68ba799741b5e5ca57f98522b91ee6a1999ec..cd61bb1f3917f1c2a03f7274250a0f7e26531edc 100644 (file)
@@ -44,6 +44,7 @@ static const char *perf_event__names[] = {
        [PERF_RECORD_STAT_CONFIG]               = "STAT_CONFIG",
        [PERF_RECORD_STAT]                      = "STAT",
        [PERF_RECORD_STAT_ROUND]                = "STAT_ROUND",
+       [PERF_RECORD_EVENT_UPDATE]              = "EVENT_UPDATE",
 };
 
 const char *perf_event__name(unsigned int id)
index 1afaa21eeebec6770306292eb3bd3a9827b13247..6966a4b7c0f06c79532c113358501ad2c881dbb5 100644 (file)
@@ -231,6 +231,7 @@ enum perf_user_event_type { /* above any possible kernel type */
        PERF_RECORD_STAT_CONFIG                 = 75,
        PERF_RECORD_STAT                        = 76,
        PERF_RECORD_STAT_ROUND                  = 77,
+       PERF_RECORD_EVENT_UPDATE                = 78,
        PERF_RECORD_HEADER_MAX
 };
 
@@ -307,6 +308,14 @@ struct attr_event {
        u64 id[];
 };
 
+struct event_update_event {
+       struct perf_event_header header;
+       u64 type;
+       u64 id;
+
+       char data[];
+};
+
 #define MAX_EVENT_NAME 64
 
 struct perf_trace_event_type {
@@ -456,6 +465,7 @@ union perf_event {
        struct throttle_event           throttle;
        struct sample_event             sample;
        struct attr_event               attr;
+       struct event_update_event       event_update;
        struct event_type_event         event_type;
        struct tracing_data_event       tracing_data;
        struct build_id_event           build_id;
index 5ac7bdb0dff79b9d3af11f2f6d8a9539ea340619..6b4e00220a5a1e22800819bc82fe65f1f9bc8f0b 100644 (file)
@@ -2745,6 +2745,26 @@ int perf_event__process_attr(struct perf_tool *tool __maybe_unused,
        return 0;
 }
 
+int perf_event__process_event_update(struct perf_tool *tool __maybe_unused,
+                                    union perf_event *event,
+                                    struct perf_evlist **pevlist)
+{
+       struct event_update_event *ev = &event->event_update;
+       struct perf_evlist *evlist;
+       struct perf_evsel *evsel;
+
+       if (!pevlist || *pevlist == NULL)
+               return -EINVAL;
+
+       evlist = *pevlist;
+
+       evsel = perf_evlist__id2evsel(evlist, ev->id);
+       if (evsel == NULL)
+               return -EINVAL;
+
+       return 0;
+}
+
 int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd,
                                        struct perf_evlist *evlist,
                                        perf_event__handler_t process)
index 05f27cb6b7e36a2e663f7c18fb22513bc5280af2..1e843c67a4ffb6d351bd1969e273ea7542925b9c 100644 (file)
@@ -107,6 +107,9 @@ int perf_event__synthesize_attrs(struct perf_tool *tool,
                                 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_event_update(struct perf_tool *tool __maybe_unused,
+                                    union perf_event *event,
+                                    struct perf_evlist **pevlist);
 
 int perf_event__synthesize_tracing_data(struct perf_tool *tool,
                                        int fd, struct perf_evlist *evlist,
index 5b3a81a6b79535deac402a8c95ee5c8b56a34a9e..49e5cdc4cc5ad91474b2da3981d7289b507d9b38 100644 (file)
@@ -205,6 +205,15 @@ static int process_event_synth_attr_stub(struct perf_tool *tool __maybe_unused,
        return 0;
 }
 
+static int process_event_synth_event_update_stub(struct perf_tool *tool __maybe_unused,
+                                                union perf_event *event __maybe_unused,
+                                                struct perf_evlist **pevlist
+                                                __maybe_unused)
+{
+       dump_printf(": unhandled!\n");
+       return 0;
+}
+
 static int process_event_sample_stub(struct perf_tool *tool __maybe_unused,
                                     union perf_event *event __maybe_unused,
                                     struct perf_sample *sample __maybe_unused,
@@ -374,6 +383,8 @@ void perf_tool__fill_defaults(struct perf_tool *tool)
                tool->unthrottle = process_event_stub;
        if (tool->attr == NULL)
                tool->attr = process_event_synth_attr_stub;
+       if (tool->event_update == NULL)
+               tool->event_update = process_event_synth_event_update_stub;
        if (tool->tracing_data == NULL)
                tool->tracing_data = process_event_synth_tracing_data_stub;
        if (tool->build_id == NULL)
@@ -625,6 +636,13 @@ static void perf_event__hdr_attr_swap(union perf_event *event,
        mem_bswap_64(event->attr.id, size);
 }
 
+static void perf_event__event_update_swap(union perf_event *event,
+                                         bool sample_id_all __maybe_unused)
+{
+       event->event_update.type = bswap_64(event->event_update.type);
+       event->event_update.id   = bswap_64(event->event_update.id);
+}
+
 static void perf_event__event_type_swap(union perf_event *event,
                                        bool sample_id_all __maybe_unused)
 {
@@ -779,6 +797,7 @@ static perf_event__swap_op perf_event__swap_ops[] = {
        [PERF_RECORD_STAT_CONFIG]         = perf_event__stat_config_swap,
        [PERF_RECORD_STAT]                = perf_event__stat_swap,
        [PERF_RECORD_STAT_ROUND]          = perf_event__stat_round_swap,
+       [PERF_RECORD_EVENT_UPDATE]        = perf_event__event_update_swap,
        [PERF_RECORD_HEADER_MAX]          = NULL,
 };
 
@@ -1290,6 +1309,8 @@ static s64 perf_session__process_user_event(struct perf_session *session,
                        perf_session__set_comm_exec(session);
                }
                return err;
+       case PERF_RECORD_EVENT_UPDATE:
+               return tool->event_update(tool, event, &session->evlist);
        case PERF_RECORD_HEADER_EVENT_TYPE:
                /*
                 * Depreceated, but we need to handle it for sake
index d04d9e5f444a3ecabf6df934108a838e042f3782..55de4cffcd4e9ae2ee2063dc5efc05d0d72fc7db 100644 (file)
@@ -50,6 +50,7 @@ struct perf_tool {
                        throttle,
                        unthrottle;
        event_attr_op   attr;
+       event_attr_op   event_update;
        event_op2       tracing_data;
        event_oe        finished_round;
        event_op2       build_id,