On Tue, Feb 14, 2012 at 7:40 PM, Matt Fleming <matt@xxxxxxxxxxxxxxxxx> wrote: > From: Matt Fleming <matt.fleming@xxxxxxxxx> > > 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. > > Cc: Oleg Nesterov <oleg@xxxxxxxxxx> > Acked-by: Mike Frysinger <vapier@xxxxxxxxxx> > Cc: uclinux-dist-devel@xxxxxxxxxxxxxxxxxxxx > Signed-off-by: Matt Fleming <matt.fleming@xxxxxxxxx> > --- > arch/blackfin/kernel/signal.c | 17 ++++------------- > 1 files changed, 4 insertions(+), 13 deletions(-) > > diff --git a/arch/blackfin/kernel/signal.c b/arch/blackfin/kernel/signal.c > index d536f35..05ece02 100644 > --- a/arch/blackfin/kernel/signal.c > +++ b/arch/blackfin/kernel/signal.c > @@ -99,10 +99,7 @@ asmlinkage int do_rt_sigreturn(unsigned long __unused) > goto badframe; > > sigdelsetmask(&set, ~_BLOCKABLE); > - spin_lock_irq(¤t->sighand->siglock); > - current->blocked = set; > - recalc_sigpending(); > - spin_unlock_irq(¤t->sighand->siglock); > + set_current_blocked(&set); > > if (rt_restore_sigcontext(regs, &frame->uc.uc_mcontext, &r0)) > goto badframe; > @@ -266,15 +263,9 @@ handle_signal(int sig, siginfo_t *info, struct k_sigaction *ka, > /* set up the stack frame */ > ret = setup_rt_frame(sig, ka, info, oldset, regs); > > - if (ret == 0) { > - spin_lock_irq(¤t->sighand->siglock); > - sigorsets(¤t->blocked, ¤t->blocked, > - &ka->sa.sa_mask); > - if (!(ka->sa.sa_flags & SA_NODEFER)) > - sigaddset(¤t->blocked, sig); > - recalc_sigpending(); > - spin_unlock_irq(¤t->sighand->siglock); > - } > + if (ret == 0) > + block_sigmask(ka, sig); > + > return ret; > } > Thanks. I'll apply it. -- Regards, --Bob -- To unsubscribe from this list: send the line "unsubscribe linux-arch" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html