perf record: Fix eternal wait for stillborn child
When execvp fails to find the specified command on the path we won't get SIGCHLD, so send a SIGUSR1 and exit right away. Current situation would require a SIGINT performed by the user and would produce meaningless summary. Now: [acme@emilia linux]$ ./foo -bash: ./foo: No such file or directory [acme@emilia linux]$ perf record ./foo ./foo: No such file or directory [acme@emilia linux]$ Acked-by: Thomas Gleixner <tglx@linutronix.de> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Cc: Tom Zanussi <tzanussi@gmail.com> Cc: Thomas Gleixner <tglx@linutronix.de> LKML-Reference: <new-submission> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
60e677373b
commit
18483b81ee
1 changed files with 4 additions and 2 deletions
|
@ -197,7 +197,7 @@ static void sig_atexit(void)
|
||||||
if (child_pid > 0)
|
if (child_pid > 0)
|
||||||
kill(child_pid, SIGTERM);
|
kill(child_pid, SIGTERM);
|
||||||
|
|
||||||
if (signr == -1)
|
if (signr == -1 || signr == SIGUSR1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
signal(signr, SIG_DFL);
|
signal(signr, SIG_DFL);
|
||||||
|
@ -515,6 +515,7 @@ static int __cmd_record(int argc, const char **argv)
|
||||||
atexit(sig_atexit);
|
atexit(sig_atexit);
|
||||||
signal(SIGCHLD, sig_handler);
|
signal(SIGCHLD, sig_handler);
|
||||||
signal(SIGINT, sig_handler);
|
signal(SIGINT, sig_handler);
|
||||||
|
signal(SIGUSR1, sig_handler);
|
||||||
|
|
||||||
if (forks && (pipe(child_ready_pipe) < 0 || pipe(go_pipe) < 0)) {
|
if (forks && (pipe(child_ready_pipe) < 0 || pipe(go_pipe) < 0)) {
|
||||||
perror("failed to create pipes");
|
perror("failed to create pipes");
|
||||||
|
@ -606,6 +607,7 @@ static int __cmd_record(int argc, const char **argv)
|
||||||
execvp(argv[0], (char **)argv);
|
execvp(argv[0], (char **)argv);
|
||||||
|
|
||||||
perror(argv[0]);
|
perror(argv[0]);
|
||||||
|
kill(getppid(), SIGUSR1);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -762,7 +764,7 @@ static int __cmd_record(int argc, const char **argv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (quiet)
|
if (quiet || signr == SIGUSR1)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fprintf(stderr, "[ perf record: Woken up %ld times to write data ]\n", waking);
|
fprintf(stderr, "[ perf record: Woken up %ld times to write data ]\n", waking);
|
||||||
|
|
Loading…
Reference in a new issue