[PATCH 02/13] Change ridr structure

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Nadia.Derbey
Date: Friday, April 11, 2008 - 9:17 am

[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.
  */

--
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 02/13] Change ridr structure, Nadia.Derbey, (Fri Apr 11, 9:17 am)