All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] perf stat: avoid sending SIGTERM to random processes
@ 2013-06-04 15:44 Stephane Eranian
  2013-06-19  6:46 ` Stephane Eranian
  2013-07-12  8:50 ` [tip:perf/urgent] perf stat: Avoid " tip-bot for Stephane Eranian
  0 siblings, 2 replies; 3+ messages in thread
From: Stephane Eranian @ 2013-06-04 15:44 UTC (permalink / raw)
  To: linux-kernel; +Cc: peterz, mingo, acme, jolsa, namhyung


This patch fixes a problem with perf stat whereby on termination
it may send a SIGTERM signal to random processes on systems
with high PID recycling. I got some actual bug reports on this.

There is race between the SIGCHLD and sig_atexit() handlers.
This patch addresses this problem by clearing child_pid in the
SIGCHLD handler.

Signed-off-by: Stephane Eranian <eranian@google.com>
---

diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 7e910ba..95768af 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -87,7 +87,7 @@ static int			run_count			=  1;
 static bool			no_inherit			= false;
 static bool			scale				=  true;
 static enum aggr_mode		aggr_mode			= AGGR_GLOBAL;
-static pid_t			child_pid			= -1;
+static volatile pid_t		child_pid			= -1;
 static bool			null_run			=  false;
 static int			detailed_run			=  0;
 static bool			big_num				=  true;
@@ -1148,13 +1148,34 @@ static void skip_signal(int signo)
 		done = 1;
 
 	signr = signo;
+	/*
+	 * render child_pid harmless
+	 * won't send SIGTERM to a random
+	 * process in case of race condition
+	 * and fast PID recycling
+	 */
+	child_pid = -1;
 }
 
 static void sig_atexit(void)
 {
+	sigset_t set, oset;
+
+	/*
+	 * avoid race condition with SIGCHLD handler
+	 * in skip_signal() which is modifying child_pid
+	 * goal is to avoid send SIGTERM to a random
+	 * process
+	 */
+	sigemptyset(&set);
+	sigaddset(&set, SIGCHLD);
+	sigprocmask(SIG_BLOCK, &set, &oset);
+
 	if (child_pid != -1)
 		kill(child_pid, SIGTERM);
 
+	sigprocmask(SIG_SETMASK, &oset, NULL);
+
 	if (signr == -1)
 		return;
 

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] perf stat: avoid sending SIGTERM to random processes
  2013-06-04 15:44 [PATCH] perf stat: avoid sending SIGTERM to random processes Stephane Eranian
@ 2013-06-19  6:46 ` Stephane Eranian
  2013-07-12  8:50 ` [tip:perf/urgent] perf stat: Avoid " tip-bot for Stephane Eranian
  1 sibling, 0 replies; 3+ messages in thread
From: Stephane Eranian @ 2013-06-19  6:46 UTC (permalink / raw)
  To: LKML
  Cc: Peter Zijlstra, mingo@elte.hu, Arnaldo Carvalho de Melo,
	Jiri Olsa, Namhyung Kim

Any comment on this patch Arnaldo?


