Browse Source

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>
Paul E. McKenney 11 years ago
parent
commit
c41247e1d4
1 changed files with 4 additions and 0 deletions
  1. 4 0
      kernel/signal.c

+ 4 - 0
kernel/signal.c

@@ -1263,6 +1263,10 @@ struct sighand_struct *__lock_task_sighand(struct task_struct *tsk,
 	struct sighand_struct *sighand;
 	struct sighand_struct *sighand;
 
 
 	for (;;) {
 	for (;;) {
+		/*
+		 * Disable interrupts early to avoid deadlocks.
+		 * See rcu_read_unlock() comment header for details.
+		 */
 		local_irq_save(*flags);
 		local_irq_save(*flags);
 		rcu_read_lock();
 		rcu_read_lock();
 		sighand = rcu_dereference(tsk->sighand);
 		sighand = rcu_dereference(tsk->sighand);