perf stat: Use perf_evlist__prepare/start_workload()
authorNamhyung Kim <namhyung.kim@lge.com>
Mon, 11 Mar 2013 07:43:18 +0000 (16:43 +0900)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 15 Mar 2013 16:06:04 +0000 (13:06 -0300)
The perf stat had an open code to the duplicated work.  Use the helper
as it now can be called without struct perf_record_opts.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1362987798-24969-7-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-stat.c

index 20ffaf98782e12ccfb78dd3abc0baa3e194970d4..69fe6ed89627a1dc6425101cc1f733e8277d4ab5 100644 (file)
@@ -337,16 +337,14 @@ static void print_interval(void)
        }
 }
 
-static int __run_perf_stat(int argc __maybe_unused, const char **argv)
+static int __run_perf_stat(int argc, const char **argv)
 {
        char msg[512];
        unsigned long long t0, t1;
        struct perf_evsel *counter;
        struct timespec ts;
        int status = 0;
-       int child_ready_pipe[2], go_pipe[2];
        const bool forks = (argc > 0);
-       char buf;
 
        if (interval) {
                ts.tv_sec  = interval / 1000;
@@ -362,55 +360,12 @@ static int __run_perf_stat(int argc __maybe_unused, const char **argv)
                return -1;
        }
 
-       if (forks && (pipe(child_ready_pipe) < 0 || pipe(go_pipe) < 0)) {
-               perror("failed to create pipes");
-               return -1;
-       }
-
        if (forks) {
-               if ((child_pid = fork()) < 0)
-                       perror("failed to fork");
-
-               if (!child_pid) {
-                       close(child_ready_pipe[0]);
-                       close(go_pipe[1]);
-                       fcntl(go_pipe[0], F_SETFD, FD_CLOEXEC);
-
-                       /*
-                        * Do a dummy execvp to get the PLT entry resolved,
-                        * so we avoid the resolver overhead on the real
-                        * execvp call.
-                        */
-                       execvp("", (char **)argv);
-
-                       /*
-                        * Tell the parent we're ready to go
-                        */
-                       close(child_ready_pipe[1]);
-
-                       /*
-                        * Wait until the parent tells us to go.
-                        */
-                       if (read(go_pipe[0], &buf, 1) == -1)
-                               perror("unable to read pipe");
-
-                       execvp(argv[0], (char **)argv);
-
-                       perror(argv[0]);
-                       exit(-1);
+               if (perf_evlist__prepare_workload(evsel_list, &target, argv,
+                                                 false, false) < 0) {
+                       perror("failed to prepare workload");
+                       return -1;
                }
-
-               if (perf_target__none(&target))
-                       evsel_list->threads->map[0] = child_pid;
-
-               /*
-                * Wait for the child to be ready to exec.
-                */
-               close(child_ready_pipe[1]);
-               close(go_pipe[0]);
-               if (read(child_ready_pipe[0], &buf, 1) == -1)
-                       perror("unable to read pipe");
-               close(child_ready_pipe[0]);
        }
 
        if (group)
@@ -457,7 +412,8 @@ static int __run_perf_stat(int argc __maybe_unused, const char **argv)
        clock_gettime(CLOCK_MONOTONIC, &ref_time);
 
        if (forks) {
-               close(go_pipe[1]);
+               perf_evlist__start_workload(evsel_list);
+
                if (interval) {
                        while (!waitpid(child_pid, &status, WNOHANG)) {
                                nanosleep(&ts, NULL);