From: Ingo Molnar Most distributions turn on process accounting - but even the common 'accounting is off' case is horrible SMP-scalability-wise: it accesses a global spinlock during every sys_exit() call, which bounces like mad on SMP (and NUMA) systems. (i also got rid of the unused return code.) include/linux/acct.h | 2 +- kernel/acct.c | 29 +++++++++++++++++++---------- 2 files changed, 20 insertions(+), 11 deletions(-) diff -puN kernel/acct.c~bsd-accounting-speedup kernel/acct.c --- 25/kernel/acct.c~bsd-accounting-speedup 2003-07-05 01:48:21.000000000 -0700 +++ 25-akpm/kernel/acct.c 2003-07-05 01:48:21.000000000 -0700 @@ -394,17 +394,26 @@ static void do_acct_process(long exitcod /* * acct_process - now just a wrapper around do_acct_process */ -int acct_process(long exitcode) +void acct_process(long exitcode) { struct file *file = NULL; + + /* + * accelerate the common fastpath: + */ + if (!acct_globals.file) + return; + spin_lock(&acct_globals.lock); - if (acct_globals.file) { - file = acct_globals.file; - get_file(file); - spin_unlock(&acct_globals.lock); - do_acct_process(exitcode, file); - fput(file); - } else - spin_unlock(&acct_globals.lock); - return 0; + file = acct_globals.file; + if (!file) + goto out_unlock; + + get_file(file); + spin_unlock(&acct_globals.lock); + do_acct_process(exitcode, file); + fput(file); + +out_unlock: + spin_unlock(&acct_globals.lock); } diff -puN include/linux/acct.h~bsd-accounting-speedup include/linux/acct.h --- 25/include/linux/acct.h~bsd-accounting-speedup 2003-07-05 01:48:29.000000000 -0700 +++ 25-akpm/include/linux/acct.h 2003-07-05 01:48:36.000000000 -0700 @@ -78,7 +78,7 @@ struct acct #ifdef CONFIG_BSD_PROCESS_ACCT struct super_block; extern void acct_auto_close(struct super_block *sb); -extern int acct_process(long exitcode); +extern void acct_process(long exitcode); #else #define acct_auto_close(x) do { } while (0) #define acct_process(x) do { } while (0) _