From cb5cf56c598d7be1399edccf56af083f81405a1a Mon Sep 17 00:00:00 2001 From: "Paul E. McKenney" Date: Tue, 19 Jul 2011 03:25:36 -0700 Subject: [PATCH] --- yaml --- r: 255024 b: refs/heads/master c: a841796f11c90d53dbac773be56b04fbee8af272 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/kernel/signal.c | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index cdc183d93d2d..08cd12433ac9 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: ec433f0c51527426989ea8a38a856d810d739414 +refs/heads/master: a841796f11c90d53dbac773be56b04fbee8af272 diff --git a/trunk/kernel/signal.c b/trunk/kernel/signal.c index ff7678603328..415d85d6f6c6 100644 --- a/trunk/kernel/signal.c +++ b/trunk/kernel/signal.c @@ -1178,18 +1178,25 @@ struct sighand_struct *__lock_task_sighand(struct task_struct *tsk, { struct sighand_struct *sighand; - rcu_read_lock(); for (;;) { + local_irq_save(*flags); + rcu_read_lock(); sighand = rcu_dereference(tsk->sighand); - if (unlikely(sighand == NULL)) + if (unlikely(sighand == NULL)) { + rcu_read_unlock(); + local_irq_restore(*flags); break; + } - spin_lock_irqsave(&sighand->siglock, *flags); - if (likely(sighand == tsk->sighand)) + spin_lock(&sighand->siglock); + if (likely(sighand == tsk->sighand)) { + rcu_read_unlock(); break; - spin_unlock_irqrestore(&sighand->siglock, *flags); + } + spin_unlock(&sighand->siglock); + rcu_read_unlock(); + local_irq_restore(*flags); } - rcu_read_unlock(); return sighand; }