diff options
Diffstat (limited to 'fs/proc/array.c')
-rw-r--r-- | fs/proc/array.c | 59 |
1 files changed, 47 insertions, 12 deletions
diff --git a/fs/proc/array.c b/fs/proc/array.c index 74f30e0c0381..98e78e2f18d6 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c | |||
@@ -165,7 +165,6 @@ static inline char * task_state(struct task_struct *p, char *buffer) | |||
165 | rcu_read_lock(); | 165 | rcu_read_lock(); |
166 | buffer += sprintf(buffer, | 166 | buffer += sprintf(buffer, |
167 | "State:\t%s\n" | 167 | "State:\t%s\n" |
168 | "SleepAVG:\t%lu%%\n" | ||
169 | "Tgid:\t%d\n" | 168 | "Tgid:\t%d\n" |
170 | "Pid:\t%d\n" | 169 | "Pid:\t%d\n" |
171 | "PPid:\t%d\n" | 170 | "PPid:\t%d\n" |
@@ -173,7 +172,6 @@ static inline char * task_state(struct task_struct *p, char *buffer) | |||
173 | "Uid:\t%d\t%d\t%d\t%d\n" | 172 | "Uid:\t%d\t%d\t%d\t%d\n" |
174 | "Gid:\t%d\t%d\t%d\t%d\n", | 173 | "Gid:\t%d\t%d\t%d\t%d\n", |
175 | get_task_state(p), | 174 | get_task_state(p), |
176 | (p->sleep_avg/1024)*100/(1020000000/1024), | ||
177 | p->tgid, p->pid, | 175 | p->tgid, p->pid, |
178 | pid_alive(p) ? rcu_dereference(p->real_parent)->tgid : 0, | 176 | pid_alive(p) ? rcu_dereference(p->real_parent)->tgid : 0, |
179 | pid_alive(p) && p->ptrace ? rcu_dereference(p->parent)->pid : 0, | 177 | pid_alive(p) && p->ptrace ? rcu_dereference(p->parent)->pid : 0, |
@@ -312,6 +310,41 @@ int proc_pid_status(struct task_struct *task, char * buffer) | |||
312 | return buffer - orig; | 310 | return buffer - orig; |
313 | } | 311 | } |
314 | 312 | ||
313 | static clock_t task_utime(struct task_struct *p) | ||
314 | { | ||
315 | clock_t utime = cputime_to_clock_t(p->utime), | ||
316 | total = utime + cputime_to_clock_t(p->stime); | ||
317 | u64 temp; | ||
318 | |||
319 | /* | ||
320 | * Use CFS's precise accounting: | ||
321 | */ | ||
322 | temp = (u64)nsec_to_clock_t(p->se.sum_exec_runtime); | ||
323 | |||
324 | if (total) { | ||
325 | temp *= utime; | ||
326 | do_div(temp, total); | ||
327 | } | ||
328 | utime = (clock_t)temp; | ||
329 | |||
330 | return utime; | ||
331 | } | ||
332 | |||
333 | static clock_t task_stime(struct task_struct *p) | ||
334 | { | ||
335 | clock_t stime = cputime_to_clock_t(p->stime); | ||
336 | |||
337 | /* | ||
338 | * Use CFS's precise accounting. (we subtract utime from | ||
339 | * the total, to make sure the total observed by userspace | ||
340 | * grows monotonically - apps rely on that): | ||
341 | */ | ||
342 | stime = nsec_to_clock_t(p->se.sum_exec_runtime) - task_utime(p); | ||
343 | |||
344 | return stime; | ||
345 | } | ||
346 | |||
347 | |||
315 | static int do_task_stat(struct task_struct *task, char * buffer, int whole) | 348 | static int do_task_stat(struct task_struct *task, char * buffer, int whole) |
316 | { | 349 | { |
317 | unsigned long vsize, eip, esp, wchan = ~0UL; | 350 | unsigned long vsize, eip, esp, wchan = ~0UL; |
@@ -326,7 +359,8 @@ static int do_task_stat(struct task_struct *task, char * buffer, int whole) | |||
326 | unsigned long long start_time; | 359 | unsigned long long start_time; |
327 | unsigned long cmin_flt = 0, cmaj_flt = 0; | 360 | unsigned long cmin_flt = 0, cmaj_flt = 0; |
328 | unsigned long min_flt = 0, maj_flt = 0; | 361 | unsigned long min_flt = 0, maj_flt = 0; |
329 | cputime_t cutime, cstime, utime, stime; | 362 | cputime_t cutime, cstime; |
363 | clock_t utime, stime; | ||
330 | unsigned long rsslim = 0; | 364 | unsigned long rsslim = 0; |
331 | char tcomm[sizeof(task->comm)]; | 365 | char tcomm[sizeof(task->comm)]; |
332 | unsigned long flags; | 366 | unsigned long flags; |
@@ -344,7 +378,8 @@ static int do_task_stat(struct task_struct *task, char * buffer, int whole) | |||
344 | 378 | ||
345 | sigemptyset(&sigign); | 379 | sigemptyset(&sigign); |
346 | sigemptyset(&sigcatch); | 380 | sigemptyset(&sigcatch); |
347 | cutime = cstime = utime = stime = cputime_zero; | 381 | cutime = cstime = cputime_zero; |
382 | utime = stime = 0; | ||
348 | 383 | ||
349 | rcu_read_lock(); | 384 | rcu_read_lock(); |
350 | if (lock_task_sighand(task, &flags)) { | 385 | if (lock_task_sighand(task, &flags)) { |
@@ -370,15 +405,15 @@ static int do_task_stat(struct task_struct *task, char * buffer, int whole) | |||
370 | do { | 405 | do { |
371 | min_flt += t->min_flt; | 406 | min_flt += t->min_flt; |
372 | maj_flt += t->maj_flt; | 407 | maj_flt += t->maj_flt; |
373 | utime = cputime_add(utime, t->utime); | 408 | utime += task_utime(t); |
374 | stime = cputime_add(stime, t->stime); | 409 | stime += task_stime(t); |
375 | t = next_thread(t); | 410 | t = next_thread(t); |
376 | } while (t != task); | 411 | } while (t != task); |
377 | 412 | ||
378 | min_flt += sig->min_flt; | 413 | min_flt += sig->min_flt; |
379 | maj_flt += sig->maj_flt; | 414 | maj_flt += sig->maj_flt; |
380 | utime = cputime_add(utime, sig->utime); | 415 | utime += cputime_to_clock_t(sig->utime); |
381 | stime = cputime_add(stime, sig->stime); | 416 | stime += cputime_to_clock_t(sig->stime); |
382 | } | 417 | } |
383 | 418 | ||
384 | sid = signal_session(sig); | 419 | sid = signal_session(sig); |
@@ -394,8 +429,8 @@ static int do_task_stat(struct task_struct *task, char * buffer, int whole) | |||
394 | if (!whole) { | 429 | if (!whole) { |
395 | min_flt = task->min_flt; | 430 | min_flt = task->min_flt; |
396 | maj_flt = task->maj_flt; | 431 | maj_flt = task->maj_flt; |
397 | utime = task->utime; | 432 | utime = task_utime(task); |
398 | stime = task->stime; | 433 | stime = task_stime(task); |
399 | } | 434 | } |
400 | 435 | ||
401 | /* scale priority and nice values from timeslices to -20..20 */ | 436 | /* scale priority and nice values from timeslices to -20..20 */ |
@@ -426,8 +461,8 @@ static int do_task_stat(struct task_struct *task, char * buffer, int whole) | |||
426 | cmin_flt, | 461 | cmin_flt, |
427 | maj_flt, | 462 | maj_flt, |
428 | cmaj_flt, | 463 | cmaj_flt, |
429 | cputime_to_clock_t(utime), | 464 | utime, |
430 | cputime_to_clock_t(stime), | 465 | stime, |
431 | cputime_to_clock_t(cutime), | 466 | cputime_to_clock_t(cutime), |
432 | cputime_to_clock_t(cstime), | 467 | cputime_to_clock_t(cstime), |
433 | priority, | 468 | priority, |