vserver 1.9.3
[linux-2.6.git] / kernel / acct.c
index daf23c4..fb6989a 100644 (file)
@@ -384,6 +384,8 @@ static void do_acct_process(long exitcode, struct file *file)
        unsigned long vsize;
        unsigned long flim;
        u64 elapsed;
+       u64 run_time;
+       struct timespec uptime;
 
        /*
         * First check to see if there is enough free_space to continue
@@ -401,7 +403,13 @@ static void do_acct_process(long exitcode, struct file *file)
        ac.ac_version = ACCT_VERSION | ACCT_BYTEORDER;
        strlcpy(ac.ac_comm, current->comm, sizeof(ac.ac_comm));
 
-       elapsed = jiffies_64_to_AHZ(get_jiffies_64() - current->start_time);
+       /* calculate run_time in nsec*/
+       do_posix_clock_monotonic_gettime(&uptime);
+       run_time = (u64)uptime.tv_sec*NSEC_PER_SEC + uptime.tv_nsec;
+       run_time -= (u64)current->start_time.tv_sec*NSEC_PER_SEC
+                                       + current->start_time.tv_nsec;
+       /* convert nsec -> AHZ */
+       elapsed = nsec_to_AHZ(run_time);
 #if ACCT_VERSION==3
        ac.ac_etime = encode_float(elapsed);
 #else