]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
signal: Explain local_irq_save() call
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Mon, 5 May 2014 15:18:30 +0000 (08:18 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Thu, 26 Jun 2014 17:58:42 +0000 (10:58 -0700)
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>
kernel/signal.c

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