OSDN Git Service

sched: Make task->start_time nanoseconds based
authorThomas Gleixner <tglx@linutronix.de>
Wed, 16 Jul 2014 21:04:34 +0000 (21:04 +0000)
committerJohn Stultz <john.stultz@linaro.org>
Wed, 23 Jul 2014 17:18:05 +0000 (10:18 -0700)
Simplify the timespec to nsec/usec conversions.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: John Stultz <john.stultz@linaro.org>
include/linux/sched.h
kernel/acct.c
kernel/fork.c
kernel/tsacct.c

index 67678fa..10c6e82 100644 (file)
@@ -1367,7 +1367,7 @@ struct task_struct {
        } vtime_snap_whence;
 #endif
        unsigned long nvcsw, nivcsw; /* context switch counts */
-       struct timespec start_time;             /* monotonic time */
+       u64 start_time;         /* monotonic time in nsec */
        u64 real_start_time;    /* boot based time in nsec */
 /* mm fault and swap info: this can arguably be seen as either mm-specific or thread-specific */
        unsigned long min_flt, maj_flt;
index 1be013c..a1844f1 100644 (file)
@@ -458,9 +458,7 @@ static void do_acct_process(struct bsd_acct_struct *acct,
        acct_t ac;
        mm_segment_t fs;
        unsigned long flim;
-       u64 elapsed;
-       u64 run_time;
-       struct timespec uptime;
+       u64 elapsed, run_time;
        struct tty_struct *tty;
        const struct cred *orig_cred;
 
@@ -484,10 +482,8 @@ static void do_acct_process(struct bsd_acct_struct *acct,
        strlcpy(ac.ac_comm, current->comm, sizeof(ac.ac_comm));
 
        /* calculate run_time in nsec*/
-       ktime_get_ts(&uptime);
-       run_time = (u64)uptime.tv_sec*NSEC_PER_SEC + uptime.tv_nsec;
-       run_time -= (u64)current->group_leader->start_time.tv_sec * NSEC_PER_SEC
-                      + current->group_leader->start_time.tv_nsec;
+       run_time = ktime_get_ns();
+       run_time -= current->group_leader->start_time;
        /* convert nsec -> AHZ */
        elapsed = nsec_to_AHZ(run_time);
 #if ACCT_VERSION==3
index a7ab82d..627b7f8 100644 (file)
@@ -1262,7 +1262,7 @@ static struct task_struct *copy_process(unsigned long clone_flags,
 
        posix_cpu_timers_init(p);
 
-       ktime_get_ts(&p->start_time);
+       p->start_time = ktime_get_ns();
        p->real_start_time = ktime_get_boot_ns();
        p->io_context = NULL;
        p->audit_context = NULL;
index ea6d170..975cb49 100644 (file)
@@ -31,20 +31,19 @@ void bacct_add_tsk(struct user_namespace *user_ns,
                   struct taskstats *stats, struct task_struct *tsk)
 {
        const struct cred *tcred;
-       struct timespec uptime, ts;
        cputime_t utime, stime, utimescaled, stimescaled;
-       u64 ac_etime;
+       u64 delta;
 
        BUILD_BUG_ON(TS_COMM_LEN < TASK_COMM_LEN);
 
-       /* calculate task elapsed time in timespec */
-       ktime_get_ts(&uptime);
-       ts = timespec_sub(uptime, tsk->start_time);
-       /* rebase elapsed time to usec (should never be negative) */
-       ac_etime = timespec_to_ns(&ts);
-       do_div(ac_etime, NSEC_PER_USEC);
-       stats->ac_etime = ac_etime;
-       stats->ac_btime = get_seconds() - ts.tv_sec;
+       /* calculate task elapsed time in nsec */
+       delta = ktime_get_ns() - tsk->start_time;
+       /* Convert to micro seconds */
+       do_div(delta, NSEC_PER_USEC);
+       stats->ac_etime = delta;
+       /* Convert to seconds for btime */
+       do_div(delta, USEC_PER_SEC);
+       stats->ac_btime = get_seconds() - delta;
        if (thread_group_leader(tsk)) {
                stats->ac_exitcode = tsk->exit_code;
                if (tsk->flags & PF_FORKNOEXEC)