lkml.org 
[lkml]   [2008]   [Apr]   [11]   [last100]   RSS Feed
Views: [more markup]  [less markup]  [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
DateFri, 11 Apr 2008 18:17:04 +0200
From Nadia.Derbey@bull ...
Subject[PATCH 02/13] Change ridr structure
[PATCH 02/13]

This patch changes the ridr structures to make them use RCU.

Signed-off-by: Nadia Derbey <Nadia.Derbey@bull.net>

---
 include/linux/ridr.h |   42 +++++++++++++++++++++++++++---------------
 1 file changed, 27 insertions(+), 15 deletions(-)
Index: linux-2.6.25-rc8-mm1/include/linux/ridr.h
===================================================================
--- linux-2.6.25-rc8-mm1.orig/include/linux/ridr.h	2008-04-11 17:17:41.000000000 +0200
+++ linux-2.6.25-rc8-mm1/include/linux/ridr.h	2008-04-11 17:34:35.000000000 +0200
@@ -9,41 +9,53 @@
 #define _RIDR_H_
 
 #include <linux/idr.h>
+#include <linux/rcupdate.h>
 
 struct ridr_layer {
 	unsigned long		 bitmap; /* A zero bit means "space here" */
 	struct ridr_layer	*ary[1<<IDR_BITS];
 	int			 count;	 /* When zero, we can release it */
+	struct rcu_head		 rcu_head;
 };
 
 struct ridr {
-	struct ridr_layer *top;
-	struct ridr_layer *id_free;
 	int		  layers;
-	int		  id_free_cnt;
-	spinlock_t	  lock;
+	gfp_t		  gfp_mask;
+	struct ridr_layer *top;
 };
 
-#define RIDR_INIT(name)						\
+#define RIDR_INIT(mask)						\
 {								\
-	.top		= NULL,					\
-	.id_free	= NULL,					\
 	.layers 	= 0,					\
-	.id_free_cnt	= 0,					\
-	.lock		= __SPIN_LOCK_UNLOCKED(name.lock),	\
+	.gfp_mask 	= (mask),				\
+	.top		= NULL,					\
 }
-#define DEFINE_RIDR(name)	struct ridr name = RIDR_INIT(name)
+#define DEFINE_RIDR(name, mask)	struct ridr name = RIDR_INIT(mask)
 
-#define INIT_RIDR(name)							\
+#define INIT_RIDR(name, mask)						\
 do {									\
-	(name)->top		= NULL;					\
-	(name)->id_free		= NULL;					\
 	(name)->layers		= 0;					\
-	(name)->id_free_cnt	= 0;					\
-	(name)->lock		= __SPIN_LOCK_UNLOCKED(name.lock);	\
+	(name)->gfp_mask 	= (mask);				\
+	(name)->top		= NULL;					\
 } while (0)
 
 
+/**
+ * Ridr synchronization (see radix-tree.h)
+ *
+ * ridr_find() is able to be called locklessly, using RCU. The caller must
+ * ensure calls to this function are made within rcu_read_lock() regions.
+ * Other readers (lock-free or otherwise) and modifications may be running
+ * concurrently.
+ *
+ * It is still required that the caller manage the synchronization and
+ * lifetimes of the items. So if RCU lock-free lookups are used, typically
+ * this would mean that the items have their own locks, or are amenable to
+ * lock-free access; and that the items are freed by RCU (or only freed after
+ * having been deleted from the ridr tree *and* a synchronize_rcu() grace
+ * period).
+ */
+
 /*
  * This is what we export.
  */
--


\
 
 \ /
  Last update: 2008-04-11 18:23    [from the cache]
©2003-2008