Re: [PATCH 19/57] perf tools: Add attr_update event

From: Arnaldo Carvalho de Melo
Date: Mon Oct 19 2015 - 17:00:20 EST


Em Fri, Oct 16, 2015 at 12:40:54PM +0200, Jiri Olsa escreveu:
> It'll server as base event for additional event attributes
> details, that are not part of the attr event.
>
> At the moment this event is just dummy one without specific
> functionality. The type value will distinguish the update
> event details. It comes in following patches.
>
> The idea for this event is to be extensible for any update
> that attr event might need in the future.

"Update"? Found it confusing, how about calling it "add event
attribute", because that is what this is doing, adding attributes, like
"unit" (Joules, MiB, nsec, etc), "scale", etc.

- Arnaldo

> Link: http://lkml.kernel.org/n/tip-uik5iyftzgk488ttrgpjvtf6@xxxxxxxxxxxxxx
> Signed-off-by: Jiri Olsa <jolsa@xxxxxxxxxx>
> ---
> tools/perf/util/event.c | 1 +
> tools/perf/util/event.h | 10 ++++++++++
> tools/perf/util/header.c | 20 ++++++++++++++++++++
> tools/perf/util/header.h | 3 +++
> tools/perf/util/session.c | 21 +++++++++++++++++++++
> tools/perf/util/tool.h | 1 +
> 6 files changed, 56 insertions(+)
>
> diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
> index 75d30b745ef2..1c796393ad7c 100644
> --- a/tools/perf/util/event.c
> +++ b/tools/perf/util/event.c
> @@ -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_HEADER_ATTR_UPDATE] = "ATTR_UPDATE",
> };
>
> const char *perf_event__name(unsigned int id)
> diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
> index e8daec32e1f9..1d46e12acd75 100644
> --- a/tools/perf/util/event.h
> +++ b/tools/perf/util/event.h
> @@ -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_HEADER_ATTR_UPDATE = 78,
> PERF_RECORD_HEADER_MAX
> };
>
> @@ -307,6 +308,14 @@ struct attr_event {
> u64 id[];
> };
>
> +struct attr_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 attr_update_event attr_update;
> struct event_type_event event_type;
> struct tracing_data_event tracing_data;
> struct build_id_event build_id;
> diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
> index 43838003c1a1..437856eec7c4 100644
> --- a/tools/perf/util/header.c
> +++ b/tools/perf/util/header.c
> @@ -2745,6 +2745,26 @@ int perf_event__process_attr(struct perf_tool *tool __maybe_unused,
> return 0;
> }
>
> +int perf_event__process_attr_update(struct perf_tool *tool __maybe_unused,
> + union perf_event *event,
> + struct perf_evlist **pevlist)
> +{
> + struct attr_update_event *ev = &event->attr_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)
> diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h
> index 05f27cb6b7e3..069298367348 100644
> --- a/tools/perf/util/header.h
> +++ b/tools/perf/util/header.h
> @@ -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_attr_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,
> diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
> index d14953bbfcbb..9b245dd61da1 100644
> --- a/tools/perf/util/session.c
> +++ b/tools/perf/util/session.c
> @@ -205,6 +205,15 @@ static int process_event_synth_attr_stub(struct perf_tool *tool __maybe_unused,
> return 0;
> }
>
> +static int process_event_synth_attr_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->attr_update == NULL)
> + tool->attr_update = process_event_synth_attr_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__hdr_attr_update_swap(union perf_event *event,
> + bool sample_id_all __maybe_unused)
> +{
> + event->attr_update.type = bswap_64(event->attr_update.type);
> + event->attr_update.id = bswap_64(event->attr_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_HEADER_ATTR_UPDATE] = perf_event__hdr_attr_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_HEADER_ATTR_UPDATE:
> + return tool->attr_update(tool, event, &session->evlist);
> case PERF_RECORD_HEADER_EVENT_TYPE:
> /*
> * Depreceated, but we need to handle it for sake
> diff --git a/tools/perf/util/tool.h b/tools/perf/util/tool.h
> index d04d9e5f444a..59702b5d703f 100644
> --- a/tools/perf/util/tool.h
> +++ b/tools/perf/util/tool.h
> @@ -50,6 +50,7 @@ struct perf_tool {
> throttle,
> unthrottle;
> event_attr_op attr;
> + event_attr_op attr_update;
> event_op2 tracing_data;
> event_oe finished_round;
> event_op2 build_id,
> --
> 2.4.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/