diff options
Diffstat (limited to 'kernel/sched_stats.h')
-rw-r--r-- | kernel/sched_stats.h | 48 |
1 files changed, 26 insertions, 22 deletions
diff --git a/kernel/sched_stats.h b/kernel/sched_stats.h index f2773b5d1226..a8f93dd374e1 100644 --- a/kernel/sched_stats.h +++ b/kernel/sched_stats.h | |||
@@ -296,20 +296,21 @@ sched_info_switch(struct task_struct *prev, struct task_struct *next) | |||
296 | static inline void account_group_user_time(struct task_struct *tsk, | 296 | static inline void account_group_user_time(struct task_struct *tsk, |
297 | cputime_t cputime) | 297 | cputime_t cputime) |
298 | { | 298 | { |
299 | struct signal_struct *sig; | 299 | struct thread_group_cputimer *cputimer; |
300 | 300 | ||
301 | /* tsk == current, ensure it is safe to use ->signal */ | 301 | /* tsk == current, ensure it is safe to use ->signal */ |
302 | if (unlikely(tsk->exit_state)) | 302 | if (unlikely(tsk->exit_state)) |
303 | return; | 303 | return; |
304 | 304 | ||
305 | sig = tsk->signal; | 305 | cputimer = &tsk->signal->cputimer; |
306 | if (sig->cputime.totals) { | ||
307 | struct task_cputime *times; | ||
308 | 306 | ||
309 | times = per_cpu_ptr(sig->cputime.totals, get_cpu()); | 307 | if (!cputimer->running) |
310 | times->utime = cputime_add(times->utime, cputime); | 308 | return; |
311 | put_cpu_no_resched(); | 309 | |
312 | } | 310 | spin_lock(&cputimer->lock); |
311 | cputimer->cputime.utime = | ||
312 | cputime_add(cputimer->cputime.utime, cputime); | ||
313 | spin_unlock(&cputimer->lock); | ||
313 | } | 314 | } |
314 | 315 | ||
315 | /** | 316 | /** |
@@ -325,20 +326,21 @@ static inline void account_group_user_time(struct task_struct *tsk, | |||
325 | static inline void account_group_system_time(struct task_struct *tsk, | 326 | static inline void account_group_system_time(struct task_struct *tsk, |
326 | cputime_t cputime) | 327 | cputime_t cputime) |
327 | { | 328 | { |
328 | struct signal_struct *sig; | 329 | struct thread_group_cputimer *cputimer; |
329 | 330 | ||
330 | /* tsk == current, ensure it is safe to use ->signal */ | 331 | /* tsk == current, ensure it is safe to use ->signal */ |
331 | if (unlikely(tsk->exit_state)) | 332 | if (unlikely(tsk->exit_state)) |
332 | return; | 333 | return; |
333 | 334 | ||
334 | sig = tsk->signal; | 335 | cputimer = &tsk->signal->cputimer; |
335 | if (sig->cputime.totals) { | ||
336 | struct task_cputime *times; | ||
337 | 336 | ||
338 | times = per_cpu_ptr(sig->cputime.totals, get_cpu()); | 337 | if (!cputimer->running) |
339 | times->stime = cputime_add(times->stime, cputime); | 338 | return; |
340 | put_cpu_no_resched(); | 339 | |
341 | } | 340 | spin_lock(&cputimer->lock); |
341 | cputimer->cputime.stime = | ||
342 | cputime_add(cputimer->cputime.stime, cputime); | ||
343 | spin_unlock(&cputimer->lock); | ||
342 | } | 344 | } |
343 | 345 | ||
344 | /** | 346 | /** |
@@ -354,6 +356,7 @@ static inline void account_group_system_time(struct task_struct *tsk, | |||
354 | static inline void account_group_exec_runtime(struct task_struct *tsk, | 356 | static inline void account_group_exec_runtime(struct task_struct *tsk, |
355 | unsigned long long ns) | 357 | unsigned long long ns) |
356 | { | 358 | { |
359 | struct thread_group_cputimer *cputimer; | ||
357 | struct signal_struct *sig; | 360 | struct signal_struct *sig; |
358 | 361 | ||
359 | sig = tsk->signal; | 362 | sig = tsk->signal; |
@@ -362,11 +365,12 @@ static inline void account_group_exec_runtime(struct task_struct *tsk, | |||
362 | if (unlikely(!sig)) | 365 | if (unlikely(!sig)) |
363 | return; | 366 | return; |
364 | 367 | ||
365 | if (sig->cputime.totals) { | 368 | cputimer = &sig->cputimer; |
366 | struct task_cputime *times; | ||
367 | 369 | ||
368 | times = per_cpu_ptr(sig->cputime.totals, get_cpu()); | 370 | if (!cputimer->running) |
369 | times->sum_exec_runtime += ns; | 371 | return; |
370 | put_cpu_no_resched(); | 372 | |
371 | } | 373 | spin_lock(&cputimer->lock); |
374 | cputimer->cputime.sum_exec_runtime += ns; | ||
375 | spin_unlock(&cputimer->lock); | ||
372 | } | 376 | } |