public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] dmapi: simplify slab cache creation
@ 2007-08-02 21:29 Christoph Hellwig
  2007-08-06  5:58 ` Vlad Apostolov
  0 siblings, 1 reply; 2+ messages in thread
From: Christoph Hellwig @ 2007-08-02 21:29 UTC (permalink / raw)
  To: xfs

Currently two out of three slab caches are created on-demand on
dmapi_register.  Move them into dmapi_init as the others are to clean up
all the mess about checking whether dmapi_register has been called
before or is in the process of beeing called.


Signed-off-by: Christoph Hellwig <hch@lst.de>

Index: linux-2.6-xfs/fs/dmapi/dmapi_mountinfo.c
===================================================================
--- linux-2.6-xfs.orig/fs/dmapi/dmapi_mountinfo.c	2007-08-02 16:00:52.000000000 +0200
+++ linux-2.6-xfs/fs/dmapi/dmapi_mountinfo.c	2007-08-02 16:07:13.000000000 +0200
@@ -471,40 +471,7 @@ dmapi_register(
 	struct filesystem_dmapi_operations *dmapiops)
 {
 	dm_vector_map_t *proto;
-	static int initialized = 0;
 
-wait_cache:
-	spin_lock(&dm_fsys_lock);
-	if (initialized == -1) {
-		spin_unlock(&dm_fsys_lock);
-		goto wait_cache;
-	}
-	if (initialized == 0)
-		initialized = -1;
-	spin_unlock(&dm_fsys_lock);
-
-	if (initialized == -1) {
-		ASSERT(dm_fsys_map_cachep == NULL);
-		ASSERT(dm_fsys_vptr_cachep == NULL);
-
-		dm_fsys_map_cachep = kmem_cache_create("dm_fsys_map",
-					sizeof(dm_vector_map_t), 0, 0, NULL, NULL);
-
-		dm_fsys_vptr_cachep = kmem_cache_create("dm_fsys_vptr",
-					sizeof(dm_fsys_vector_t), 0, 0, NULL, NULL);
-
-		spin_lock(&dm_fsys_lock);
-		if ((dm_fsys_map_cachep == NULL) ||
-		    (dm_fsys_map_cachep == NULL)) {
-			initialized = 0;
-			spin_unlock(&dm_fsys_lock);
-			goto out_cache_free;
-		}
-		initialized = 1;
-		spin_unlock(&dm_fsys_lock);
-	}
-
-	ASSERT_ALWAYS(initialized == 1);
 	proto = kmem_cache_alloc(dm_fsys_map_cachep, GFP_KERNEL);
 	if (proto == NULL) {
 		printk("%s/%d: kmem_cache_alloc(dm_fsys_map_cachep) returned NULL\n", __FUNCTION__, __LINE__);
@@ -521,21 +488,8 @@ wait_cache:
 	list_add(&proto->ftype_list, &dm_fsys_map);
 	ftype_list();
 	spin_unlock(&dm_fsys_lock);
-
-	return;
-
-out_cache_free:
-	if (dm_fsys_map_cachep) {
-		kmem_cache_destroy(dm_fsys_map_cachep);
-		dm_fsys_map_cachep = NULL;
-	}
-	if (dm_fsys_vptr_cachep) {
-		kmem_cache_destroy(dm_fsys_vptr_cachep);
-		dm_fsys_vptr_cachep = NULL;
-	}
 }
 
-
 /* Called by a filesystem module that is unloading from the kernel */
 void
 dmapi_unregister(
Index: linux-2.6-xfs/fs/dmapi/dmapi_sysent.c
===================================================================
--- linux-2.6-xfs.orig/fs/dmapi/dmapi_sysent.c	2007-08-02 16:03:21.000000000 +0200
+++ linux-2.6-xfs/fs/dmapi/dmapi_sysent.c	2007-08-02 16:09:46.000000000 +0200
@@ -740,35 +740,47 @@ int __init dmapi_init(void)
 	dm_tokdata_cachep = kmem_cache_create("dm_tokdata",
 				sizeof(struct dm_tokdata), 0, 0, NULL, NULL);
 	if (dm_tokdata_cachep == NULL)
-		goto out_cache_free;
+		goto out;
 
 	dm_fsreg_cachep = kmem_cache_create("dm_fsreg",
 				sizeof(struct dm_fsreg), 0, 0, NULL, NULL);
 	if (dm_fsreg_cachep == NULL)
-		goto out_cache_free;
+		goto out_free_tokdata_cachep;
 
 	dm_session_cachep = kmem_cache_create("dm_session",
 				sizeof(struct dm_session), 0, 0, NULL, NULL);
 	if (dm_session_cachep == NULL)
-		goto out_cache_free;
+		goto out_free_fsreg_cachep;
+
+	dm_fsys_map_cachep = kmem_cache_create("dm_fsys_map",
+				sizeof(dm_vector_map_t), 0, 0, NULL, NULL);
+	if (dm_fsys_map_cachep == NULL)
+		goto out_free_session_cachep;
+	dm_fsys_vptr_cachep = kmem_cache_create("dm_fsys_vptr",
+				sizeof(dm_fsys_vector_t), 0, 0, NULL, NULL);
+	if (dm_fsys_vptr_cachep == NULL)
+		goto out_free_fsys_map_cachep;
 
 	ret = misc_register(&dmapi_dev);
-	if( ret != 0 )
+	if (ret) {
 		printk(KERN_ERR "dmapi_init: misc_register returned %d\n", ret);
+		goto out_free_fsys_vptr_cachep;
+	}
+
 	dmapi_init_procfs(dmapi_dev.minor);
 	return 0;
 
-out_cache_free:
-	if (dm_tokdata_cachep)
-		kmem_cache_destroy(dm_tokdata_cachep);
-	if (dm_fsreg_cachep)
-		kmem_cache_destroy(dm_fsreg_cachep);
-	if (dm_session_cachep)
-		kmem_cache_destroy(dm_session_cachep);
-	if (dm_fsys_map_cachep)
-		kmem_cache_destroy(dm_fsys_map_cachep);
-	if (dm_fsys_vptr_cachep)
-		kmem_cache_destroy(dm_fsys_vptr_cachep);
+ out_free_fsys_vptr_cachep:
+	kmem_cache_destroy(dm_fsys_vptr_cachep);
+ out_free_fsys_map_cachep:
+	kmem_cache_destroy(dm_fsys_map_cachep);
+ out_free_session_cachep:
+	kmem_cache_destroy(dm_session_cachep);
+ out_free_fsreg_cachep:
+	kmem_cache_destroy(dm_fsreg_cachep);
+ out_free_tokdata_cachep:
+	kmem_cache_destroy(dm_tokdata_cachep);
+ out:
 	return -ENOMEM;
 }
 

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] dmapi: simplify slab cache creation
  2007-08-02 21:29 [PATCH] dmapi: simplify slab cache creation Christoph Hellwig
@ 2007-08-06  5:58 ` Vlad Apostolov
  0 siblings, 0 replies; 2+ messages in thread
