aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Fleming <matt.fleming@intel.com>2012-05-10 20:58:05 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2012-05-21 23:52:33 -0400
commit4c3181bd3bde449d79b04e127b41ef02cade8005 (patch)
tree7b66dde4ba535c7a60d45f9fac0fdb977d2c7a2a
parent80c1dfa91c44665f2cecc1666050b2e8e04cef68 (diff)
score: use set_current_blocked() and block_sigmask()
As described in e6fa16ab ("signal: sigprocmask() should do retarget_shared_pending()") the modification of current->blocked is incorrect as we need to check whether the signal we're about to block is pending in the shared queue. Also, use the new helper function introduced in commit 5e6292c0f28f ("signal: add block_sigmask() for adding sigmask to current->blocked") which centralises the code for updating current->blocked after successfully delivering a signal and reduces the amount of duplicate code across architectures. In the past some architectures got this code wrong, so using this helper function should stop that from happening again. Acked-by: Oleg Nesterov <oleg@redhat.com> Cc: Chen Liqin <liqin.chen@sunplusct.com> Cc: Lennox Wu <lennox.wu@gmail.com> Signed-off-by: Matt Fleming <matt.fleming@intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--arch/score/kernel/signal.c15
1 files changed, 3 insertions, 12 deletions
diff --git a/arch/score/kernel/signal.c b/arch/score/kernel/signal.c
index bf9e33e05334..5a5bd1763336 100644
--- a/arch/score/kernel/signal.c
+++ b/arch/score/kernel/signal.c
@@ -159,10 +159,7 @@ score_rt_sigreturn(struct pt_regs *regs)
159 goto badframe; 159 goto badframe;
160 160
161 sigdelsetmask(&set, ~_BLOCKABLE); 161 sigdelsetmask(&set, ~_BLOCKABLE);
162 spin_lock_irq(&current->sighand->siglock); 162 set_current_blocked(&set);
163 current->blocked = set;
164 recalc_sigpending();
165 spin_unlock_irq(&current->sighand->siglock);
166 163
167 sig = restore_sigcontext(regs, &frame->rs_uc.uc_mcontext); 164 sig = restore_sigcontext(regs, &frame->rs_uc.uc_mcontext);
168 if (sig < 0) 165 if (sig < 0)
@@ -272,14 +269,8 @@ static int handle_signal(unsigned long sig, siginfo_t *info,
272 */ 269 */
273 ret = setup_rt_frame(ka, regs, sig, oldset, info); 270 ret = setup_rt_frame(ka, regs, sig, oldset, info);
274 271
275 if (ret == 0) { 272 if (ret == 0)
276 spin_lock_irq(&current->sighand->siglock); 273 block_sigmask(ka, sig);
277 sigorsets(&current->blocked, &current->blocked, &ka->sa.sa_mask);
278 if (!(ka->sa.sa_flags & SA_NODEFER))
279 sigaddset(&current->blocked, sig);
280 recalc_sigpending();
281 spin_unlock_irq(&current->sighand->siglock);
282 }
283 274
284 return ret; 275 return ret;
285} 276}