On Tue, Jun 4, 2013 at 5:44 PM, Stephane Eranian <eranian@google.com> wrote:
>
> This patch fixes a problem with perf stat whereby on termination
> it may send a SIGTERM signal to random processes on systems
> with high PID recycling. I got some actual bug reports on this.
>
> There is race between the SIGCHLD and sig_atexit() handlers.
> This patch addresses this problem by clearing child_pid in the
> SIGCHLD handler.
>
> Signed-off-by: Stephane Eranian <eranian@google.com>
> ---
>
> diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
> index 7e910ba..95768af 100644
> --- a/tools/perf/builtin-stat.c
> +++ b/tools/perf/builtin-stat.c
> @@ -87,7 +87,7 @@ static int                    run_count                       =  1;
>  static bool                    no_inherit                      = false;
>  static bool                    scale                           =  true;
>  static enum aggr_mode          aggr_mode                       = AGGR_GLOBAL;
> -static pid_t                   child_pid                       = -1;
> +static volatile pid_t          child_pid                       = -1;
>  static bool                    null_run                        =  false;
>  static int                     detailed_run                    =  0;
>  static bool                    big_num                         =  true;
> @@ -1148,13 +1148,34 @@ static void skip_signal(int signo)
>                 done = 1;
>
>         signr = signo;
> +       /*
> +        * render child_pid harmless
> +        * won't send SIGTERM to a random
> +        * process in case of race condition
> +        * and fast PID recycling
> +        */
> +       child_pid = -1;
>  }
>
>  static void sig_atexit(void)
>  {
> +       sigset_t set, oset;
> +
> +       /*
> +        * avoid race condition with SIGCHLD handler
> +        * in skip_signal() which is modifying child_pid
> +        * goal is to avoid send SIGTERM to a random
> +        * process
> +        */
> +       sigemptyset(&set);
> +       sigaddset(&set, SIGCHLD);
> +       sigprocmask(SIG_BLOCK, &set, &oset);
> +
>         if (child_pid != -1)
>                 kill(child_pid, SIGTERM);
>
> +       sigprocmask(SIG_SETMASK, &oset, NULL);
> +
>         if (signr == -1)
>                 return;
>

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [tip:perf/urgent] perf stat: Avoid sending SIGTERM to random processes
  2013-06-04 15:44 [PATCH] perf stat: avoid sending SIGTERM to random processes Stephane Eranian
  2013-06-19  6:46 ` Stephane Eranian
@ 2013-07-12  8:50 ` tip-bot for Stephane Eranian
  1 sibling, 0 replies; 3+ messages in thread
From: tip-bot for Stephane Eranian @ 2013-07-12  8:50 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: acme, linux-kernel, eranian, hpa, mingo, peterz, namhyung, jolsa,
	tglx, mingo

Commit-ID:  d07f0b120642f442d81a61f68a9325fb7717004f
Gitweb:     http://git.kernel.org/tip/d07f0b120642f442d81a61f68a9325fb7717004f
Author:     Stephane Eranian <eranian@google.com>
AuthorDate: Tue, 4 Jun 2013 17:44:26 +0200
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Mon, 8 Jul 2013 17:36:33 -0300

perf stat: Avoid sending SIGTERM to random processes

This patch fixes a problem with perf stat whereby on termination it may
send a SIGTERM signal to random processes on systems with high PID
recycling. I got some actual bug reports on this.

There is race between the SIGCHLD and sig_atexit() handlers.  This patch
addresses this problem by clearing child_pid in the SIGCHLD handler.

Signed-off-by: Stephane Eranian <eranian@google.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20130604154426.GA2928@quad
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/builtin-stat.c | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 7e910ba..95768af 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -87,7 +87,7 @@ static int			run_count			=  1;
 static bool			no_inherit			= false;
 static bool			scale				=  true;
 static enum aggr_mode		aggr_mode			= AGGR_GLOBAL;
-static pid_t			child_pid			= -1;
+static volatile pid_t		child_pid			= -1;
 static bool			null_run			=  false;
 static int			detailed_run			=  0;
 static bool			big_num				=  true;
@@ -1148,13 +1148,34 @@ static void skip_signal(int signo)
 		done = 1;
 
 	signr = signo;
+	/*
+	 * render child_pid harmless
+	 * won't send SIGTERM to a random
+	 * process in case of race condition
+	 * and fast PID recycling
+	 */
+	child_pid = -1;
 }
 
 static void sig_atexit(void)
 {
+	sigset_t set, oset;
+
+	/*
+	 * avoid race condition with SIGCHLD handler
+	 * in skip_signal() which is modifying child_pid
+	 * goal is to avoid send SIGTERM to a random
+	 * process
+	 */
+	sigemptyset(&set);
+	sigaddset(&set, SIGCHLD);
+	sigprocmask(SIG_BLOCK, &set, &oset);
+
 	if (child_pid != -1)
 		kill(child_pid, SIGTERM);
 
+	sigprocmask(SIG_SETMASK, &oset, NULL);
+
 	if (signr == -1)
 		return;
 

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2013-07-12  8:51 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-06-04 15:44 [PATCH] perf stat: avoid sending SIGTERM to random processes Stephane Eranian
2013-06-19  6:46 ` Stephane Eranian
2013-07-12  8:50 ` [tip:perf/urgent] perf stat: Avoid " tip-bot for Stephane Eranian

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.