[Ocfs2-devel] [PATCH 02/18] ocfs2_dlm: Creates slabcaches for the lockres' and the locks

Joel Becker Joel.Becker at oracle.com
Thu Feb 28 17:08:16 PST 2008


On Mon, Feb 25, 2008 at 12:20:46PM -0800, Sunil Mushran wrote:
> 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.

	Please run through checkpatch.pl.

Joel

> Signed-off-by: Sunil Mushran <sunil.mushran at oracle.com>
> ---
>  fs/ocfs2/dlm/dlmcommon.h |   10 +++++++
>  fs/ocfs2/dlm/dlmdomain.c |   33 ++++++++++++++++++++---
>  fs/ocfs2/dlm/dlmlock.c   |   23 +++++++++++++++-
>  fs/ocfs2/dlm/dlmmaster.c |   65 +++++++++++++++++++++++++++++++++++++--------
>  4 files changed, 113 insertions(+), 18 deletions(-)
> 
> diff --git a/fs/ocfs2/dlm/dlmcommon.h b/fs/ocfs2/dlm/dlmcommon.h
> index f3afb15..041ec68 100644
> --- a/fs/ocfs2/dlm/dlmcommon.h
> +++ b/fs/ocfs2/dlm/dlmcommon.h
> @@ -944,9 +944,19 @@ static inline void __dlm_wait_on_lockres(struct dlm_lock_resource *res)
>  					  DLM_LOCK_RES_MIGRATING));
>  }
>  
> +/* create/destroy slab caches */
> +int dlm_init_lockres_cache(void);
> +void dlm_destroy_lockres_cache(void);
> +
> +int dlm_init_lockname_cache(void);
> +void dlm_destroy_lockname_cache(void);
> +
> +int dlm_init_lock_cache(void);
> +void dlm_destroy_lock_cache(void);
>  
>  int dlm_init_mle_cache(void);
>  void dlm_destroy_mle_cache(void);
> +
>  void dlm_hb_event_notify_attached(struct dlm_ctxt *dlm, int idx, int node_up);
>  int dlm_drop_lockres_ref(struct dlm_ctxt *dlm,
>  			 struct dlm_lock_resource *res);
> diff --git a/fs/ocfs2/dlm/dlmdomain.c b/fs/ocfs2/dlm/dlmdomain.c
> index 502712b..6d02ef5 100644
> --- a/fs/ocfs2/dlm/dlmdomain.c
> +++ b/fs/ocfs2/dlm/dlmdomain.c
> @@ -1650,24 +1650,49 @@ static int __init dlm_init(void)
>  	status = dlm_init_mle_cache();
>  	if (status) {
>  		mlog(ML_ERROR, "Could not create o2dlm_mle slabcache\n");
> -		return -1;
> +		goto error;
>  	}
>  
> -	status = dlm_register_net_handlers();
> +	status = dlm_init_lockres_cache();
> +	if (status) {
> +		mlog(ML_ERROR, "Could not create o2dlm_lockres slabcache\n");
> +		goto error;
> +	}
> +
> +	status = dlm_init_lockname_cache();
>  	if (status) {
> -		dlm_destroy_mle_cache();
> -		return -1;
> +		mlog(ML_ERROR, "Could not create o2dlm_lockname slabcache\n");
> +		goto error;
>  	}
>  
> +	status = dlm_init_lock_cache();
> +	if (status) {
> +		mlog(ML_ERROR, "Could not create o2dlm_lock slabcache\n");
> +		goto error;
> +	}
> +
> +	status = dlm_register_net_handlers();
> +	if (status)
> +		goto error;
> +
>  	dlm_init_proc();
>  
>  	return 0;
> +error:
> +	dlm_destroy_lock_cache();
> +	dlm_destroy_lockname_cache();
> +	dlm_destroy_lockres_cache();
> +	dlm_destroy_mle_cache();
> +	return -1;
>  }
>  
>  static void __exit dlm_exit (void)
>  {
>  	dlm_remove_proc();
>  	dlm_unregister_net_handlers();
> +	dlm_destroy_lock_cache();
> +	dlm_destroy_lockname_cache();
> +	dlm_destroy_lockres_cache();
>  	dlm_destroy_mle_cache();
>  }
>  
> diff --git a/fs/ocfs2/dlm/dlmlock.c b/fs/ocfs2/dlm/dlmlock.c
> index 52578d9..ea393b6 100644
> --- a/fs/ocfs2/dlm/dlmlock.c
> +++ b/fs/ocfs2/dlm/dlmlock.c
> @@ -53,6 +53,8 @@
>  #define MLOG_MASK_PREFIX ML_DLM
>  #include "cluster/masklog.h"
>  
> +static struct kmem_cache *dlm_lock_cache = NULL;
> +
>  static DEFINE_SPINLOCK(dlm_cookie_lock);
>  static u64 dlm_next_cookie = 1;
>  
> @@ -64,6 +66,22 @@ static void dlm_init_lock(struct dlm_lock *newlock, int type,
>  static void dlm_lock_release(struct kref *kref);
>  static void dlm_lock_detach_lockres(struct dlm_lock *lock);
>  
> +int dlm_init_lock_cache(void)
> +{
> +	dlm_lock_cache = kapi_kmem_cache_create("o2dlm_lock",
> +						sizeof(struct dlm_lock),
> +						0, SLAB_HWCACHE_ALIGN, NULL);
> +	if (dlm_lock_cache == NULL)
> +		return -ENOMEM;
> +	return 0;
> +}
> +
> +void dlm_destroy_lock_cache(void)
> +{
> +	if (dlm_lock_cache)
> +		kmem_cache_destroy(dlm_lock_cache);
> +}
> +
>  /* Tell us whether we can grant a new lock request.
>   * locking:
>   *   caller needs:  res->spinlock
> @@ -353,7 +371,7 @@ static void dlm_lock_release(struct kref *kref)
>  		mlog(0, "freeing kernel-allocated lksb\n");
>  		kfree(lock->lksb);
>  	}
> -	kfree(lock);
> +	kmem_cache_free(dlm_lock_cache, lock);
>  }
>  
>  /* associate a lock with it's lockres, getting a ref on the lockres */
> @@ -412,9 +430,10 @@ struct dlm_lock * dlm_new_lock(int type, u8 node, u64 cookie,
>  	struct dlm_lock *lock;
>  	int kernel_allocated = 0;
>  
> -	lock = kzalloc(sizeof(*lock), GFP_NOFS);
> +	lock = (struct dlm_lock *) kmem_cache_alloc(dlm_lock_cache, GFP_NOFS);
>  	if (!lock)
>  		return NULL;
> +	memset(lock, 0, sizeof(struct dlm_lock));
>  
>  	if (!lksb) {
>  		/* zero memory only if kernel-allocated */
> diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c
> index cc4e624..939b863 100644
> --- a/fs/ocfs2/dlm/dlmmaster.c
> +++ b/fs/ocfs2/dlm/dlmmaster.c
> @@ -214,8 +214,9 @@ int dlm_dump_all_mles(const char __user *data, unsigned int len)
>  EXPORT_SYMBOL_GPL(dlm_dump_all_mles);
>  
>  
> -
> -
> +/* dlm slab caches */
> +static struct kmem_cache *dlm_lockres_cache = NULL;
> +static struct kmem_cache *dlm_lockname_cache = NULL;
>  static struct kmem_cache *dlm_mle_cache = NULL;
>  
>  
> @@ -559,6 +560,38 @@ static void dlm_mle_release(struct kref *kref)
>   * LOCK RESOURCE FUNCTIONS
>   */
>  
> +int dlm_init_lockres_cache(void)
> +{
> +	dlm_lockres_cache = kapi_kmem_cache_create("o2dlm_lockres",
> +					sizeof(struct dlm_lock_resource), 0,
> +					SLAB_HWCACHE_ALIGN, NULL);
> +	if (dlm_lockres_cache == NULL)
> +		return -ENOMEM;
> +	return 0;
> +}
> +
> +void dlm_destroy_lockres_cache(void)
> +{
> +	if (dlm_lockres_cache)
> +		kmem_cache_destroy(dlm_lockres_cache);
> +}
> +
> +int dlm_init_lockname_cache(void)
> +{
> +	dlm_lockname_cache = kapi_kmem_cache_create("o2dlm_lockname",
> +						    DLM_LOCKID_NAME_MAX, 0,
> +						    SLAB_HWCACHE_ALIGN, NULL);
> +	if (dlm_lockname_cache == NULL)
> +		return -ENOMEM;
> +	return 0;
> +}
> +
> +void dlm_destroy_lockname_cache(void)
> +{
> +	if (dlm_lockname_cache)
> +		kmem_cache_destroy(dlm_lockname_cache);
> +}
> +
>  static void dlm_set_lockres_owner(struct dlm_ctxt *dlm,
>  				  struct dlm_lock_resource *res,
>  				  u8 owner)
> @@ -641,9 +674,9 @@ static void dlm_lockres_release(struct kref *kref)
>  	BUG_ON(!list_empty(&res->recovering));
>  	BUG_ON(!list_empty(&res->purge));
>  
> -	kfree(res->lockname.name);
> +	kmem_cache_free(dlm_lockname_cache, (void *)res->lockname.name);
>  
> -	kfree(res);
> +	kmem_cache_free(dlm_lockres_cache, res);
>  }
>  
>  void dlm_lockres_put(struct dlm_lock_resource *res)
> @@ -699,20 +732,28 @@ struct dlm_lock_resource *dlm_new_lockres(struct dlm_ctxt *dlm,
>  				   const char *name,
>  				   unsigned int namelen)
>  {
> -	struct dlm_lock_resource *res;
> +	struct dlm_lock_resource *res = NULL;
>  
> -	res = kmalloc(sizeof(struct dlm_lock_resource), GFP_NOFS);
> +	res = (struct dlm_lock_resource *)
> +				kmem_cache_alloc(dlm_lockres_cache, GFP_NOFS);
>  	if (!res)
> -		return NULL;
> +		goto error;
>  
> -	res->lockname.name = kmalloc(namelen, GFP_NOFS);
> -	if (!res->lockname.name) {
> -		kfree(res);
> -		return NULL;
> -	}
> +	res->lockname.name = (char *)
> +				kmem_cache_alloc(dlm_lockname_cache, GFP_NOFS);
> +	if (!res->lockname.name)
> +		goto error;
>  
>  	dlm_init_lockres(dlm, res, name, namelen);
>  	return res;
> +
> +error:
> +	if (res && res->lockname.name)
> +		kmem_cache_free(dlm_lockname_cache, (void *)res->lockname.name);
> +
> +	if (res)
> +		kmem_cache_free(dlm_lockres_cache, res);
> +	return NULL;
>  }
>  
>  void __dlm_lockres_grab_inflight_ref(struct dlm_ctxt *dlm,
> -- 
> 1.5.2.5
> 
> 
> _______________________________________________
> Ocfs2-devel mailing list
> Ocfs2-devel at oss.oracle.com
> http://oss.oracle.com/mailman/listinfo/ocfs2-devel

-- 

"Sometimes one pays most for the things one gets for nothing."
        - Albert Einstein

Joel Becker
Principal Software Developer
Oracle
E-mail: joel.becker at oracle.com
Phone: (650) 506-8127



More information about the Ocfs2-devel mailing list