diff options
Diffstat (limited to 'kernel/posix-cpu-timers.c')
| -rw-r--r-- | kernel/posix-cpu-timers.c | 12 | 
1 files changed, 7 insertions, 5 deletions
diff --git a/kernel/posix-cpu-timers.c b/kernel/posix-cpu-timers.c index 41440cca55a..e7cb76dc18f 100644 --- a/kernel/posix-cpu-timers.c +++ b/kernel/posix-cpu-timers.c @@ -250,7 +250,7 @@ void thread_group_cputime(struct task_struct *tsk, struct task_cputime *times)  	do {  		times->utime = cputime_add(times->utime, t->utime);  		times->stime = cputime_add(times->stime, t->stime); -		times->sum_exec_runtime += t->se.sum_exec_runtime; +		times->sum_exec_runtime += task_sched_runtime(t);  	} while_each_thread(tsk, t);  out:  	rcu_read_unlock(); @@ -274,9 +274,7 @@ void thread_group_cputimer(struct task_struct *tsk, struct task_cputime *times)  	struct task_cputime sum;  	unsigned long flags; -	raw_spin_lock_irqsave(&cputimer->lock, flags);  	if (!cputimer->running) { -		cputimer->running = 1;  		/*  		 * The POSIX timer interface allows for absolute time expiry  		 * values through the TIMER_ABSTIME flag, therefore we have @@ -284,8 +282,11 @@ void thread_group_cputimer(struct task_struct *tsk, struct task_cputime *times)  		 * it.  		 */  		thread_group_cputime(tsk, &sum); +		raw_spin_lock_irqsave(&cputimer->lock, flags); +		cputimer->running = 1;  		update_gt_cputime(&cputimer->cputime, &sum); -	} +	} else +		raw_spin_lock_irqsave(&cputimer->lock, flags);  	*times = cputimer->cputime;  	raw_spin_unlock_irqrestore(&cputimer->lock, flags);  } @@ -312,7 +313,8 @@ static int cpu_clock_sample_group(const clockid_t which_clock,  		cpu->cpu = cputime.utime;  		break;  	case CPUCLOCK_SCHED: -		cpu->sched = thread_group_sched_runtime(p); +		thread_group_cputime(p, &cputime); +		cpu->sched = cputime.sum_exec_runtime;  		break;  	}  	return 0;  |