mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-09 15:29:16 +00:00
perf trace: Fix race in signal handling
Since a lot of stuff happens before the SIGINT signal handler is registered (scanning /proc/*, etc.), on bigger systems, such as Cavium Sabre CN99xx, it may happen that first interrupt signal is lost and perf isn't correctly terminated. The reproduction code might look like the following: perf trace -a & PERF_PID=$! sleep 4 kill -INT $PERF_PID The issue has been found on a CN99xx machine with RHEL-8 and the patch fixes it by registering the signal handlers earlier in the init stage. Suggested-by: Jiri Olsa <jolsa@redhat.com> Signed-off-by: Michael Petlan <mpetlan@redhat.com> Tested-by: Michael Petlan <mpetlan@redhat.com> Cc: Jiri Olsa <jolsa@redhat.com> Link: https://lore.kernel.org/lkml/YEJnaMzH2ctp3PPx@kernel.org/ Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
77d02bd00c
commit
86a19008af
@ -3964,9 +3964,6 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
|
||||
|
||||
evlist__config(evlist, &trace->opts, &callchain_param);
|
||||
|
||||
signal(SIGCHLD, sig_handler);
|
||||
signal(SIGINT, sig_handler);
|
||||
|
||||
if (forks) {
|
||||
err = evlist__prepare_workload(evlist, &trace->opts.target, argv, false, NULL);
|
||||
if (err < 0) {
|
||||
@ -4827,6 +4824,8 @@ int cmd_trace(int argc, const char **argv)
|
||||
|
||||
signal(SIGSEGV, sighandler_dump_stack);
|
||||
signal(SIGFPE, sighandler_dump_stack);
|
||||
signal(SIGCHLD, sig_handler);
|
||||
signal(SIGINT, sig_handler);
|
||||
|
||||
trace.evlist = evlist__new();
|
||||
trace.sctbl = syscalltbl__new();
|
||||
|
Loading…
x
Reference in New Issue
Block a user