srcu: Use rcu_segcblist to track SRCU callbacks
[linux-2.6-block.git] / include / linux / srcu.h
index 047ac8c28a4e2b9207e78ede1a3d15be2c263c68..ad154a7bc114f7c216a509c0498fc483d6f64c4d 100644 (file)
@@ -22,7 +22,7 @@
  *        Lai Jiangshan <laijs@cn.fujitsu.com>
  *
  * For detailed explanation of Read-Copy Update mechanism see -
- *             Documentation/RCU/ *.txt
+ *             Documentation/RCU/ *.txt
  *
  */
 
 #include <linux/mutex.h>
 #include <linux/rcupdate.h>
 #include <linux/workqueue.h>
+#include <linux/rcu_segcblist.h>
 
 struct srcu_array {
        unsigned long lock_count[2];
        unsigned long unlock_count[2];
 };
 
-struct rcu_batch {
-       struct rcu_head *head, **tail;
-};
-
-#define RCU_BATCH_INIT(name) { NULL, &(name.head) }
-
 struct srcu_struct {
        unsigned long completed;
        unsigned long srcu_gp_seq;
        struct srcu_array __percpu *per_cpu_ref;
-       spinlock_t queue_lock; /* protect ->batch_queue, ->running */
+       spinlock_t queue_lock; /* protect ->srcu_cblist, ->srcu_state */
        int srcu_state;
-       /* callbacks just queued */
-       struct rcu_batch batch_queue;
-       /* callbacks try to do the first check_zero */
-       struct rcu_batch batch_check0;
-       /* callbacks done with the first check_zero and the flip */
-       struct rcu_batch batch_check1;
-       struct rcu_batch batch_done;
+       struct rcu_segcblist srcu_cblist;
        struct delayed_work work;
 #ifdef CONFIG_DEBUG_LOCK_ALLOC
        struct lockdep_map dep_map;
@@ -97,10 +86,7 @@ void process_srcu(struct work_struct *work);
                .per_cpu_ref = &name##_srcu_array,                      \
                .queue_lock = __SPIN_LOCK_UNLOCKED(name.queue_lock),    \
                .srcu_state = SRCU_STATE_IDLE,                          \
-               .batch_queue = RCU_BATCH_INIT(name.batch_queue),        \
-               .batch_check0 = RCU_BATCH_INIT(name.batch_check0),      \
-               .batch_check1 = RCU_BATCH_INIT(name.batch_check1),      \
-               .batch_done = RCU_BATCH_INIT(name.batch_done),          \
+               .srcu_cblist = RCU_SEGCBLIST_INITIALIZER(name.srcu_cblist),\
                .work = __DELAYED_WORK_INITIALIZER(name.work, process_srcu, 0),\
                __SRCU_DEP_MAP_INIT(name)                               \
        }