diff options
Diffstat (limited to 'include/linux/rcupdate.h')
| -rw-r--r-- | include/linux/rcupdate.h | 50 | 
1 files changed, 32 insertions, 18 deletions
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index db266bbed23f..b653b4aaa8a6 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -56,8 +56,6 @@ struct rcu_head {  };  /* Exported common interfaces */ -extern void synchronize_rcu_bh(void); -extern void synchronize_sched(void);  extern void rcu_barrier(void);  extern void rcu_barrier_bh(void);  extern void rcu_barrier_sched(void); @@ -66,8 +64,6 @@ extern int sched_expedited_torture_stats(char *page);  /* Internal to kernel */  extern void rcu_init(void); -extern int rcu_scheduler_active; -extern void rcu_scheduler_starting(void);  #if defined(CONFIG_TREE_RCU) || defined(CONFIG_TREE_PREEMPT_RCU)  #include <linux/rcutree.h> @@ -83,6 +79,14 @@ extern void rcu_scheduler_starting(void);         (ptr)->next = NULL; (ptr)->func = NULL; \  } while (0) +static inline void init_rcu_head_on_stack(struct rcu_head *head) +{ +} + +static inline void destroy_rcu_head_on_stack(struct rcu_head *head) +{ +} +  #ifdef CONFIG_DEBUG_LOCK_ALLOC  extern struct lockdep_map rcu_lock_map; @@ -106,12 +110,13 @@ extern int debug_lockdep_rcu_enabled(void);  /**   * rcu_read_lock_held - might we be in RCU read-side critical section?   * - * If CONFIG_PROVE_LOCKING is selected and enabled, returns nonzero iff in - * an RCU read-side critical section.  In absence of CONFIG_PROVE_LOCKING, + * If CONFIG_DEBUG_LOCK_ALLOC is selected, returns nonzero iff in an RCU + * read-side critical section.  In absence of CONFIG_DEBUG_LOCK_ALLOC,   * this assumes we are in an RCU read-side critical section unless it can   * prove otherwise.   * - * Check rcu_scheduler_active to prevent false positives during boot. + * Check debug_lockdep_rcu_enabled() to prevent false positives during boot + * and while lockdep is disabled.   */  static inline int rcu_read_lock_held(void)  { @@ -129,13 +134,15 @@ extern int rcu_read_lock_bh_held(void);  /**   * rcu_read_lock_sched_held - might we be in RCU-sched read-side critical section?   * - * If CONFIG_PROVE_LOCKING is selected and enabled, returns nonzero iff in an - * RCU-sched read-side critical section.  In absence of CONFIG_PROVE_LOCKING, - * this assumes we are in an RCU-sched read-side critical section unless it - * can prove otherwise.  Note that disabling of preemption (including - * disabling irqs) counts as an RCU-sched read-side critical section. + * If CONFIG_DEBUG_LOCK_ALLOC is selected, returns nonzero iff in an + * RCU-sched read-side critical section.  In absence of + * CONFIG_DEBUG_LOCK_ALLOC, this assumes we are in an RCU-sched read-side + * critical section unless it can prove otherwise.  Note that disabling + * of preemption (including disabling irqs) counts as an RCU-sched + * read-side critical section.   * - * Check rcu_scheduler_active to prevent false positives during boot. + * Check debug_lockdep_rcu_enabled() to prevent false positives during boot + * and while lockdep is disabled.   */  #ifdef CONFIG_PREEMPT  static inline int rcu_read_lock_sched_held(void) @@ -177,7 +184,7 @@ static inline int rcu_read_lock_bh_held(void)  #ifdef CONFIG_PREEMPT  static inline int rcu_read_lock_sched_held(void)  { -	return !rcu_scheduler_active || preempt_count() != 0 || irqs_disabled(); +	return preempt_count() != 0 || irqs_disabled();  }  #else /* #ifdef CONFIG_PREEMPT */  static inline int rcu_read_lock_sched_held(void) @@ -192,6 +199,15 @@ static inline int rcu_read_lock_sched_held(void)  extern int rcu_my_thread_group_empty(void); +#define __do_rcu_dereference_check(c)					\ +	do {								\ +		static bool __warned;					\ +		if (debug_lockdep_rcu_enabled() && !__warned && !(c)) {	\ +			__warned = true;				\ +			lockdep_rcu_dereference(__FILE__, __LINE__);	\ +		}							\ +	} while (0) +  /**   * rcu_dereference_check - rcu_dereference with debug checking   * @p: The pointer to read, prior to dereferencing @@ -221,8 +237,7 @@ extern int rcu_my_thread_group_empty(void);   */  #define rcu_dereference_check(p, c) \  	({ \ -		if (debug_lockdep_rcu_enabled() && !(c)) \ -			lockdep_rcu_dereference(__FILE__, __LINE__); \ +		__do_rcu_dereference_check(c); \  		rcu_dereference_raw(p); \  	}) @@ -239,8 +254,7 @@ extern int rcu_my_thread_group_empty(void);   */  #define rcu_dereference_protected(p, c) \  	({ \ -		if (debug_lockdep_rcu_enabled() && !(c)) \ -			lockdep_rcu_dereference(__FILE__, __LINE__); \ +		__do_rcu_dereference_check(c); \  		(p); \  	})  |