The patch titled pacct: none-delayed process accounting accumulation has been added to the -mm tree. Its filename is pacct-none-delayed-process-accounting-accumulation.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: pacct: none-delayed process accounting accumulation From: KaiGai Kohei <kaigai@xxxxxxxxxxxxx> In current 2.6.17 implementation, signal_struct refered from task_struct is used for per-process data structure. The pacct facility also uses it as a per-process data structure to store stime, utime, minflt, majflt. But those members are saved in __exit_signal(). It's too late. For example, if some threads exits at same time, pacct facility has a possibility to drop accountings for a part of those threads. (see, the following 'The results of original 2.6.17 kernel') I think accounting information should be completely collected into the per-process data structure before writing out an accounting record. This patch fixes this matter. Accumulation of stime, utime, minflt and majflt are done before generating accounting record. Signed-off-by: KaiGai Kohei <kaigai@xxxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- include/linux/sched.h | 2 ++ kernel/acct.c | 20 +++++++++----------- 2 files changed, 11 insertions(+), 11 deletions(-) diff -puN include/linux/sched.h~pacct-none-delayed-process-accounting-accumulation include/linux/sched.h --- a/include/linux/sched.h~pacct-none-delayed-process-accounting-accumulation +++ a/include/linux/sched.h @@ -362,6 +362,8 @@ struct pacct_struct { int ac_flag; long ac_exitcode; unsigned long ac_mem; + cputime_t ac_utime, ac_stime; + unsigned long ac_minflt, ac_majflt; }; /* diff -puN kernel/acct.c~pacct-none-delayed-process-accounting-accumulation kernel/acct.c --- a/kernel/acct.c~pacct-none-delayed-process-accounting-accumulation +++ a/kernel/acct.c @@ -428,7 +428,6 @@ static void do_acct_process(struct file u64 elapsed; u64 run_time; struct timespec uptime; - unsigned long jiffies; /* * First check to see if there is enough free_space to continue @@ -469,12 +468,6 @@ static void do_acct_process(struct file #endif do_div(elapsed, AHZ); ac.ac_btime = xtime.tv_sec - elapsed; - jiffies = cputime_to_jiffies(cputime_add(current->utime, - current->signal->utime)); - ac.ac_utime = encode_comp_t(jiffies_to_AHZ(jiffies)); - jiffies = cputime_to_jiffies(cputime_add(current->stime, - current->signal->stime)); - ac.ac_stime = encode_comp_t(jiffies_to_AHZ(jiffies)); /* we really need to bite the bullet and change layout */ ac.ac_uid = current->uid; ac.ac_gid = current->gid; @@ -497,16 +490,16 @@ static void do_acct_process(struct file read_unlock(&tasklist_lock); spin_lock(¤t->sighand->siglock); + ac.ac_utime = encode_comp_t(jiffies_to_AHZ(cputime_to_jiffies(pacct->ac_utime))); + ac.ac_stime = encode_comp_t(jiffies_to_AHZ(cputime_to_jiffies(pacct->ac_stime))); ac.ac_flag = pacct->ac_flag; ac.ac_mem = encode_comp_t(pacct->ac_mem); + ac.ac_minflt = encode_comp_t(pacct->ac_minflt); + ac.ac_majflt = encode_comp_t(pacct->ac_majflt); ac.ac_exitcode = pacct->ac_exitcode; spin_unlock(¤t->sighand->siglock); ac.ac_io = encode_comp_t(0 /* current->io_usage */); /* %% */ ac.ac_rw = encode_comp_t(ac.ac_io / 1024); - ac.ac_minflt = encode_comp_t(current->signal->min_flt + - current->min_flt); - ac.ac_majflt = encode_comp_t(current->signal->maj_flt + - current->maj_flt); ac.ac_swaps = encode_comp_t(0); /* @@ -532,6 +525,7 @@ static void do_acct_process(struct file void acct_init_pacct(struct pacct_struct *pacct) { memset(pacct, 0, sizeof(struct pacct_struct)); + pacct->ac_utime = pacct->ac_stime = cputime_zero; } /** @@ -569,6 +563,10 @@ void acct_collect(long exitcode, int gro pacct->ac_flag |= ACORE; if (current->flags & PF_SIGNALED) pacct->ac_flag |= AXSIG; + pacct->ac_utime = cputime_add(pacct->ac_utime, current->utime); + pacct->ac_stime = cputime_add(pacct->ac_stime, current->stime); + pacct->ac_minflt += current->min_flt; + pacct->ac_majflt += current->maj_flt; spin_unlock(¤t->sighand->siglock); } _ Patches currently in -mm which might be from kaigai@xxxxxxxxxxxxx are origin.patch pacct-two-phase-process-accounting.patch pacct-avoidance-to-refer-the-last-thread-as-a-representation-of-the-process.patch pacct-none-delayed-process-accounting-accumulation.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html