diff options
Diffstat (limited to 'include/linux/rcupdate.h')
| -rw-r--r-- | include/linux/rcupdate.h | 53 | 
1 files changed, 20 insertions, 33 deletions
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 9cac722b169..115ead2b515 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -147,6 +147,7 @@ extern void synchronize_sched(void);  extern void __rcu_read_lock(void);  extern void __rcu_read_unlock(void); +extern void rcu_read_unlock_special(struct task_struct *t);  void synchronize_rcu(void);  /* @@ -255,6 +256,10 @@ static inline void destroy_rcu_head_on_stack(struct rcu_head *head)  }  #endif	/* #else !CONFIG_DEBUG_OBJECTS_RCU_HEAD */ +#if defined(CONFIG_DEBUG_LOCK_ALLOC) || defined(CONFIG_SMP) +extern int rcu_is_cpu_idle(void); +#endif /* #if defined(CONFIG_DEBUG_LOCK_ALLOC) || defined(CONFIG_SMP) */ +  #if defined(CONFIG_HOTPLUG_CPU) && defined(CONFIG_PROVE_RCU)  bool rcu_lockdep_current_cpu_online(void);  #else /* #if defined(CONFIG_HOTPLUG_CPU) && defined(CONFIG_PROVE_RCU) */ @@ -266,15 +271,6 @@ static inline bool rcu_lockdep_current_cpu_online(void)  #ifdef CONFIG_DEBUG_LOCK_ALLOC -#ifdef CONFIG_PROVE_RCU -extern int rcu_is_cpu_idle(void); -#else /* !CONFIG_PROVE_RCU */ -static inline int rcu_is_cpu_idle(void) -{ -	return 0; -} -#endif /* else !CONFIG_PROVE_RCU */ -  static inline void rcu_lock_acquire(struct lockdep_map *map)  {  	lock_acquire(map, 0, 0, 2, 1, NULL, _THIS_IP_); @@ -431,8 +427,7 @@ extern int rcu_my_thread_group_empty(void);  static inline void rcu_preempt_sleep_check(void)  {  	rcu_lockdep_assert(!lock_is_held(&rcu_lock_map), -			   "Illegal context switch in RCU read-side " -			   "critical section"); +			   "Illegal context switch in RCU read-side critical section");  }  #else /* #ifdef CONFIG_PROVE_RCU */  static inline void rcu_preempt_sleep_check(void) @@ -513,10 +508,10 @@ static inline void rcu_preempt_sleep_check(void)  		(_________p1); \  	})  #define __rcu_assign_pointer(p, v, space) \ -	({ \ +	do { \  		smp_wmb(); \  		(p) = (typeof(*v) __force space *)(v); \ -	}) +	} while (0)  /** @@ -851,7 +846,7 @@ static inline notrace void rcu_read_unlock_sched_notrace(void)   *   * Assigns the specified value to the specified RCU-protected   * pointer, ensuring that any concurrent RCU readers will see - * any prior initialization.  Returns the value assigned. + * any prior initialization.   *   * Inserts memory barriers on architectures that require them   * (which is most of them), and also prevents the compiler from @@ -903,25 +898,17 @@ static inline notrace void rcu_read_unlock_sched_notrace(void)   * the reader-accessible portions of the linked structure.   */  #define RCU_INIT_POINTER(p, v) \ -		p = (typeof(*v) __force __rcu *)(v) - -static __always_inline bool __is_kfree_rcu_offset(unsigned long offset) -{ -	return offset < 4096; -} - -static __always_inline -void __kfree_rcu(struct rcu_head *head, unsigned long offset) -{ -	typedef void (*rcu_callback)(struct rcu_head *); - -	BUILD_BUG_ON(!__builtin_constant_p(offset)); - -	/* See the kfree_rcu() header comment. */ -	BUILD_BUG_ON(!__is_kfree_rcu_offset(offset)); +	do { \ +		p = (typeof(*v) __force __rcu *)(v); \ +	} while (0) -	kfree_call_rcu(head, (rcu_callback)offset); -} +/** + * RCU_POINTER_INITIALIZER() - statically initialize an RCU protected pointer + * + * GCC-style initialization for an RCU-protected pointer in a structure field. + */ +#define RCU_POINTER_INITIALIZER(p, v) \ +		.p = (typeof(*v) __force __rcu *)(v)  /*   * Does the specified offset indicate that the corresponding rcu_head @@ -935,7 +922,7 @@ void __kfree_rcu(struct rcu_head *head, unsigned long offset)  #define __kfree_rcu(head, offset) \  	do { \  		BUILD_BUG_ON(!__is_kfree_rcu_offset(offset)); \ -		call_rcu(head, (void (*)(struct rcu_head *))(unsigned long)(offset)); \ +		kfree_call_rcu(head, (void (*)(struct rcu_head *))(unsigned long)(offset)); \  	} while (0)  /**  |