aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ocfs2/dlm
diff options
context:
space:
mode:
authorSunil Mushran <sunil.mushran@oracle.com>2008-03-10 18:16:20 -0400
committerMark Fasheh <mfasheh@suse.com>2008-04-18 11:56:08 -0400
commit724bdca9b8449d9ee5f779dc27ee3d906a04508c (patch)
treec12d1028d862a58ce7a01024ba9b1f04ab157e3b /fs/ocfs2/dlm
parent12eb0035d6f0466038ef2c6e5f6f9296b9b74d91 (diff)
ocfs2/dlm: Create slabcaches for lock and lockres
This patch makes the o2dlm allocate memory for lockres, lockname and lock structures from slabcaches rather than kmalloc. This allows us to not only make these allocs more efficient but also allows us to track the memory being consumed by these structures. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mfasheh@suse.com>
Diffstat (limited to 'fs/ocfs2/dlm')
-rw-r--r--fs/ocfs2/dlm/dlmcommon.h7
-rw-r--r--fs/ocfs2/dlm/dlmdomain.c26
-rw-r--r--fs/ocfs2/dlm/dlmlock.c22
-rw-r--r--fs/ocfs2/dlm/dlmmaster.c61
4 files changed, 99 insertions, 17 deletions
diff --git a/fs/ocfs2/dlm/dlmcommon.h b/fs/ocfs2/dlm/dlmcommon.h
index dc8ea666efdb..7525a8ae3943 100644
--- a/fs/ocfs2/dlm/dlmcommon.h
+++ b/fs/ocfs2/dlm/dlmcommon.h
@@ -963,9 +963,16 @@ static inline void __dlm_wait_on_lockres(struct dlm_lock_resource *res)
963 DLM_LOCK_RES_MIGRATING)); 963 DLM_LOCK_RES_MIGRATING));
964} 964}
965 965
966/* create/destroy slab caches */
967int dlm_init_master_caches(void);
968void dlm_destroy_master_caches(void);
969
970int dlm_init_lock_cache(void);
971void dlm_destroy_lock_cache(void);
966 972
967int dlm_init_mle_cache(void); 973int dlm_init_mle_cache(void);
968void dlm_destroy_mle_cache(void); 974void dlm_destroy_mle_cache(void);
975
969void dlm_hb_event_notify_attached(struct dlm_ctxt *dlm, int idx, int node_up); 976void dlm_hb_event_notify_attached(struct dlm_ctxt *dlm, int idx, int node_up);
970int dlm_drop_lockres_ref(struct dlm_ctxt *dlm, 977int dlm_drop_lockres_ref(struct dlm_ctxt *dlm,
971 struct dlm_lock_resource *res); 978 struct dlm_lock_resource *res);
diff --git a/fs/ocfs2/dlm/dlmdomain.c b/fs/ocfs2/dlm/dlmdomain.c
index 2ce620742f9e..b092364d0d52 100644
--- a/fs/ocfs2/dlm/dlmdomain.c
+++ b/fs/ocfs2/dlm/dlmdomain.c
@@ -1818,21 +1818,41 @@ static int __init dlm_init(void)
1818 status = dlm_init_mle_cache(); 1818 status = dlm_init_mle_cache();
1819 if (status) { 1819 if (status) {
1820 mlog(ML_ERROR, "Could not create o2dlm_mle slabcache\n"); 1820 mlog(ML_ERROR, "Could not create o2dlm_mle slabcache\n");
1821 return -1; 1821 goto error;
1822 }
1823
1824 status = dlm_init_master_caches();
1825 if (status) {
1826 mlog(ML_ERROR, "Could not create o2dlm_lockres and "
1827 "o2dlm_lockname slabcaches\n");
1828 goto error;
1829 }
1830
1831 status = dlm_init_lock_cache();
1832 if (status) {
1833 mlog(ML_ERROR, "Count not create o2dlm_lock slabcache\n");
1834 goto error;
1822 } 1835 }
1823 1836
1824 status = dlm_register_net_handlers(); 1837 status = dlm_register_net_handlers();
1825 if (status) { 1838 if (status) {
1826 dlm_destroy_mle_cache(); 1839 mlog(ML_ERROR, "Unable to register network handlers\n");
1827 return -1; 1840 goto error;
1828 } 1841 }
1829 1842
1830 return 0; 1843 return 0;
1844error:
1845 dlm_destroy_lock_cache();
1846 dlm_destroy_master_caches();
1847 dlm_destroy_mle_cache();
1848 return -1;
1831} 1849}
1832 1850
1833static void __exit dlm_exit (void) 1851static void __exit dlm_exit (void)
1834{ 1852{
1835 dlm_unregister_net_handlers(); 1853 dlm_unregister_net_handlers();
1854 dlm_destroy_lock_cache();
1855 dlm_destroy_master_caches();
1836 dlm_destroy_mle_cache(); 1856 dlm_destroy_mle_cache();
1837} 1857}
1838 1858
diff --git a/fs/ocfs2/dlm/dlmlock.c b/fs/ocfs2/dlm/dlmlock.c
index 52578d907d9a..83a9f2972ac8 100644
--- a/fs/ocfs2/dlm/dlmlock.c
+++ b/fs/ocfs2/dlm/dlmlock.c
@@ -53,6 +53,8 @@
53#define MLOG_MASK_PREFIX ML_DLM 53#define MLOG_MASK_PREFIX ML_DLM
54#include "cluster/masklog.h" 54#include "cluster/masklog.h"
55 55
56static struct kmem_cache *dlm_lock_cache = NULL;
57
56static DEFINE_SPINLOCK(dlm_cookie_lock); 58static DEFINE_SPINLOCK(dlm_cookie_lock);
57static u64 dlm_next_cookie = 1; 59static u64 dlm_next_cookie = 1;
58 60
@@ -64,6 +66,22 @@ static void dlm_init_lock(struct dlm_lock *newlock, int type,
64static void dlm_lock_release(struct kref *kref); 66static void dlm_lock_release(struct kref *kref);
65static void dlm_lock_detach_lockres(struct dlm_lock *lock); 67static void dlm_lock_detach_lockres(struct dlm_lock *lock);
66 68
69int dlm_init_lock_cache(void)
70{
71 dlm_lock_cache = kmem_cache_create("o2dlm_lock",
72 sizeof(struct dlm_lock),
73 0, SLAB_HWCACHE_ALIGN, NULL);
74 if (dlm_lock_cache == NULL)
75 return -ENOMEM;
76 return 0;
77}
78
79void dlm_destroy_lock_cache(void)
80{
81 if (dlm_lock_cache)
82 kmem_cache_destroy(dlm_lock_cache);
83}
84
67/* Tell us whether we can grant a new lock request. 85/* Tell us whether we can grant a new lock request.
68 * locking: 86 * locking:
69 * caller needs: res->spinlock 87 * caller needs: res->spinlock
@@ -353,7 +371,7 @@ static void dlm_lock_release(struct kref *kref)
353 mlog(0, "freeing kernel-allocated lksb\n"); 371 mlog(0, "freeing kernel-allocated lksb\n");
354 kfree(lock->lksb); 372 kfree(lock->lksb);
355 } 373 }
356 kfree(lock); 374 kmem_cache_free(dlm_lock_cache, lock);
357} 375}
358 376
359/* associate a lock with it's lockres, getting a ref on the lockres */ 377/* associate a lock with it's lockres, getting a ref on the lockres */
@@ -412,7 +430,7 @@ struct dlm_lock * dlm_new_lock(int type, u8 node, u64 cookie,
412 struct dlm_lock *lock; 430 struct dlm_lock *lock;
413 int kernel_allocated = 0; 431 int kernel_allocated = 0;
414 432
415 lock = kzalloc(sizeof(*lock), GFP_NOFS); 433 lock = (struct dlm_lock *) kmem_cache_zalloc(dlm_lock_cache, GFP_NOFS);
416 if (!lock) 434 if (!lock)
417 return NULL; 435 return NULL;
418 436
diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c
index 90797c591018..ac9ed31e5445 100644
--- a/fs/ocfs2/dlm/dlmmaster.c
+++ b/fs/ocfs2/dlm/dlmmaster.c
@@ -216,10 +216,10 @@ EXPORT_SYMBOL_GPL(dlm_dump_all_mles);
216 216
217#endif /* 0 */ 217#endif /* 0 */
218 218
219 219static struct kmem_cache *dlm_lockres_cache = NULL;
220static struct kmem_cache *dlm_lockname_cache = NULL;
220static struct kmem_cache *dlm_mle_cache = NULL; 221static struct kmem_cache *dlm_mle_cache = NULL;
221 222
222
223static void dlm_mle_release(struct kref *kref); 223static void dlm_mle_release(struct kref *kref);
224static void dlm_init_mle(struct dlm_master_list_entry *mle, 224static void dlm_init_mle(struct dlm_master_list_entry *mle,
225 enum dlm_mle_type type, 225 enum dlm_mle_type type,
@@ -560,6 +560,35 @@ static void dlm_mle_release(struct kref *kref)
560 * LOCK RESOURCE FUNCTIONS 560 * LOCK RESOURCE FUNCTIONS
561 */ 561 */
562 562
563int dlm_init_master_caches(void)
564{
565 dlm_lockres_cache = kmem_cache_create("o2dlm_lockres",
566 sizeof(struct dlm_lock_resource),
567 0, SLAB_HWCACHE_ALIGN, NULL);
568 if (!dlm_lockres_cache)
569 goto bail;
570
571 dlm_lockname_cache = kmem_cache_create("o2dlm_lockname",
572 DLM_LOCKID_NAME_MAX, 0,
573 SLAB_HWCACHE_ALIGN, NULL);
574 if (!dlm_lockname_cache)
575 goto bail;
576
577 return 0;
578bail:
579 dlm_destroy_master_caches();
580 return -ENOMEM;
581}
582
583void dlm_destroy_master_caches(void)
584{
585 if (dlm_lockname_cache)
586 kmem_cache_destroy(dlm_lockname_cache);
587
588 if (dlm_lockres_cache)
589 kmem_cache_destroy(dlm_lockres_cache);
590}
591
563static void dlm_set_lockres_owner(struct dlm_ctxt *dlm, 592static void dlm_set_lockres_owner(struct dlm_ctxt *dlm,
564 struct dlm_lock_resource *res, 593 struct dlm_lock_resource *res,
565 u8 owner) 594 u8 owner)
@@ -642,9 +671,9 @@ static void dlm_lockres_release(struct kref *kref)
642 BUG_ON(!list_empty(&res->recovering)); 671 BUG_ON(!list_empty(&res->recovering));
643 BUG_ON(!list_empty(&res->purge)); 672 BUG_ON(!list_empty(&res->purge));
644 673
645 kfree(res->lockname.name); 674 kmem_cache_free(dlm_lockname_cache, (void *)res->lockname.name);
646 675
647 kfree(res); 676 kmem_cache_free(dlm_lockres_cache, res);
648} 677}
649 678
650void dlm_lockres_put(struct dlm_lock_resource *res) 679void dlm_lockres_put(struct dlm_lock_resource *res)
@@ -700,20 +729,28 @@ struct dlm_lock_resource *dlm_new_lockres(struct dlm_ctxt *dlm,
700 const char *name, 729 const char *name,
701 unsigned int namelen) 730 unsigned int namelen)
702{ 731{
703 struct dlm_lock_resource *res; 732 struct dlm_lock_resource *res = NULL;
704 733
705 res = kmalloc(sizeof(struct dlm_lock_resource), GFP_NOFS); 734 res = (struct dlm_lock_resource *)
735 kmem_cache_zalloc(dlm_lockres_cache, GFP_NOFS);
706 if (!res) 736 if (!res)
707 return NULL; 737 goto error;
708 738
709 res->lockname.name = kmalloc(namelen, GFP_NOFS); 739 res->lockname.name = (char *)
710 if (!res->lockname.name) { 740 kmem_cache_zalloc(dlm_lockname_cache, GFP_NOFS);
711 kfree(res); 741 if (!res->lockname.name)
712 return NULL; 742 goto error;
713 }
714 743
715 dlm_init_lockres(dlm, res, name, namelen); 744 dlm_init_lockres(dlm, res, name, namelen);
716 return res; 745 return res;
746
747error:
748 if (res && res->lockname.name)
749 kmem_cache_free(dlm_lockname_cache, (void *)res->lockname.name);
750
751 if (res)
752 kmem_cache_free(dlm_lockres_cache, res);
753 return NULL;
717} 754}
718 755
719void __dlm_lockres_grab_inflight_ref(struct dlm_ctxt *dlm, 756void __dlm_lockres_grab_inflight_ref(struct dlm_ctxt *dlm,