Skip to content

Commit

Permalink
perf stat: Use perf_evlist__prepare/start_workload()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Namhyung Kim authored and Arnaldo Carvalho de Melo committed Mar 15, 2013
1 parent 55e162e commit acf2892
Showing 1 changed file with 7 additions and 51 deletions.
58 changes: 7 additions & 51 deletions tools/perf/builtin-stat.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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)
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit acf2892

Please sign in to comment.