summaryrefslogtreecommitdiffstats
path: root/fs/gfs2/main.c
diff options
context:
space:
mode:
authorSteven Whitehouse <swhiteho@redhat.com>2006-08-30 10:36:52 -0400
committerSteven Whitehouse <swhiteho@redhat.com>2006-08-30 10:36:52 -0400
commitec45d9f583b3663f90a7c5c559fd13e6e4c56ad5 (patch)
tree8248788ed2d2f1cb0ffc6b7180da3366b6773d62 /fs/gfs2/main.c
parent5e2b0613ed9f9641937dd5948051631249447c57 (diff)
downloadop-kernel-dev-ec45d9f583b3663f90a7c5c559fd13e6e4c56ad5.zip
op-kernel-dev-ec45d9f583b3663f90a7c5c559fd13e6e4c56ad5.tar.gz
[GFS2] Use slab properly with glocks
We can take advantage of the slab allocator to ensure that all the list heads and the spinlock (plus one or two other fields) are initialised by slab to speed up allocation of glocks. Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/gfs2/main.c')
-rw-r--r--fs/gfs2/main.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/fs/gfs2/main.c b/fs/gfs2/main.c
index c112943..dccc4f6 100644
--- a/fs/gfs2/main.c
+++ b/fs/gfs2/main.c
@@ -15,6 +15,7 @@
#include <linux/module.h>
#include <linux/init.h>
#include <linux/gfs2_ondisk.h>
+#include <asm/atomic.h>
#include "gfs2.h"
#include "lm_interface.h"
@@ -35,6 +36,25 @@ static void gfs2_init_inode_once(void *foo, kmem_cache_t *cachep, unsigned long
}
}
+static void gfs2_init_glock_once(void *foo, kmem_cache_t *cachep, unsigned long flags)
+{
+ struct gfs2_glock *gl = foo;
+ if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) ==
+ SLAB_CTOR_CONSTRUCTOR) {
+ INIT_LIST_HEAD(&gl->gl_list);
+ spin_lock_init(&gl->gl_spin);
+ INIT_LIST_HEAD(&gl->gl_holders);
+ INIT_LIST_HEAD(&gl->gl_waiters1);
+ INIT_LIST_HEAD(&gl->gl_waiters2);
+ INIT_LIST_HEAD(&gl->gl_waiters3);
+ gl->gl_lvb = NULL;
+ atomic_set(&gl->gl_lvb_count, 0);
+ INIT_LIST_HEAD(&gl->gl_reclaim);
+ INIT_LIST_HEAD(&gl->gl_ail_list);
+ atomic_set(&gl->gl_ail_count, 0);
+ }
+}
+
/**
* init_gfs2_fs - Register GFS2 as a filesystem
*
@@ -55,7 +75,8 @@ static int __init init_gfs2_fs(void)
gfs2_glock_cachep = kmem_cache_create("gfs2_glock",
sizeof(struct gfs2_glock),
- 0, 0, NULL, NULL);
+ 0, 0,
+ gfs2_init_glock_once, NULL);
if (!gfs2_glock_cachep)
goto fail;
OpenPOWER on IntegriCloud