From: Vlad Apostolov @ 2007-08-06  5:58 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: xfs

It is looking good Christoph,

Regards,
Vlad

Christoph Hellwig wrote:
> Currently two out of three slab caches are created on-demand on
> dmapi_register.  Move them into dmapi_init as the others are to clean up
> all the mess about checking whether dmapi_register has been called
> before or is in the process of beeing called.
>
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
>
> Index: linux-2.6-xfs/fs/dmapi/dmapi_mountinfo.c
> ===================================================================
> --- linux-2.6-xfs.orig/fs/dmapi/dmapi_mountinfo.c	2007-08-02 16:00:52.000000000 +0200
> +++ linux-2.6-xfs/fs/dmapi/dmapi_mountinfo.c	2007-08-02 16:07:13.000000000 +0200
> @@ -471,40 +471,7 @@ dmapi_register(
>  	struct filesystem_dmapi_operations *dmapiops)
>  {
>  	dm_vector_map_t *proto;
> -	static int initialized = 0;
>  
> -wait_cache:
> -	spin_lock(&dm_fsys_lock);
> -	if (initialized == -1) {
> -		spin_unlock(&dm_fsys_lock);
> -		goto wait_cache;
> -	}
> -	if (initialized == 0)
> -		initialized = -1;
> -	spin_unlock(&dm_fsys_lock);
> -
> -	if (initialized == -1) {
> -		ASSERT(dm_fsys_map_cachep == NULL);
> -		ASSERT(dm_fsys_vptr_cachep == NULL);
> -
> -		dm_fsys_map_cachep = kmem_cache_create("dm_fsys_map",
> -					sizeof(dm_vector_map_t), 0, 0, NULL, NULL);
> -
> -		dm_fsys_vptr_cachep = kmem_cache_create("dm_fsys_vptr",
> -					sizeof(dm_fsys_vector_t), 0, 0, NULL, NULL);
> -
> -		spin_lock(&dm_fsys_lock);
> -		if ((dm_fsys_map_cachep == NULL) ||
> -		    (dm_fsys_map_cachep == NULL)) {
> -			initialized = 0;
> -			spin_unlock(&dm_fsys_lock);
> -			goto out_cache_free;
> -		}
> -		initialized = 1;
> -		spin_unlock(&dm_fsys_lock);
> -	}
> -
> -	ASSERT_ALWAYS(initialized == 1);
>  	proto = kmem_cache_alloc(dm_fsys_map_cachep, GFP_KERNEL);
>  	if (proto == NULL) {
>  		printk("%s/%d: kmem_cache_alloc(dm_fsys_map_cachep) returned NULL\n", __FUNCTION__, __LINE__);
> @@ -521,21 +488,8 @@ wait_cache:
>  	list_add(&proto->ftype_list, &dm_fsys_map);
>  	ftype_list();
>  	spin_unlock(&dm_fsys_lock);
> -
> -	return;
> -
> -out_cache_free:
> -	if (dm_fsys_map_cachep) {
> -		kmem_cache_destroy(dm_fsys_map_cachep);
> -		dm_fsys_map_cachep = NULL;
> -	}
> -	if (dm_fsys_vptr_cachep) {
> -		kmem_cache_destroy(dm_fsys_vptr_cachep);
> -		dm_fsys_vptr_cachep = NULL;
> -	}
>  }
>  
> -
>  /* Called by a filesystem module that is unloading from the kernel */
>  void
>  dmapi_unregister(
> Index: linux-2.6-xfs/fs/dmapi/dmapi_sysent.c
> ===================================================================
> --- linux-2.6-xfs.orig/fs/dmapi/dmapi_sysent.c	2007-08-02 16:03:21.000000000 +0200
> +++ linux-2.6-xfs/fs/dmapi/dmapi_sysent.c	2007-08-02 16:09:46.000000000 +0200
> @@ -740,35 +740,47 @@ int __init dmapi_init(void)
>  	dm_tokdata_cachep = kmem_cache_create("dm_tokdata",
>  				sizeof(struct dm_tokdata), 0, 0, NULL, NULL);
>  	if (dm_tokdata_cachep == NULL)
> -		goto out_cache_free;
> +		goto out;
>  
>  	dm_fsreg_cachep = kmem_cache_create("dm_fsreg",
>  				sizeof(struct dm_fsreg), 0, 0, NULL, NULL);
>  	if (dm_fsreg_cachep == NULL)
> -		goto out_cache_free;
> +		goto out_free_tokdata_cachep;
>  
>  	dm_session_cachep = kmem_cache_create("dm_session",
>  				sizeof(struct dm_session), 0, 0, NULL, NULL);
>  	if (dm_session_cachep == NULL)
> -		goto out_cache_free;
> +		goto out_free_fsreg_cachep;
> +
> +	dm_fsys_map_cachep = kmem_cache_create("dm_fsys_map",
> +				sizeof(dm_vector_map_t), 0, 0, NULL, NULL);
> +	if (dm_fsys_map_cachep == NULL)
> +		goto out_free_session_cachep;
> +	dm_fsys_vptr_cachep = kmem_cache_create("dm_fsys_vptr",
> +				sizeof(dm_fsys_vector_t), 0, 0, NULL, NULL);
> +	if (dm_fsys_vptr_cachep == NULL)
> +		goto out_free_fsys_map_cachep;
>  
>  	ret = misc_register(&dmapi_dev);
> -	if( ret != 0 )
> +	if (ret) {
>  		printk(KERN_ERR "dmapi_init: misc_register returned %d\n", ret);
> +		goto out_free_fsys_vptr_cachep;
> +	}
> +
>  	dmapi_init_procfs(dmapi_dev.minor);
>  	return 0;
>  
> -out_cache_free:
> -	if (dm_tokdata_cachep)
> -		kmem_cache_destroy(dm_tokdata_cachep);
> -	if (dm_fsreg_cachep)
> -		kmem_cache_destroy(dm_fsreg_cachep);
> -	if (dm_session_cachep)
> -		kmem_cache_destroy(dm_session_cachep);
> -	if (dm_fsys_map_cachep)
> -		kmem_cache_destroy(dm_fsys_map_cachep);
> -	if (dm_fsys_vptr_cachep)
> -		kmem_cache_destroy(dm_fsys_vptr_cachep);
> + out_free_fsys_vptr_cachep:
> +	kmem_cache_destroy(dm_fsys_vptr_cachep);
> + out_free_fsys_map_cachep:
> +	kmem_cache_destroy(dm_fsys_map_cachep);
> + out_free_session_cachep:
> +	kmem_cache_destroy(dm_session_cachep);
> + out_free_fsreg_cachep:
> +	kmem_cache_destroy(dm_fsreg_cachep);
> + out_free_tokdata_cachep:
> +	kmem_cache_destroy(dm_tokdata_cachep);
> + out:
>  	return -ENOMEM;
>  }
>  
>
>   

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2007-08-06  5:56 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-08-02 21:29 [PATCH] dmapi: simplify slab cache creation Christoph Hellwig
2007-08-06  5:58 ` Vlad Apostolov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox