diff options
| -rw-r--r-- | kernel/posix-cpu-timers.c | 10 | 
1 files changed, 4 insertions, 6 deletions
diff --git a/kernel/posix-cpu-timers.c b/kernel/posix-cpu-timers.c index bf2a6502860..d5dbef5e89e 100644 --- a/kernel/posix-cpu-timers.c +++ b/kernel/posix-cpu-timers.c @@ -1272,10 +1272,6 @@ static inline int fastpath_timer_check(struct task_struct *tsk)  {  	struct signal_struct *sig; -	/* tsk == current, ensure it is safe to use ->signal/sighand */ -	if (unlikely(tsk->exit_state)) -		return 0; -  	if (!task_cputime_zero(&tsk->cputime_expires)) {  		struct task_cputime task_sample = {  			.utime = tsk->utime, @@ -1308,6 +1304,7 @@ void run_posix_cpu_timers(struct task_struct *tsk)  {  	LIST_HEAD(firing);  	struct k_itimer *timer, *next; +	unsigned long flags;  	BUG_ON(!irqs_disabled()); @@ -1318,7 +1315,8 @@ void run_posix_cpu_timers(struct task_struct *tsk)  	if (!fastpath_timer_check(tsk))  		return; -	spin_lock(&tsk->sighand->siglock); +	if (!lock_task_sighand(tsk, &flags)) +		return;  	/*  	 * Here we take off tsk->signal->cpu_timers[N] and  	 * tsk->cpu_timers[N] all the timers that are firing, and @@ -1340,7 +1338,7 @@ void run_posix_cpu_timers(struct task_struct *tsk)  	 * that gets the timer lock before we do will give it up and  	 * spin until we've taken care of that timer below.  	 */ -	spin_unlock(&tsk->sighand->siglock); +	unlock_task_sighand(tsk, &flags);  	/*  	 * Now that all the timers on our list have the firing flag,  |