diff options
Diffstat (limited to 'kernel/signal.c')
| -rw-r--r-- | kernel/signal.c | 13 | 
1 files changed, 13 insertions, 0 deletions
diff --git a/kernel/signal.c b/kernel/signal.c index 75761acc77cf..ae60996fedff 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -427,6 +427,7 @@ void flush_signals(struct task_struct *t)  	spin_unlock_irqrestore(&t->sighand->siglock, flags);  } +#ifdef CONFIG_POSIX_TIMERS  static void __flush_itimer_signals(struct sigpending *pending)  {  	sigset_t signal, retain; @@ -460,6 +461,7 @@ void flush_itimer_signals(void)  	__flush_itimer_signals(&tsk->signal->shared_pending);  	spin_unlock_irqrestore(&tsk->sighand->siglock, flags);  } +#endif  void ignore_signals(struct task_struct *t)  { @@ -567,6 +569,7 @@ int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info)  	if (!signr) {  		signr = __dequeue_signal(&tsk->signal->shared_pending,  					 mask, info); +#ifdef CONFIG_POSIX_TIMERS  		/*  		 * itimer signal ?  		 * @@ -590,6 +593,7 @@ int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info)  				hrtimer_restart(tmr);  			}  		} +#endif  	}  	recalc_sigpending(); @@ -611,6 +615,7 @@ int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info)  		 */  		current->jobctl |= JOBCTL_STOP_DEQUEUED;  	} +#ifdef CONFIG_POSIX_TIMERS  	if ((info->si_code & __SI_MASK) == __SI_TIMER && info->si_sys_private) {  		/*  		 * Release the siglock to ensure proper locking order @@ -622,6 +627,7 @@ int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info)  		do_schedule_next_timer(info);  		spin_lock(&tsk->sighand->siglock);  	} +#endif  	return signr;  } @@ -2485,6 +2491,13 @@ void __set_current_blocked(const sigset_t *newset)  {  	struct task_struct *tsk = current; +	/* +	 * In case the signal mask hasn't changed, there is nothing we need +	 * to do. The current->blocked shouldn't be modified by other task. +	 */ +	if (sigequalsets(&tsk->blocked, newset)) +		return; +  	spin_lock_irq(&tsk->sighand->siglock);  	__set_task_blocked(tsk, newset);  	spin_unlock_irq(&tsk->sighand->siglock);  |