Synthesizing needed stat record data for report/script:
  - cpu/thread maps
  - stat config

Link: http://lkml.kernel.org/n/tip-wni1s2i2sq17g4vomjyda...@git.kernel.org
Signed-off-by: Jiri Olsa <jo...@kernel.org>
---
 tools/perf/builtin-stat.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 95030e686bc4..50d7c8ba0e00 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -190,6 +190,20 @@ static inline int nsec_counter(struct perf_evsel *evsel)
        return 0;
 }
 
+static int process_synthesized_event(struct perf_tool *tool __maybe_unused,
+                                    union perf_event *event,
+                                    struct perf_sample *sample __maybe_unused,
+                                    struct machine *machine __maybe_unused)
+{
+       if (perf_data_file__write(&stat_record.file, event, event->header.size) 
< 0) {
+               pr_err("failed to write perf data, error: %m\n");
+               return -1;
+       }
+
+       stat_record.bytes_written += event->header.size;
+       return 0;
+}
+
 /*
  * Read out the results of a single counter:
  * do not aggregate counts across CPUs in system-wide mode
@@ -276,6 +290,36 @@ static void workload_exec_failed_signal(int signo 
__maybe_unused, siginfo_t *inf
        workload_exec_errno = info->si_value.sival_int;
 }
 
+static int perf_stat_synthesize_config(void)
+{
+       int err;
+
+       err = perf_event__synthesize_stat_config(NULL, &stat_config,
+                                                process_synthesized_event, 
NULL);
+       if (err < 0) {
+               pr_err("Couldn't synthesize config.\n");
+               return err;
+       }
+
+       err = perf_event__synthesize_thread_map2(NULL, evsel_list->threads,
+                                               process_synthesized_event,
+                                               NULL);
+       if (err < 0) {
+               pr_err("Couldn't synthesize thread map.\n");
+               return err;
+       }
+
+       err = perf_event__synthesize_cpu_map(NULL, evsel_list->cpus,
+                                            process_synthesized_event,
+                                            NULL);
+       if (err < 0) {
+               pr_err("Couldn't synthesize thread map.\n");
+               return err;
+       }
+
+       return 0;
+}
+
 static int __run_perf_stat(int argc, const char **argv)
 {
        int interval = stat_config.interval;
@@ -356,6 +400,10 @@ static int __run_perf_stat(int argc, const char **argv)
                                                 fd, false);
                if (err < 0)
                        return err;
+
+               err = perf_stat_synthesize_config();
+               if (err < 0)
+                       return err;
        }
 
        /*
-- 
2.4.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to