1
0
Fork 0

taskstats: add e/u/stime for TGID command

The elapsed time, user CPU time and system CPU time for the thread group
status request are presently left at zero.  Fill these in.

[akpm@linux-foundation.org: run ktime_get_ns() a single time]
[akpm@linux-foundation.org: include linux/sched/cputime.h for task_cputime()]
Link: http://lkml.kernel.org/r/1488508424-12322-1-git-send-email-xiao.zhang@windriver.com
Signed-off-by: Zhang Xiao <xiao.zhang@windriver.com>
Cc: Balbir Singh <bsingharora@gmail.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
zero-colors
Zhang Xiao 2017-05-08 15:56:45 -07:00 committed by Linus Torvalds
parent eaa0d190bf
commit 8c733420bd
1 changed files with 14 additions and 0 deletions

View File

@ -30,6 +30,7 @@
#include <linux/pid_namespace.h> #include <linux/pid_namespace.h>
#include <net/genetlink.h> #include <net/genetlink.h>
#include <linux/atomic.h> #include <linux/atomic.h>
#include <linux/sched/cputime.h>
/* /*
* Maximum length of a cpumask that can be specified in * Maximum length of a cpumask that can be specified in
@ -210,6 +211,8 @@ static int fill_stats_for_tgid(pid_t tgid, struct taskstats *stats)
struct task_struct *tsk, *first; struct task_struct *tsk, *first;
unsigned long flags; unsigned long flags;
int rc = -ESRCH; int rc = -ESRCH;
u64 delta, utime, stime;
u64 start_time;
/* /*
* Add additional stats from live tasks except zombie thread group * Add additional stats from live tasks except zombie thread group
@ -227,6 +230,7 @@ static int fill_stats_for_tgid(pid_t tgid, struct taskstats *stats)
memset(stats, 0, sizeof(*stats)); memset(stats, 0, sizeof(*stats));
tsk = first; tsk = first;
start_time = ktime_get_ns();
do { do {
if (tsk->exit_state) if (tsk->exit_state)
continue; continue;
@ -238,6 +242,16 @@ static int fill_stats_for_tgid(pid_t tgid, struct taskstats *stats)
*/ */
delayacct_add_tsk(stats, tsk); delayacct_add_tsk(stats, tsk);
/* calculate task elapsed time in nsec */
delta = start_time - tsk->start_time;
/* Convert to micro seconds */
do_div(delta, NSEC_PER_USEC);
stats->ac_etime += delta;
task_cputime(tsk, &utime, &stime);
stats->ac_utime += div_u64(utime, NSEC_PER_USEC);
stats->ac_stime += div_u64(stime, NSEC_PER_USEC);
stats->nvcsw += tsk->nvcsw; stats->nvcsw += tsk->nvcsw;
stats->nivcsw += tsk->nivcsw; stats->nivcsw += tsk->nivcsw;
} while_each_thread(first, tsk); } while_each_thread(first, tsk);