Files
linux-stable-mirror/include/linux
Oleg Nesterov e442055193 signals: re-assign CLD_CONTINUED notification from the sender to reciever
Based on discussion with Jiri and Roland.

In short: currently handle_stop_signal(SIGCONT, p) sends the notification to
p->parent, with this patch p itself notifies its parent when it becomes
running.

handle_stop_signal(SIGCONT) has to drop ->siglock temporary in order to notify
the parent with do_notify_parent_cldstop().  This leads to multiple problems:

	- as Jiri Kosina pointed out, the stopped task can resume without
	  actually seeing SIGCONT which may have a handler.

	- we race with another sig_kernel_stop() signal which may come in
	  that window.

	- we race with sig_fatal() signals which may set SIGNAL_GROUP_EXIT
	  in that window.

	- we can't avoid taking tasklist_lock() while sending SIGCONT.

With this patch handle_stop_signal() just sets the new SIGNAL_CLD_CONTINUED
flag in p->signal->flags and returns.  The notification is sent by the first
task which returns from finish_stop() (there should be at least one) or any
other signalled thread from get_signal_to_deliver().

This is a user-visible change.  Say, currently kill(SIGCONT, stopped_child)
can't return without seeing SIGCHLD, with this patch SIGCHLD can be delayed
unpredictably.  Another difference is that if the child is ptraced by another
process, CLD_CONTINUED may be delivered to ->real_parent after ptrace_detach()
while currently it always goes to the tracer which doesn't actually need this
notification.  Hopefully not a problem.

The patch asks for the futher obvious cleanups, I'll send them separately.

Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
Cc: Roland McGrath <roland@redhat.com>
Cc: Jiri Kosina <jkosina@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-04-30 08:29:34 -07:00
..
2008-04-29 08:06:00 -07:00
2008-04-28 06:28:37 -04:00
2008-04-29 08:11:16 -07:00
2008-04-29 12:36:54 -07:00
2008-04-22 15:16:32 -05:00
2008-04-29 08:06:01 -07:00
2008-04-17 20:05:38 +02:00
2008-04-21 11:22:28 -05:00
2008-04-25 13:26:55 +01:00
2008-04-25 13:26:55 +01:00
2008-04-25 13:26:55 +01:00
2008-04-21 22:38:45 +00:00
2008-04-28 08:58:30 -07:00
2008-04-19 19:19:54 +02:00
2008-04-28 08:58:35 -07:00
2008-04-29 08:06:00 -07:00
2008-04-28 10:03:31 -07:00
2008-04-22 11:34:59 +02:00
2008-04-04 18:36:49 +02:00
2008-04-17 12:22:31 +02:00
2008-04-29 23:11:38 +02:00
2008-04-29 08:06:25 -07:00
2008-04-23 21:25:36 -04:00
2008-03-17 22:48:46 -07:00
2008-04-29 08:06:03 -07:00
2008-04-29 08:06:02 -07:00
2008-04-29 08:06:15 -07:00
2008-04-19 19:10:28 -07:00
2008-04-17 20:05:42 +02:00
2008-04-19 19:44:57 +02:00
2008-04-29 08:06:01 -07:00
2008-04-29 08:06:17 -07:00
2008-04-29 08:06:17 -07:00
2008-04-28 08:58:29 -07:00
2008-04-19 16:54:56 -04:00
2008-04-19 16:55:29 -04:00
2008-04-23 18:45:26 -07:00
2008-04-20 21:47:03 -07:00
2008-04-20 21:47:03 -07:00
2008-04-29 08:06:02 -07:00
2008-04-29 08:06:02 -07:00
2008-03-17 22:46:46 -07:00
2008-04-29 08:05:59 -07:00
2008-04-17 10:43:01 -04:00
2008-04-25 00:25:08 +02:00
2008-04-28 08:58:32 -07:00
2008-04-15 13:26:52 -04:00
2008-04-28 08:58:20 -07:00
2008-04-28 08:58:29 -07:00
2008-04-19 19:44:59 +02:00
2008-04-17 20:05:37 +02:00
2008-04-17 20:05:36 +02:00
2008-04-24 21:16:57 -07:00
2008-04-07 13:14:22 -07:00
2008-04-28 08:58:21 -07:00