diff options
-rw-r--r-- | fs/proc/array.c | 44 |
1 files changed, 29 insertions, 15 deletions
diff --git a/fs/proc/array.c b/fs/proc/array.c index 965625a0977d..ee4814dd98f9 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c | |||
@@ -320,7 +320,21 @@ int proc_pid_status(struct task_struct *task, char *buffer) | |||
320 | return buffer - orig; | 320 | return buffer - orig; |
321 | } | 321 | } |
322 | 322 | ||
323 | static clock_t task_utime(struct task_struct *p) | 323 | /* |
324 | * Use precise platform statistics if available: | ||
325 | */ | ||
326 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | ||
327 | static cputime_t task_utime(struct task_struct *p) | ||
328 | { | ||
329 | return p->utime; | ||
330 | } | ||
331 | |||
332 | static cputime_t task_stime(struct task_struct *p) | ||
333 | { | ||
334 | return p->stime; | ||
335 | } | ||
336 | #else | ||
337 | static cputime_t task_utime(struct task_struct *p) | ||
324 | { | 338 | { |
325 | clock_t utime = cputime_to_clock_t(p->utime), | 339 | clock_t utime = cputime_to_clock_t(p->utime), |
326 | total = utime + cputime_to_clock_t(p->stime); | 340 | total = utime + cputime_to_clock_t(p->stime); |
@@ -337,10 +351,10 @@ static clock_t task_utime(struct task_struct *p) | |||
337 | } | 351 | } |
338 | utime = (clock_t)temp; | 352 | utime = (clock_t)temp; |
339 | 353 | ||
340 | return utime; | 354 | return clock_t_to_cputime(utime); |
341 | } | 355 | } |
342 | 356 | ||
343 | static clock_t task_stime(struct task_struct *p) | 357 | static cputime_t task_stime(struct task_struct *p) |
344 | { | 358 | { |
345 | clock_t stime; | 359 | clock_t stime; |
346 | 360 | ||
@@ -349,10 +363,12 @@ static clock_t task_stime(struct task_struct *p) | |||
349 | * the total, to make sure the total observed by userspace | 363 | * the total, to make sure the total observed by userspace |
350 | * grows monotonically - apps rely on that): | 364 | * grows monotonically - apps rely on that): |
351 | */ | 365 | */ |
352 | stime = nsec_to_clock_t(p->se.sum_exec_runtime) - task_utime(p); | 366 | stime = nsec_to_clock_t(p->se.sum_exec_runtime) - |
367 | cputime_to_clock_t(task_utime(p)); | ||
353 | 368 | ||
354 | return stime; | 369 | return clock_t_to_cputime(stime); |
355 | } | 370 | } |
371 | #endif | ||
356 | 372 | ||
357 | static int do_task_stat(struct task_struct *task, char *buffer, int whole) | 373 | static int do_task_stat(struct task_struct *task, char *buffer, int whole) |
358 | { | 374 | { |
@@ -368,8 +384,7 @@ static int do_task_stat(struct task_struct *task, char *buffer, int whole) | |||
368 | unsigned long long start_time; | 384 | unsigned long long start_time; |
369 | unsigned long cmin_flt = 0, cmaj_flt = 0; | 385 | unsigned long cmin_flt = 0, cmaj_flt = 0; |
370 | unsigned long min_flt = 0, maj_flt = 0; | 386 | unsigned long min_flt = 0, maj_flt = 0; |
371 | cputime_t cutime, cstime; | 387 | cputime_t cutime, cstime, utime, stime; |
372 | clock_t utime, stime; | ||
373 | unsigned long rsslim = 0; | 388 | unsigned long rsslim = 0; |
374 | char tcomm[sizeof(task->comm)]; | 389 | char tcomm[sizeof(task->comm)]; |
375 | unsigned long flags; | 390 | unsigned long flags; |
@@ -387,8 +402,7 @@ static int do_task_stat(struct task_struct *task, char *buffer, int whole) | |||
387 | 402 | ||
388 | sigemptyset(&sigign); | 403 | sigemptyset(&sigign); |
389 | sigemptyset(&sigcatch); | 404 | sigemptyset(&sigcatch); |
390 | cutime = cstime = cputime_zero; | 405 | cutime = cstime = utime = stime = cputime_zero; |
391 | utime = stime = 0; | ||
392 | 406 | ||
393 | rcu_read_lock(); | 407 | rcu_read_lock(); |
394 | if (lock_task_sighand(task, &flags)) { | 408 | if (lock_task_sighand(task, &flags)) { |
@@ -414,15 +428,15 @@ static int do_task_stat(struct task_struct *task, char *buffer, int whole) | |||
414 | do { | 428 | do { |
415 | min_flt += t->min_flt; | 429 | min_flt += t->min_flt; |
416 | maj_flt += t->maj_flt; | 430 | maj_flt += t->maj_flt; |
417 | utime += task_utime(t); | 431 | utime = cputime_add(utime, task_utime(t)); |
418 | stime += task_stime(t); | 432 | stime = cputime_add(stime, task_stime(t)); |
419 | t = next_thread(t); | 433 | t = next_thread(t); |
420 | } while (t != task); | 434 | } while (t != task); |
421 | 435 | ||
422 | min_flt += sig->min_flt; | 436 | min_flt += sig->min_flt; |
423 | maj_flt += sig->maj_flt; | 437 | maj_flt += sig->maj_flt; |
424 | utime += cputime_to_clock_t(sig->utime); | 438 | utime = cputime_add(utime, sig->utime); |
425 | stime += cputime_to_clock_t(sig->stime); | 439 | stime = cputime_add(stime, sig->stime); |
426 | } | 440 | } |
427 | 441 | ||
428 | sid = signal_session(sig); | 442 | sid = signal_session(sig); |
@@ -471,8 +485,8 @@ static int do_task_stat(struct task_struct *task, char *buffer, int whole) | |||
471 | cmin_flt, | 485 | cmin_flt, |
472 | maj_flt, | 486 | maj_flt, |
473 | cmaj_flt, | 487 | cmaj_flt, |
474 | utime, | 488 | cputime_to_clock_t(utime), |
475 | stime, | 489 | cputime_to_clock_t(stime), |
476 | cputime_to_clock_t(cutime), | 490 | cputime_to_clock_t(cutime), |
477 | cputime_to_clock_t(cstime), | 491 | cputime_to_clock_t(cstime), |
478 | priority, | 492 | priority, |