rcu: Make rcu_sleep_check() also check rcu_lock_map
Although it is OK to be preempted in an RCU read-side critical section for TREE_PREEMPT_RCU, it is definitely not OK to be preempted, block, or might_sleep() within an RCU read-side critical section for TREE_RCU. Unfortunately, rcu_might_sleep() currently only checks for RCU-bh and RCU-sched read-side critical sections. This commit therefore makes rcu_might_sleep() check for RCU read-side critical sections, but only in TREE_RCU builds. Signed-off-by: Paul E. McKenney <paul.mckenney@linaro.org> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
This commit is contained in:
parent
c44e2cddac
commit
50406b98b6
|
@ -381,8 +381,22 @@ extern int rcu_my_thread_group_empty(void);
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#if defined(CONFIG_PROVE_RCU) && !defined(CONFIG_PREEMPT_RCU)
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
#else /* #ifdef CONFIG_PROVE_RCU */
|
||||||
|
static inline void rcu_preempt_sleep_check(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif /* #else #ifdef CONFIG_PROVE_RCU */
|
||||||
|
|
||||||
#define rcu_sleep_check() \
|
#define rcu_sleep_check() \
|
||||||
do { \
|
do { \
|
||||||
|
rcu_preempt_sleep_check(); \
|
||||||
rcu_lockdep_assert(!lock_is_held(&rcu_bh_lock_map), \
|
rcu_lockdep_assert(!lock_is_held(&rcu_bh_lock_map), \
|
||||||
"Illegal context switch in RCU-bh" \
|
"Illegal context switch in RCU-bh" \
|
||||||
" read-side critical section"); \
|
" read-side critical section"); \
|
||||||
|
|
Loading…
Reference in New Issue