Re: [PATCH 11/52] perf tools: Add stat config event
From: Arnaldo Carvalho de Melo
Date: Tue Oct 27 2015 - 09:16:16 EST
Em Sun, Oct 25, 2015 at 03:51:27PM +0100, Jiri Olsa escreveu:
> Adding stat config event to pass/store stat config data,
> so report tools (report/script) know how to interpret
> stat data.
>
> The config data are stored in 'tag|value' way to allow
> easy extension and backward compatibility.
I wonder if this couldn't be renamed 'PERF_RECORD_CONFIG' and just go
on using one of those 2^64-1 tags for the 'stat config' needs, but then
this is just a matter of changing the name of this event, which won't
break anything when done.
Other stuff we may want to have stored like this include sysctl, sysfs
values, kernel command line options used, etc.
- Arnaldo
> Link: http://lkml.kernel.org/n/tip-1npdsfez8635vogthpqwtkd0@xxxxxxxxxxxxxx
> Signed-off-by: Jiri Olsa <jolsa@xxxxxxxxxx>
> ---
> tools/perf/util/event.c | 1 +
> tools/perf/util/event.h | 20 ++++++++++++++++++++
> tools/perf/util/session.c | 24 ++++++++++++++++++++++++
> tools/perf/util/tool.h | 3 ++-
> 4 files changed, 47 insertions(+), 1 deletion(-)
>
> diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
> index 36dc992b072f..1165cb1d891f 100644
> --- a/tools/perf/util/event.c
> +++ b/tools/perf/util/event.c
> @@ -39,6 +39,7 @@ static const char *perf_event__names[] = {
> [PERF_RECORD_AUXTRACE_ERROR] = "AUXTRACE_ERROR",
> [PERF_RECORD_THREAD_MAP] = "THREAD_MAP",
> [PERF_RECORD_CPU_MAP] = "CPU_MAP",
> + [PERF_RECORD_STAT_CONFIG] = "STAT_CONFIG",
> };
>
> const char *perf_event__name(unsigned int id)
> diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
> index e46f95285350..0bc3393dd28c 100644
> --- a/tools/perf/util/event.h
> +++ b/tools/perf/util/event.h
> @@ -228,6 +228,7 @@ enum perf_user_event_type { /* above any possible kernel type */
> PERF_RECORD_AUXTRACE_ERROR = 72,
> PERF_RECORD_THREAD_MAP = 73,
> PERF_RECORD_CPU_MAP = 74,
> + PERF_RECORD_STAT_CONFIG = 75,
> PERF_RECORD_HEADER_MAX
> };
>
> @@ -395,6 +396,24 @@ struct thread_map_event {
> struct thread_map_data_event data[];
> };
>
> +enum {
> + PERF_STAT_CONFIG_TERM__AGGR_MODE = 0,
> + PERF_STAT_CONFIG_TERM__INTERVAL = 1,
> + PERF_STAT_CONFIG_TERM__SCALE = 2,
> + PERF_STAT_CONFIG_TERM__MAX = 3,
> +};
> +
> +struct stat_config_term_event {
> + u64 tag;
> + u64 val;
> +};
> +
> +struct stat_config_event {
> + struct perf_event_header header;
> + u64 nr;
> + struct stat_config_term_event data[];
> +};
> +
> union perf_event {
> struct perf_event_header header;
> struct mmap_event mmap;
> @@ -419,6 +438,7 @@ union perf_event {
> struct context_switch_event context_switch;
> struct thread_map_event thread_map;
> struct cpu_map_event cpu_map;
> + struct stat_config_event stat_config;
> };
>
> void perf_event__print_totals(void);
> diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
> index 5126b18c671c..a550464925ea 100644
> --- a/tools/perf/util/session.c
> +++ b/tools/perf/util/session.c
> @@ -315,6 +315,15 @@ int process_event_cpu_map_stub(struct perf_tool *tool __maybe_unused,
> return 0;
> }
>
> +static
> +int process_event_stat_config_stub(struct perf_tool *tool __maybe_unused,
> + union perf_event *event __maybe_unused,
> + struct perf_session *session __maybe_unused)
> +{
> + dump_printf(": unhandled!\n");
> + return 0;
> +}
> +
> void perf_tool__fill_defaults(struct perf_tool *tool)
> {
> if (tool->sample == NULL)
> @@ -369,6 +378,8 @@ void perf_tool__fill_defaults(struct perf_tool *tool)
> tool->thread_map = process_event_thread_map_stub;
> if (tool->cpu_map == NULL)
> tool->cpu_map = process_event_cpu_map_stub;
> + if (tool->stat_config == NULL)
> + tool->stat_config = process_event_stat_config_stub;
> }
>
> static void swap_sample_id_all(union perf_event *event, void *data)
> @@ -686,6 +697,16 @@ static void perf_event__cpu_map_swap(union perf_event *event,
> }
> }
>
> +static void perf_event__stat_config_swap(union perf_event *event,
> + bool sample_id_all __maybe_unused)
> +{
> + u64 size;
> +
> + size = event->stat_config.nr * sizeof(event->stat_config.data[0]);
> + size += 1; /* nr item itself */
> + mem_bswap_64(&event->stat_config.nr, size);
> +}
> +
> typedef void (*perf_event__swap_op)(union perf_event *event,
> bool sample_id_all);
>
> @@ -715,6 +736,7 @@ static perf_event__swap_op perf_event__swap_ops[] = {
> [PERF_RECORD_AUXTRACE_ERROR] = perf_event__auxtrace_error_swap,
> [PERF_RECORD_THREAD_MAP] = perf_event__thread_map_swap,
> [PERF_RECORD_CPU_MAP] = perf_event__cpu_map_swap,
> + [PERF_RECORD_STAT_CONFIG] = perf_event__stat_config_swap,
> [PERF_RECORD_HEADER_MAX] = NULL,
> };
>
> @@ -1255,6 +1277,8 @@ static s64 perf_session__process_user_event(struct perf_session *session,
> return tool->thread_map(tool, event, session);
> case PERF_RECORD_CPU_MAP:
> return tool->cpu_map(tool, event, session);
> + case PERF_RECORD_STAT_CONFIG:
> + return tool->stat_config(tool, event, session);
> default:
> return -EINVAL;
> }
> diff --git a/tools/perf/util/tool.h b/tools/perf/util/tool.h
> index 9e5925c78519..aa7ae73d76b4 100644
> --- a/tools/perf/util/tool.h
> +++ b/tools/perf/util/tool.h
> @@ -57,7 +57,8 @@ struct perf_tool {
> auxtrace_info,
> auxtrace_error,
> thread_map,
> - cpu_map;
> + cpu_map,
> + stat_config;
> event_op3 auxtrace;
> bool ordered_events;
> bool ordering_requires_timestamps;
> --
> 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/