Commit ffe77725 authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo

perf tools: Add event_update user level event

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: default avatarJiri Olsa <jolsa@kernel.org>
Tested-by: default avatarKan 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.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent e08a4564
...@@ -44,6 +44,7 @@ static const char *perf_event__names[] = { ...@@ -44,6 +44,7 @@ static const char *perf_event__names[] = {
[PERF_RECORD_STAT_CONFIG] = "STAT_CONFIG", [PERF_RECORD_STAT_CONFIG] = "STAT_CONFIG",
[PERF_RECORD_STAT] = "STAT", [PERF_RECORD_STAT] = "STAT",
[PERF_RECORD_STAT_ROUND] = "STAT_ROUND", [PERF_RECORD_STAT_ROUND] = "STAT_ROUND",
[PERF_RECORD_EVENT_UPDATE] = "EVENT_UPDATE",
}; };
const char *perf_event__name(unsigned int id) const char *perf_event__name(unsigned int id)
......
...@@ -231,6 +231,7 @@ enum perf_user_event_type { /* above any possible kernel type */ ...@@ -231,6 +231,7 @@ enum perf_user_event_type { /* above any possible kernel type */
PERF_RECORD_STAT_CONFIG = 75, PERF_RECORD_STAT_CONFIG = 75,
PERF_RECORD_STAT = 76, PERF_RECORD_STAT = 76,
PERF_RECORD_STAT_ROUND = 77, PERF_RECORD_STAT_ROUND = 77,
PERF_RECORD_EVENT_UPDATE = 78,
PERF_RECORD_HEADER_MAX PERF_RECORD_HEADER_MAX
}; };
...@@ -307,6 +308,14 @@ struct attr_event { ...@@ -307,6 +308,14 @@ struct attr_event {
u64 id[]; u64 id[];
}; };
struct event_update_event {
struct perf_event_header header;
u64 type;
u64 id;
char data[];
};
#define MAX_EVENT_NAME 64 #define MAX_EVENT_NAME 64
struct perf_trace_event_type { struct perf_trace_event_type {
...@@ -456,6 +465,7 @@ union perf_event { ...@@ -456,6 +465,7 @@ union perf_event {
struct throttle_event throttle; struct throttle_event throttle;
struct sample_event sample; struct sample_event sample;
struct attr_event attr; struct attr_event attr;
struct event_update_event event_update;
struct event_type_event event_type; struct event_type_event event_type;
struct tracing_data_event tracing_data; struct tracing_data_event tracing_data;
struct build_id_event build_id; struct build_id_event build_id;
......
...@@ -2745,6 +2745,26 @@ int perf_event__process_attr(struct perf_tool *tool __maybe_unused, ...@@ -2745,6 +2745,26 @@ int perf_event__process_attr(struct perf_tool *tool __maybe_unused,
return 0; 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, int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd,
struct perf_evlist *evlist, struct perf_evlist *evlist,
perf_event__handler_t process) perf_event__handler_t process)
......
...@@ -107,6 +107,9 @@ int perf_event__synthesize_attrs(struct perf_tool *tool, ...@@ -107,6 +107,9 @@ int perf_event__synthesize_attrs(struct perf_tool *tool,
perf_event__handler_t process); perf_event__handler_t process);
int perf_event__process_attr(struct perf_tool *tool, union perf_event *event, int perf_event__process_attr(struct perf_tool *tool, union perf_event *event,
struct perf_evlist **pevlist); 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 perf_event__synthesize_tracing_data(struct perf_tool *tool,
int fd, struct perf_evlist *evlist, int fd, struct perf_evlist *evlist,
......
...@@ -205,6 +205,15 @@ static int process_event_synth_attr_stub(struct perf_tool *tool __maybe_unused, ...@@ -205,6 +205,15 @@ static int process_event_synth_attr_stub(struct perf_tool *tool __maybe_unused,
return 0; 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, static int process_event_sample_stub(struct perf_tool *tool __maybe_unused,
union perf_event *event __maybe_unused, union perf_event *event __maybe_unused,
struct perf_sample *sample __maybe_unused, struct perf_sample *sample __maybe_unused,
...@@ -374,6 +383,8 @@ void perf_tool__fill_defaults(struct perf_tool *tool) ...@@ -374,6 +383,8 @@ void perf_tool__fill_defaults(struct perf_tool *tool)
tool->unthrottle = process_event_stub; tool->unthrottle = process_event_stub;
if (tool->attr == NULL) if (tool->attr == NULL)
tool->attr = process_event_synth_attr_stub; 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) if (tool->tracing_data == NULL)
tool->tracing_data = process_event_synth_tracing_data_stub; tool->tracing_data = process_event_synth_tracing_data_stub;
if (tool->build_id == NULL) if (tool->build_id == NULL)
...@@ -625,6 +636,13 @@ static void perf_event__hdr_attr_swap(union perf_event *event, ...@@ -625,6 +636,13 @@ static void perf_event__hdr_attr_swap(union perf_event *event,
mem_bswap_64(event->attr.id, size); 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, static void perf_event__event_type_swap(union perf_event *event,
bool sample_id_all __maybe_unused) bool sample_id_all __maybe_unused)
{ {
...@@ -779,6 +797,7 @@ static perf_event__swap_op perf_event__swap_ops[] = { ...@@ -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_CONFIG] = perf_event__stat_config_swap,
[PERF_RECORD_STAT] = perf_event__stat_swap, [PERF_RECORD_STAT] = perf_event__stat_swap,
[PERF_RECORD_STAT_ROUND] = perf_event__stat_round_swap, [PERF_RECORD_STAT_ROUND] = perf_event__stat_round_swap,
[PERF_RECORD_EVENT_UPDATE] = perf_event__event_update_swap,
[PERF_RECORD_HEADER_MAX] = NULL, [PERF_RECORD_HEADER_MAX] = NULL,
}; };
...@@ -1290,6 +1309,8 @@ static s64 perf_session__process_user_event(struct perf_session *session, ...@@ -1290,6 +1309,8 @@ static s64 perf_session__process_user_event(struct perf_session *session,
perf_session__set_comm_exec(session); perf_session__set_comm_exec(session);
} }
return err; return err;
case PERF_RECORD_EVENT_UPDATE:
return tool->event_update(tool, event, &session->evlist);
case PERF_RECORD_HEADER_EVENT_TYPE: case PERF_RECORD_HEADER_EVENT_TYPE:
/* /*
* Depreceated, but we need to handle it for sake * Depreceated, but we need to handle it for sake
......
...@@ -50,6 +50,7 @@ struct perf_tool { ...@@ -50,6 +50,7 @@ struct perf_tool {
throttle, throttle,
unthrottle; unthrottle;
event_attr_op attr; event_attr_op attr;
event_attr_op event_update;
event_op2 tracing_data; event_op2 tracing_data;
event_oe finished_round; event_oe finished_round;
event_op2 build_id, event_op2 build_id,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment