diff options
author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2014-05-05 11:18:30 -0400 |
---|---|---|
committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2014-07-09 12:14:33 -0400 |
commit | c41247e1d4864c863ee25e029dd53acdb2abc000 (patch) | |
tree | 86011181ada393aadad02a79085678bda508d2cc /kernel/signal.c | |
parent | ab74fdfd4e11ec040f21cf87edc14fc9f62cc934 (diff) |
signal: Explain local_irq_save() call
The explicit local_irq_save() in __lock_task_sighand() is needed to avoid
a potential deadlock condition, as noted in a841796f11c90d53 (signal:
align __lock_task_sighand() irq disabling and RCU). However, someone
reading the code might be forgiven for concluding that this separate
local_irq_save() was completely unnecessary. This commit therefore adds
a comment referencing the shiny new block comment on rcu_read_unlock().
Reported-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Acked-by: Oleg Nesterov <oleg@redhat.com>
Reviewed-by: Lai Jiangshan <laijs@cn.fujitsu.com>
Diffstat (limited to 'kernel/signal.c')
-rw-r--r-- | kernel/signal.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/kernel/signal.c b/kernel/signal.c index a4077e90f19f..40b76e351e64 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -1263,6 +1263,10 @@ struct sighand_struct *__lock_task_sighand(struct task_struct *tsk, | |||
1263 | struct sighand_struct *sighand; | 1263 | struct sighand_struct *sighand; |
1264 | 1264 | ||
1265 | for (;;) { | 1265 | for (;;) { |
1266 | /* | ||
1267 | * Disable interrupts early to avoid deadlocks. | ||
1268 | * See rcu_read_unlock() comment header for details. | ||
1269 | */ | ||
1266 | local_irq_save(*flags); | 1270 | local_irq_save(*flags); |
1267 | rcu_read_lock(); | 1271 | rcu_read_lock(); |
1268 | sighand = rcu_dereference(tsk->sighand); | 1272 | sighand = rcu_dereference(tsk->sighand); |