diff options
Diffstat (limited to 'kernel/tsacct.c')
-rw-r--r-- | kernel/tsacct.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/kernel/tsacct.c b/kernel/tsacct.c index a1dd9a1b1327..975cb49e32bf 100644 --- a/kernel/tsacct.c +++ b/kernel/tsacct.c | |||
@@ -31,20 +31,19 @@ void bacct_add_tsk(struct user_namespace *user_ns, | |||
31 | struct taskstats *stats, struct task_struct *tsk) | 31 | struct taskstats *stats, struct task_struct *tsk) |
32 | { | 32 | { |
33 | const struct cred *tcred; | 33 | const struct cred *tcred; |
34 | struct timespec uptime, ts; | ||
35 | cputime_t utime, stime, utimescaled, stimescaled; | 34 | cputime_t utime, stime, utimescaled, stimescaled; |
36 | u64 ac_etime; | 35 | u64 delta; |
37 | 36 | ||
38 | BUILD_BUG_ON(TS_COMM_LEN < TASK_COMM_LEN); | 37 | BUILD_BUG_ON(TS_COMM_LEN < TASK_COMM_LEN); |
39 | 38 | ||
40 | /* calculate task elapsed time in timespec */ | 39 | /* calculate task elapsed time in nsec */ |
41 | do_posix_clock_monotonic_gettime(&uptime); | 40 | delta = ktime_get_ns() - tsk->start_time; |
42 | ts = timespec_sub(uptime, tsk->start_time); | 41 | /* Convert to micro seconds */ |
43 | /* rebase elapsed time to usec (should never be negative) */ | 42 | do_div(delta, NSEC_PER_USEC); |
44 | ac_etime = timespec_to_ns(&ts); | 43 | stats->ac_etime = delta; |
45 | do_div(ac_etime, NSEC_PER_USEC); | 44 | /* Convert to seconds for btime */ |
46 | stats->ac_etime = ac_etime; | 45 | do_div(delta, USEC_PER_SEC); |
47 | stats->ac_btime = get_seconds() - ts.tv_sec; | 46 | stats->ac_btime = get_seconds() - delta; |
48 | if (thread_group_leader(tsk)) { | 47 | if (thread_group_leader(tsk)) { |
49 | stats->ac_exitcode = tsk->exit_code; | 48 | stats->ac_exitcode = tsk->exit_code; |
50 | if (tsk->flags & PF_FORKNOEXEC) | 49 | if (tsk->flags & PF_FORKNOEXEC) |