diff options
Diffstat (limited to 'arch/sparc/kernel/signal_64.c')
| -rw-r--r-- | arch/sparc/kernel/signal_64.c | 32 | 
1 files changed, 13 insertions, 19 deletions
diff --git a/arch/sparc/kernel/signal_64.c b/arch/sparc/kernel/signal_64.c index 47509df3b89..a2b81598d90 100644 --- a/arch/sparc/kernel/signal_64.c +++ b/arch/sparc/kernel/signal_64.c @@ -70,10 +70,7 @@ asmlinkage void sparc64_set_context(struct pt_regs *regs)  				goto do_sigsegv;  		}  		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 (test_thread_flag(TIF_32BIT)) {  		pc &= 0xffffffff; @@ -242,12 +239,13 @@ struct rt_signal_frame {  static long _sigpause_common(old_sigset_t set)  { -	set &= _BLOCKABLE; -	spin_lock_irq(¤t->sighand->siglock); +	sigset_t blocked; +  	current->saved_sigmask = current->blocked; -	siginitset(¤t->blocked, set); -	recalc_sigpending(); -	spin_unlock_irq(¤t->sighand->siglock); + +	set &= _BLOCKABLE; +	siginitset(&blocked, set); +	set_current_blocked(&blocked);  	current->state = TASK_INTERRUPTIBLE;  	schedule(); @@ -327,10 +325,7 @@ void do_rt_sigreturn(struct pt_regs *regs)  	pt_regs_clear_syscall(regs);  	sigdelsetmask(&set, ~_BLOCKABLE); -	spin_lock_irq(¤t->sighand->siglock); -	current->blocked = set; -	recalc_sigpending(); -	spin_unlock_irq(¤t->sighand->siglock); +	set_current_blocked(&set);  	return;  segv:  	force_sig(SIGSEGV, current); @@ -484,18 +479,17 @@ static inline int handle_signal(unsigned long signr, struct k_sigaction *ka,  				siginfo_t *info,  				sigset_t *oldset, struct pt_regs *regs)  { +	sigset_t blocked;  	int err;  	err = setup_rt_frame(ka, regs, signr, oldset,  			     (ka->sa.sa_flags & SA_SIGINFO) ? info : NULL);  	if (err)  		return err; -	spin_lock_irq(¤t->sighand->siglock); -	sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); +	sigorsets(&blocked, ¤t->blocked, &ka->sa.sa_mask);  	if (!(ka->sa.sa_flags & SA_NOMASK)) -		sigaddset(¤t->blocked,signr); -	recalc_sigpending(); -	spin_unlock_irq(¤t->sighand->siglock); +		sigaddset(&blocked, signr); +	set_current_blocked(&blocked);  	tracehook_signal_handler(signr, info, ka, regs, 0); @@ -601,7 +595,7 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)  	 */  	if (current_thread_info()->status & TS_RESTORE_SIGMASK) {  		current_thread_info()->status &= ~TS_RESTORE_SIGMASK; -		sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); +		set_current_blocked(¤t->saved_sigmask);  	}  }  |