]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - include/linux/rcu_sync.h
Merge tag 'm68k-for-v5.3-tag2' of git://git.kernel.org/pub/scm/linux/kernel/git/geert...
[linux.git] / include / linux / rcu_sync.h
index 6fc53a1345b305117b566caf6a248e44cd113d6c..9b83865d24f9e6209838fd25fa9f9ed7ff38e230 100644 (file)
 #include <linux/wait.h>
 #include <linux/rcupdate.h>
 
-enum rcu_sync_type { RCU_SYNC, RCU_SCHED_SYNC, RCU_BH_SYNC };
-
 /* Structure to mediate between updaters and fastpath-using readers.  */
 struct rcu_sync {
        int                     gp_state;
        int                     gp_count;
        wait_queue_head_t       gp_wait;
 
-       int                     cb_state;
        struct rcu_head         cb_head;
-
-       enum rcu_sync_type      gp_type;
 };
 
-extern void rcu_sync_lockdep_assert(struct rcu_sync *);
-
 /**
  * rcu_sync_is_idle() - Are readers permitted to use their fastpaths?
  * @rsp: Pointer to rcu_sync structure to use for synchronization
  *
- * Returns true if readers are permitted to use their fastpaths.
- * Must be invoked within an RCU read-side critical section whose
- * flavor matches that of the rcu_sync struture.
+ * Returns true if readers are permitted to use their fastpaths.  Must be
+ * invoked within some flavor of RCU read-side critical section.
  */
 static inline bool rcu_sync_is_idle(struct rcu_sync *rsp)
 {
-#ifdef CONFIG_PROVE_RCU
-       rcu_sync_lockdep_assert(rsp);
-#endif
-       return !rsp->gp_state; /* GP_IDLE */
+       RCU_LOCKDEP_WARN(!rcu_read_lock_held() &&
+                        !rcu_read_lock_bh_held() &&
+                        !rcu_read_lock_sched_held(),
+                        "suspicious rcu_sync_is_idle() usage");
+       return !READ_ONCE(rsp->gp_state); /* GP_IDLE */
 }
 
-extern void rcu_sync_init(struct rcu_sync *, enum rcu_sync_type);
+extern void rcu_sync_init(struct rcu_sync *);
 extern void rcu_sync_enter_start(struct rcu_sync *);
 extern void rcu_sync_enter(struct rcu_sync *);
 extern void rcu_sync_exit(struct rcu_sync *);
 extern void rcu_sync_dtor(struct rcu_sync *);
 
-#define __RCU_SYNC_INITIALIZER(name, type) {                           \
+#define __RCU_SYNC_INITIALIZER(name) {                                 \
                .gp_state = 0,                                          \
                .gp_count = 0,                                          \
                .gp_wait = __WAIT_QUEUE_HEAD_INITIALIZER(name.gp_wait), \
-               .cb_state = 0,                                          \
-               .gp_type = type,                                        \
        }
 
-#define        __DEFINE_RCU_SYNC(name, type)   \
-       struct rcu_sync_struct name = __RCU_SYNC_INITIALIZER(name, type)
-
-#define DEFINE_RCU_SYNC(name)          \
-       __DEFINE_RCU_SYNC(name, RCU_SYNC)
-
-#define DEFINE_RCU_SCHED_SYNC(name)    \
-       __DEFINE_RCU_SYNC(name, RCU_SCHED_SYNC)
-
-#define DEFINE_RCU_BH_SYNC(name)       \
-       __DEFINE_RCU_SYNC(name, RCU_BH_SYNC)
+#define        DEFINE_RCU_SYNC(name)   \
+       struct rcu_sync name = __RCU_SYNC_INITIALIZER(name)
 
 #endif /* _LINUX_RCU_SYNC_H_ */