
From: Ingo Molnar <mingo@elte.hu>

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)

_
