On Fri Aug 31 00:24:47 2007, [EMAIL PROTECTED] wrote: > > Jonathan Lim wrote: > > On Sat Aug 25 21:58:44 2007, [EMAIL PROTECTED] wrote: > >>> Also, I don't understand why the code to update btime: > >>> > >>> /* calculate task elapsed time in timespec */ > >>> do_posix_clock_monotonic_gettime(&uptime); > >>> ts = timespec_sub(uptime, tsk->start_time); > >>> ... > >>> stats->ac_btime = get_seconds() - ts.tv_sec; > >>> > >>> does not simply use tsk->start_time or tsk->real_start_time without > >>> comparing it to the current time. > >> From what I understand, task->start_time and task->real_start_time > >> are taken from the realtime clock. The accounting in CSA seems > >> to be very similar to the accounting done in do_acct_process() > >> (kernel/acct.c). > > > > In CSA 3.0 ... > > > > csa_acct_eop(int exitcode, struct task_struct *p) > > > > csa->ac_btime = boottime + > > ((p->start_time.tv_nsec < NSEC_PER_SEC/2) ? > > p->start_time.tv_sec : > > p->start_time.tv_sec +1); > > > > where > > > > do_posix_clock_monotonic_gettime(&uptime); > > boottime = xtime.tv_sec - uptime.tv_sec; > > > > In an upcoming version of CSA ... > > > > csa_acct_eop(struct taskstats *p) > > > > csa->ac_btime = p->ac_btime; > > > > where > > > > do_posix_clock_monotonic_gettime(&uptime); > > ts = uptime - tsk->start_time; > > p->ac_btime = get_seconds() - ts.tv_sec; > > = xtime.tv_sec - (uptime - tsk->start_time); > > = (xtime.tv_sec - uptime) + tsk->start_time; > > > > So they're basically equivalent. > > Excellent, so can Guillaume change ac_btime to be just tsk->start_time?
I don't think so. Current time (xtime) is relative to the epoch; uptime and tsk->start_time (jiffies) are both relative to some boot time. So you need to subtract uptime from xtime to get the boot time relative to the epoch, then add tsk->start_time. The result is what ac_btime should be set to. I think his recent changes are as follows: --- a/kernel/tsacct.c Fri Aug 31 01:42:23 2007 -0700 +++ b/kernel/tsacct.c Tue Aug 28 20:35:27 2007 +0200 ... -void bacct_add_tsk(struct taskstats *stats, struct task_struct *tsk) +static void fill_wall_times(struct taskstats *stats, struct task_struct *task) ... - ts = timespec_sub(uptime, tsk->start_time); + ts = timespec_sub(uptime, task->start_time); ... - stats->ac_btime = get_seconds() - ts.tv_sec; ... + stats->ac_btime = get_seconds() - ts.tv_sec; So really no different from before, which is correct. Jonathan - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/