diff options
-rw-r--r-- | kernel/locking/spinlock_rt.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/kernel/locking/spinlock_rt.c b/kernel/locking/spinlock_rt.c index 839041f8460f..1d1e85e31738 100644 --- a/kernel/locking/spinlock_rt.c +++ b/kernel/locking/spinlock_rt.c @@ -24,6 +24,14 @@ #define RT_MUTEX_BUILD_SPINLOCKS #include "rtmutex.c" +/* + * Use ___might_sleep() which skips the state check and take RCU nesting + * into account as spin/read/write_lock() can legitimately nest into an RCU + * read side critical section: + */ +#define rtlock_might_sleep() \ + ___might_sleep(__FILE__, __LINE__, rcu_preempt_depth()) + static __always_inline void rtlock_lock(struct rt_mutex_base *rtm) { if (unlikely(!rt_mutex_cmpxchg_acquire(rtm, NULL, current))) @@ -32,7 +40,7 @@ static __always_inline void rtlock_lock(struct rt_mutex_base *rtm) static __always_inline void __rt_spin_lock(spinlock_t *lock) { - ___might_sleep(__FILE__, __LINE__, 0); + rtlock_might_sleep(); rtlock_lock(&lock->lock); rcu_read_lock(); migrate_disable(); @@ -210,7 +218,7 @@ EXPORT_SYMBOL(rt_write_trylock); void __sched rt_read_lock(rwlock_t *rwlock) { - ___might_sleep(__FILE__, __LINE__, 0); + rtlock_might_sleep(); rwlock_acquire_read(&rwlock->dep_map, 0, 0, _RET_IP_); rwbase_read_lock(&rwlock->rwbase, TASK_RTLOCK_WAIT); rcu_read_lock(); @@ -220,7 +228,7 @@ EXPORT_SYMBOL(rt_read_lock); void __sched rt_write_lock(rwlock_t *rwlock) { - ___might_sleep(__FILE__, __LINE__, 0); + rtlock_might_sleep(); rwlock_acquire(&rwlock->dep_map, 0, 0, _RET_IP_); rwbase_write_lock(&rwlock->rwbase, TASK_RTLOCK_WAIT); rcu_read_lock(); |