perf tools: Add stat config event read function
authorJiri Olsa <jolsa@kernel.org>
Sun, 25 Oct 2015 14:51:29 +0000 (15:51 +0100)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 17 Dec 2015 17:38:19 +0000 (14:38 -0300)
Introducing the perf_event__read_stat_config function to read a struct
perf_stat_config object data from a stat config event.

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-14-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/tests/stat.c
tools/perf/util/event.c
tools/perf/util/event.h

index c7a2bdb..aa35d28 100644 (file)
@@ -24,6 +24,7 @@ static int process_event(struct perf_tool *tool __maybe_unused,
                         struct machine *machine __maybe_unused)
 {
        struct stat_config_event *config = &event->stat_config;
+       struct perf_stat_config stat_config;
 
 #define HAS(term, val) \
        has_term(config, PERF_STAT_CONFIG_TERM__##term, val)
@@ -35,6 +36,11 @@ static int process_event(struct perf_tool *tool __maybe_unused,
 
 #undef HAS
 
+       perf_event__read_stat_config(&stat_config, config);
+
+       TEST_ASSERT_VAL("wrong aggr_mode", stat_config.aggr_mode == AGGR_CORE);
+       TEST_ASSERT_VAL("wrong scale",     stat_config.scale == 1);
+       TEST_ASSERT_VAL("wrong interval",  stat_config.interval == 1);
        return 0;
 }
 
index 1ea693c..223deaf 100644 (file)
@@ -909,6 +909,30 @@ int perf_event__synthesize_stat_config(struct perf_tool *tool,
        return err;
 }
 
+void perf_event__read_stat_config(struct perf_stat_config *config,
+                                 struct stat_config_event *event)
+{
+       unsigned i;
+
+       for (i = 0; i < event->nr; i++) {
+
+               switch (event->data[i].tag) {
+#define CASE(__term, __val)                                    \
+               case PERF_STAT_CONFIG_TERM__##__term:           \
+                       config->__val = event->data[i].val;     \
+                       break;
+
+               CASE(AGGR_MODE, aggr_mode)
+               CASE(SCALE,     scale)
+               CASE(INTERVAL,  interval)
+#undef CASE
+               default:
+                       pr_warning("unknown stat config term %" PRIu64 "\n",
+                                  event->data[i].tag);
+               }
+       }
+}
+
 size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp)
 {
        const char *s;
index 39014c7..4e87be2 100644 (file)
@@ -477,6 +477,8 @@ int perf_event__synthesize_stat_config(struct perf_tool *tool,
                                       struct perf_stat_config *config,
                                       perf_event__handler_t process,
                                       struct machine *machine);
+void perf_event__read_stat_config(struct perf_stat_config *config,
+                                 struct stat_config_event *event);
 
 int perf_event__synthesize_modules(struct perf_tool *tool,
                                   perf_event__handler_t process,