[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20080310150026.GA6407@APFDCB5C>
Date: Tue, 11 Mar 2008 00:00:27 +0900
From: Akinobu Mita <akinobu.mita@...il.com>
To: linux-kernel@...r.kernel.org
Cc: akpm@...ux-foundation.org
Subject: [PATCH 2/5] idr: use call_once()
idr_layer_cache is created when idr_init() is called first time by someone.
This patch makes the idr_layer_cache initialization to use call_once().
This conversion prevents an unlikely race condition when two idr_init()
callers attempt to create idr_layer_cache simultaneously.
Signed-off-by: Akinobu Mita <akinobu.mita@...il.com>
---
lib/idr.c | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
Index: 2.6-rc/lib/idr.c
===================================================================
--- 2.6-rc.orig/lib/idr.c
+++ 2.6-rc/lib/idr.c
@@ -28,6 +28,7 @@
#include <linux/slab.h>
#include <linux/init.h>
#include <linux/module.h>
+#include <linux/once.h>
#endif
#include <linux/err.h>
#include <linux/string.h>
@@ -585,12 +586,12 @@ static void idr_cache_ctor(struct kmem_c
memset(idr_layer, 0, sizeof(struct idr_layer));
}
-static int init_id_cache(void)
+static int init_id_cache(void)
{
- if (!idr_layer_cache)
- idr_layer_cache = kmem_cache_create("idr_layer_cache",
+ idr_layer_cache = kmem_cache_create("idr_layer_cache",
sizeof(struct idr_layer), 0, 0, idr_cache_ctor);
- return 0;
+
+ return !idr_layer_cache ? -ENOMEM : 0;
}
/**
@@ -602,7 +603,9 @@ static int init_id_cache(void)
*/
void idr_init(struct idr *idp)
{
- init_id_cache();
+ static DEFINE_ONCE(once);
+
+ call_once(&once, init_id_cache);
memset(idp, 0, sizeof(struct idr));
spin_lock_init(&idp->lock);
}
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists