From: Sebastian Andrzej Siewior <[email protected]>

commit 84440022a0e1c8c936d61f8f97593674a295d409 in linux-rt-devel.

On !RT a locked spinlock_t and rwlock_t disables preemption which
implies a RCU read section. There is code that relies on that behaviour.

Add an explicit RCU read section on RT while a sleeping lock (a lock
which would disables preemption on !RT) acquired.

Signed-off-by: Sebastian Andrzej Siewior <[email protected]>
Signed-off-by: Paul Gortmaker <[email protected]>

diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c
index bb5c09c49c50..ba4b151bf451 100644
--- a/kernel/locking/rtmutex.c
+++ b/kernel/locking/rtmutex.c
@@ -1143,6 +1143,7 @@ void __sched rt_spin_lock_slowunlock(struct rt_mutex 
*lock)
 void __lockfunc rt_spin_lock(spinlock_t *lock)
 {
        sleeping_lock_inc();
+       rcu_read_lock();
        migrate_disable();
        spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
        rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock);
@@ -1158,6 +1159,7 @@ void __lockfunc __rt_spin_lock(struct rt_mutex *lock)
 void __lockfunc rt_spin_lock_nested(spinlock_t *lock, int subclass)
 {
        sleeping_lock_inc();
+       rcu_read_lock();
        migrate_disable();
        spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_);
        rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock);
@@ -1171,6 +1173,7 @@ void __lockfunc rt_spin_unlock(spinlock_t *lock)
        spin_release(&lock->dep_map, 1, _RET_IP_);
        rt_spin_lock_fastunlock(&lock->lock, rt_spin_lock_slowunlock);
        migrate_enable();
+       rcu_read_unlock();
        sleeping_lock_dec();
 }
 EXPORT_SYMBOL(rt_spin_unlock);
@@ -1202,6 +1205,7 @@ int __lockfunc rt_spin_trylock(spinlock_t *lock)
        ret = __rt_mutex_trylock(&lock->lock);
        if (ret) {
                spin_acquire(&lock->dep_map, 0, 1, _RET_IP_);
+               rcu_read_lock();
        } else {
                migrate_enable();
                sleeping_lock_dec();
@@ -1218,6 +1222,7 @@ int __lockfunc rt_spin_trylock_bh(spinlock_t *lock)
        ret = __rt_mutex_trylock(&lock->lock);
        if (ret) {
                sleeping_lock_inc();
+               rcu_read_lock();
                migrate_disable();
                spin_acquire(&lock->dep_map, 0, 1, _RET_IP_);
        } else
@@ -1234,6 +1239,7 @@ int __lockfunc rt_spin_trylock_irqsave(spinlock_t *lock, 
unsigned long *flags)
        ret = __rt_mutex_trylock(&lock->lock);
        if (ret) {
                sleeping_lock_inc();
+               rcu_read_lock();
                migrate_disable();
                spin_acquire(&lock->dep_map, 0, 1, _RET_IP_);
        }
diff --git a/kernel/locking/rwlock-rt.c b/kernel/locking/rwlock-rt.c
index c3b91205161c..0ae8c62ea832 100644
--- a/kernel/locking/rwlock-rt.c
+++ b/kernel/locking/rwlock-rt.c
@@ -310,6 +310,7 @@ int __lockfunc rt_read_trylock(rwlock_t *rwlock)
        ret = do_read_rt_trylock(rwlock);
        if (ret) {
                rwlock_acquire_read(&rwlock->dep_map, 0, 1, _RET_IP_);
+               rcu_read_lock();
        } else {
                migrate_enable();
                sleeping_lock_dec();
@@ -327,6 +328,7 @@ int __lockfunc rt_write_trylock(rwlock_t *rwlock)
        ret = do_write_rt_trylock(rwlock);
        if (ret) {
                rwlock_acquire(&rwlock->dep_map, 0, 1, _RET_IP_);
+               rcu_read_lock();
        } else {
                migrate_enable();
                sleeping_lock_dec();
@@ -338,6 +340,7 @@ EXPORT_SYMBOL(rt_write_trylock);
 void __lockfunc rt_read_lock(rwlock_t *rwlock)
 {
        sleeping_lock_inc();
+       rcu_read_lock();
        migrate_disable();
        rwlock_acquire_read(&rwlock->dep_map, 0, 0, _RET_IP_);
        do_read_rt_lock(rwlock);
@@ -347,6 +350,7 @@ EXPORT_SYMBOL(rt_read_lock);
 void __lockfunc rt_write_lock(rwlock_t *rwlock)
 {
        sleeping_lock_inc();
+       rcu_read_lock();
        migrate_disable();
        rwlock_acquire(&rwlock->dep_map, 0, 0, _RET_IP_);
        do_write_rt_lock(rwlock);
@@ -358,6 +362,7 @@ void __lockfunc rt_read_unlock(rwlock_t *rwlock)
        rwlock_release(&rwlock->dep_map, 1, _RET_IP_);
        do_read_rt_unlock(rwlock);
        migrate_enable();
+       rcu_read_unlock();
        sleeping_lock_dec();
 }
 EXPORT_SYMBOL(rt_read_unlock);
@@ -367,6 +372,7 @@ void __lockfunc rt_write_unlock(rwlock_t *rwlock)
        rwlock_release(&rwlock->dep_map, 1, _RET_IP_);
        do_write_rt_unlock(rwlock);
        migrate_enable();
+       rcu_read_unlock();
        sleeping_lock_dec();
 }
 EXPORT_SYMBOL(rt_write_unlock);
-- 
2.7.4

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.

View/Reply Online (#8683): 
https://lists.yoctoproject.org/g/linux-yocto/message/8683
Mute This Topic: https://lists.yoctoproject.org/mt/74330104/21656
Group Owner: [email protected]
Unsubscribe: https://lists.yoctoproject.org/g/linux-yocto/unsub  
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to