diff options
Diffstat (limited to 'include/linux/rcupdate.h')
| -rw-r--r-- | include/linux/rcupdate.h | 57 | 
1 files changed, 11 insertions, 46 deletions
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index dcd2cf1e8326..5e5f920ade90 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -27,6 +27,7 @@  #include <linux/preempt.h>  #include <linux/bottom_half.h>  #include <linux/lockdep.h> +#include <linux/cleanup.h>  #include <asm/processor.h>  #include <linux/cpumask.h>  #include <linux/context_tracking_irq.h> @@ -156,31 +157,6 @@ static inline int rcu_nocb_cpu_deoffload(int cpu) { return 0; }  static inline void rcu_nocb_flush_deferred_wakeup(void) { }  #endif /* #else #ifdef CONFIG_RCU_NOCB_CPU */ -/** - * RCU_NONIDLE - Indicate idle-loop code that needs RCU readers - * @a: Code that RCU needs to pay attention to. - * - * RCU read-side critical sections are forbidden in the inner idle loop, - * that is, between the ct_idle_enter() and the ct_idle_exit() -- RCU - * will happily ignore any such read-side critical sections.  However, - * things like powertop need tracepoints in the inner idle loop. - * - * This macro provides the way out:  RCU_NONIDLE(do_something_with_RCU()) - * will tell RCU that it needs to pay attention, invoke its argument - * (in this example, calling the do_something_with_RCU() function), - * and then tell RCU to go back to ignoring this CPU.  It is permissible - * to nest RCU_NONIDLE() wrappers, but not indefinitely (but the limit is - * on the order of a million or so, even on 32-bit systems).  It is - * not legal to block within RCU_NONIDLE(), nor is it permissible to - * transfer control either into or out of RCU_NONIDLE()'s statement. - */ -#define RCU_NONIDLE(a) \ -	do { \ -		ct_irq_enter_irqson(); \ -		do { a; } while (0); \ -		ct_irq_exit_irqson(); \ -	} while (0) -  /*   * Note a quasi-voluntary context switch for RCU-tasks's benefit.   * This is a macro rather than an inline function to avoid #include hell. @@ -957,9 +933,8 @@ static inline notrace void rcu_read_unlock_sched_notrace(void)  /**   * kfree_rcu() - kfree an object after a grace period. - * @ptr: pointer to kfree for both single- and double-argument invocations. - * @rhf: the name of the struct rcu_head within the type of @ptr, - *       but only for double-argument invocations. + * @ptr: pointer to kfree for double-argument invocations. + * @rhf: the name of the struct rcu_head within the type of @ptr.   *   * Many rcu callbacks functions just call kfree() on the base structure.   * These functions are trivial, but their size adds up, and furthermore @@ -984,26 +959,18 @@ static inline notrace void rcu_read_unlock_sched_notrace(void)   * The BUILD_BUG_ON check must not involve any function calls, hence the   * checks are done in macros here.   */ -#define kfree_rcu(ptr, rhf...) kvfree_rcu(ptr, ## rhf) +#define kfree_rcu(ptr, rhf) kvfree_rcu_arg_2(ptr, rhf) +#define kvfree_rcu(ptr, rhf) kvfree_rcu_arg_2(ptr, rhf)  /** - * kvfree_rcu() - kvfree an object after a grace period. - * - * This macro consists of one or two arguments and it is - * based on whether an object is head-less or not. If it - * has a head then a semantic stays the same as it used - * to be before: - * - *     kvfree_rcu(ptr, rhf); - * - * where @ptr is a pointer to kvfree(), @rhf is the name - * of the rcu_head structure within the type of @ptr. + * kfree_rcu_mightsleep() - kfree an object after a grace period. + * @ptr: pointer to kfree for single-argument invocations.   *   * When it comes to head-less variant, only one argument   * is passed and that is just a pointer which has to be   * freed after a grace period. Therefore the semantic is   * - *     kvfree_rcu(ptr); + *     kfree_rcu_mightsleep(ptr);   *   * where @ptr is the pointer to be freed by kvfree().   * @@ -1012,13 +979,9 @@ static inline notrace void rcu_read_unlock_sched_notrace(void)   * annotation. Otherwise, please switch and embed the   * rcu_head structure within the type of @ptr.   */ -#define kvfree_rcu(...) KVFREE_GET_MACRO(__VA_ARGS__,		\ -	kvfree_rcu_arg_2, kvfree_rcu_arg_1)(__VA_ARGS__) - +#define kfree_rcu_mightsleep(ptr) kvfree_rcu_arg_1(ptr)  #define kvfree_rcu_mightsleep(ptr) kvfree_rcu_arg_1(ptr) -#define kfree_rcu_mightsleep(ptr) kvfree_rcu_mightsleep(ptr) -#define KVFREE_GET_MACRO(_1, _2, NAME, ...) NAME  #define kvfree_rcu_arg_2(ptr, rhf)					\  do {									\  	typeof (ptr) ___p = (ptr);					\ @@ -1095,4 +1058,6 @@ rcu_head_after_call_rcu(struct rcu_head *rhp, rcu_callback_t f)  extern int rcu_expedited;  extern int rcu_normal; +DEFINE_LOCK_GUARD_0(rcu, rcu_read_lock(), rcu_read_unlock()) +  #endif /* __LINUX_RCUPDATE_H */  | 
