Files
ack-tegra/include/linux
Oleg Nesterov ee77f07592 signal: Turn SIGNAL_STOP_DEQUEUED into GROUP_STOP_DEQUEUED
This patch moves SIGNAL_STOP_DEQUEUED from signal_struct->flags to
task_struct->group_stop, and thus makes it per-thread.

Like SIGNAL_STOP_DEQUEUED, GROUP_STOP_DEQUEUED can be false-positive
after return from get_signal_to_deliver(), this is fine. The only
purpose of this bit is: we can drop ->siglock after __dequeue_signal()
returns the sig_kernel_stop() signal and before we call
do_signal_stop(), in this case we must not miss SIGCONT if it comes in
between.

But, unlike SIGNAL_STOP_DEQUEUED, GROUP_STOP_DEQUEUED can not be
false-positive in do_signal_stop() if multiple threads dequeue the
sig_kernel_stop() signal at the same time.

Consider two threads T1 and T2, SIGTTIN has a hanlder.

	- T1 dequeues SIGTSTP and sets SIGNAL_STOP_DEQUEUED, then
	  it drops ->siglock

	- SIGCONT comes and clears SIGNAL_STOP_DEQUEUED, SIGTSTP
	  should be cancelled.

	- T2 dequeues SIGTTIN and sets SIGNAL_STOP_DEQUEUED again.
	  Since we have a handler we should not stop, T2 returns
	  to usermode to run the handler.

	- T1 continues, calls do_signal_stop() and wrongly starts
	  the group stop because SIGNAL_STOP_DEQUEUED was restored
	  in between.

With or without this change:

	- we need to do something with ptrace_signal() which can
	  return SIGSTOP, but this needs another discussion

	- SIGSTOP can be lost if it races with the mt exec, will
	  be fixed later.

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
2011-04-04 02:11:05 +02:00
..
2011-03-18 23:38:50 -07:00
2011-01-20 18:30:17 -08:00
2011-01-20 18:30:17 -08:00
2011-01-31 14:03:00 -08:00
2011-01-15 20:07:45 -05:00
2011-03-22 17:43:59 -07:00
2011-02-16 13:30:48 +01:00
2011-02-16 13:30:48 +01:00
2011-03-22 17:44:15 -07:00
2011-02-03 15:39:16 -08:00
2011-03-14 19:12:20 -04:00
2011-03-22 17:44:05 -07:00
2011-03-05 10:56:00 +01:00
2011-02-23 00:53:26 +00:00
2011-03-20 14:50:53 +01:00
2011-02-27 16:11:51 -08:00
2011-03-11 14:15:35 +01:00
2011-01-31 14:03:00 -08:00
2011-02-17 11:12:40 -08:00
2011-01-13 17:32:47 -08:00
2011-02-13 16:54:24 -08:00
2011-01-24 14:45:11 +10:30
2011-03-22 17:43:59 -07:00
2011-01-14 13:12:45 +00:00
2011-01-13 17:32:46 -08:00
2011-02-15 10:24:31 +01:00
2011-01-16 13:47:07 -05:00
2011-03-11 15:38:44 -05:00
2011-03-14 18:25:53 -04:00
2011-01-16 13:47:07 -05:00
2011-03-11 15:13:26 -05:00
2011-03-15 00:43:16 +01:00
2011-01-14 02:36:43 +00:00
2011-03-22 17:44:03 -07:00
2011-02-28 18:00:31 -08:00
2011-02-21 12:53:08 -08:00
2011-02-02 15:28:18 +01:00
2011-01-24 14:45:11 +10:30
2011-03-22 17:44:05 -07:00