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
parent
eaa0d190bf
commit
8c733420bd
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue