summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Morton <akpm@osdl.org>2003-07-06 05:41:34 -0700
committerLinus Torvalds <torvalds@home.osdl.org>2003-07-06 05:41:34 -0700
commitd24d1d3abedcd64a9fd90e602bbd45d73b9c0de0 (patch)
tree265485eb31094fe187996a5c0fd5150aeeea8105
parentd029f790d8ed6d277ef47eb1e1f99cdbc3f11017 (diff)
[PATCH] BSD accounting speedup
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.)
-rw-r--r--include/linux/acct.h2
-rw-r--r--kernel/acct.c29
2 files changed, 20 insertions, 11 deletions
diff --git a/include/linux/acct.h b/include/linux/acct.h
index 0b4ae8298a0e..69389c4af8e4 100644
--- a/include/linux/acct.h
+++ b/include/linux/acct.h
@@ -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)
diff --git a/kernel/acct.c b/kernel/acct.c
index e63095525ac2..028e310bd15f 100644
--- a/kernel/acct.c
+++ b/kernel/acct.c
@@ -394,17 +394,26 @@ static void do_acct_process(long exitcode, struct file *file)
/*
* 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);
}