diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/posix-cpu-timers.c | 29 | 
1 files changed, 10 insertions, 19 deletions
diff --git a/kernel/posix-cpu-timers.c b/kernel/posix-cpu-timers.c index d30b304a338..30ab39a2773 100644 --- a/kernel/posix-cpu-timers.c +++ b/kernel/posix-cpu-timers.c @@ -380,14 +380,9 @@ int posix_cpu_timer_create(struct k_itimer *new_timer)  int posix_cpu_timer_del(struct k_itimer *timer)  {  	struct task_struct *p = timer->it.cpu.task; +	int ret = 0; -	if (timer->it.cpu.firing) -		return TIMER_RETRY; - -	if (unlikely(p == NULL)) -		return 0; - -	if (!list_empty(&timer->it.cpu.entry)) { +	if (likely(p != NULL)) {  		read_lock(&tasklist_lock);  		if (unlikely(p->signal == NULL)) {  			/* @@ -396,18 +391,20 @@ int posix_cpu_timer_del(struct k_itimer *timer)  			 */  			BUG_ON(!list_empty(&timer->it.cpu.entry));  		} else { -			/* -			 * Take us off the task's timer list. -			 */  			spin_lock(&p->sighand->siglock); -			list_del(&timer->it.cpu.entry); +			if (timer->it.cpu.firing) +				ret = TIMER_RETRY; +			else +				list_del(&timer->it.cpu.entry);  			spin_unlock(&p->sighand->siglock);  		}  		read_unlock(&tasklist_lock); + +		if (!ret) +			put_task_struct(p);  	} -	put_task_struct(p); -	return 0; +	return ret;  }  /* @@ -424,8 +421,6 @@ static void cleanup_timers(struct list_head *head,  	cputime_t ptime = cputime_add(utime, stime);  	list_for_each_entry_safe(timer, next, head, entry) { -		put_task_struct(timer->task); -		timer->task = NULL;  		list_del_init(&timer->entry);  		if (cputime_lt(timer->expires.cpu, ptime)) {  			timer->expires.cpu = cputime_zero; @@ -437,8 +432,6 @@ static void cleanup_timers(struct list_head *head,  	++head;  	list_for_each_entry_safe(timer, next, head, entry) { -		put_task_struct(timer->task); -		timer->task = NULL;  		list_del_init(&timer->entry);  		if (cputime_lt(timer->expires.cpu, utime)) {  			timer->expires.cpu = cputime_zero; @@ -450,8 +443,6 @@ static void cleanup_timers(struct list_head *head,  	++head;  	list_for_each_entry_safe(timer, next, head, entry) { -		put_task_struct(timer->task); -		timer->task = NULL;  		list_del_init(&timer->entry);  		if (timer->expires.sched < sched_time) {  			timer->expires.sched = 0;  |