perf stat: Don't show counter information when workload fails
When starting a workload 'stat' wasn't using prepare_workload evlist method's signal based exec() error reporting mechanism. Use it so that the we don't report 'not counted' counters. Before: [acme@zoo linux]$ perf stat dfadsfa dfadsfa: No such file or directory Performance counter stats for 'dfadsfa': <not counted> task-clock <not counted> context-switches <not counted> cpu-migrations <not counted> page-faults <not counted> cycles <not counted> stalled-cycles-frontend <not supported> stalled-cycles-backend <not counted> instructions <not counted> branches <not counted> branch-misses 0.001831462 seconds time elapsed [acme@zoo linux]$ After: [acme@zoo linux]$ perf stat dfadsfa dfadsfa: No such file or directory [acme@zoo linux]$ Reported-by: David Ahern <dsahern@gmail.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/n/tip-5yui3bv7e3hitxucnjsn6z8q@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
1341f3e4c0
commit
6af206fd91
|
@ -509,6 +509,18 @@ static void handle_initial_delay(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static volatile bool workload_exec_failed;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* perf_evlist__prepare_workload will send a SIGUSR1
|
||||||
|
* if the fork fails, since we asked by setting its
|
||||||
|
* want_signal to true.
|
||||||
|
*/
|
||||||
|
static void workload_exec_failed_signal(int signo __maybe_unused)
|
||||||
|
{
|
||||||
|
workload_exec_failed = true;
|
||||||
|
}
|
||||||
|
|
||||||
static int __run_perf_stat(int argc, const char **argv)
|
static int __run_perf_stat(int argc, const char **argv)
|
||||||
{
|
{
|
||||||
char msg[512];
|
char msg[512];
|
||||||
|
@ -529,7 +541,7 @@ static int __run_perf_stat(int argc, const char **argv)
|
||||||
|
|
||||||
if (forks) {
|
if (forks) {
|
||||||
if (perf_evlist__prepare_workload(evsel_list, &target, argv,
|
if (perf_evlist__prepare_workload(evsel_list, &target, argv,
|
||||||
false, false) < 0) {
|
false, true) < 0) {
|
||||||
perror("failed to prepare workload");
|
perror("failed to prepare workload");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -584,6 +596,14 @@ static int __run_perf_stat(int argc, const char **argv)
|
||||||
clock_gettime(CLOCK_MONOTONIC, &ref_time);
|
clock_gettime(CLOCK_MONOTONIC, &ref_time);
|
||||||
|
|
||||||
if (forks) {
|
if (forks) {
|
||||||
|
/*
|
||||||
|
* perf_evlist__prepare_workload will, after we call
|
||||||
|
* perf_evlist__start_Workload, send a SIGUSR1 if the exec call
|
||||||
|
* fails, that we will catch in workload_signal to flip
|
||||||
|
* workload_exec_failed.
|
||||||
|
*/
|
||||||
|
signal(SIGUSR1, workload_exec_failed_signal);
|
||||||
|
|
||||||
perf_evlist__start_workload(evsel_list);
|
perf_evlist__start_workload(evsel_list);
|
||||||
handle_initial_delay();
|
handle_initial_delay();
|
||||||
|
|
||||||
|
@ -594,6 +614,10 @@ static int __run_perf_stat(int argc, const char **argv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
wait(&status);
|
wait(&status);
|
||||||
|
|
||||||
|
if (workload_exec_failed)
|
||||||
|
return -1;
|
||||||
|
|
||||||
if (WIFSIGNALED(status))
|
if (WIFSIGNALED(status))
|
||||||
psignal(WTERMSIG(status), argv[0]);
|
psignal(WTERMSIG(status), argv[0]);
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue