diff options
Diffstat (limited to 'features/rt/locking-Make-spinlock_t-and-rwlock_t-a-RCU-section-o.patch')
-rw-r--r-- | features/rt/locking-Make-spinlock_t-and-rwlock_t-a-RCU-section-o.patch | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/features/rt/locking-Make-spinlock_t-and-rwlock_t-a-RCU-section-o.patch b/features/rt/locking-Make-spinlock_t-and-rwlock_t-a-RCU-section-o.patch new file mode 100644 index 00000000..665a4bb1 --- /dev/null +++ b/features/rt/locking-Make-spinlock_t-and-rwlock_t-a-RCU-section-o.patch @@ -0,0 +1,125 @@ +From 634b7dbcbf43a51f9c149ff014b99cf95ec798d6 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> +Date: Tue, 19 Nov 2019 09:25:04 +0100 +Subject: [PATCH 131/191] locking: Make spinlock_t and rwlock_t a RCU section + on RT + +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 <bigeasy@linutronix.de> +--- + kernel/locking/rtmutex.c | 6 ++++++ + kernel/locking/rwlock-rt.c | 6 ++++++ + 2 files changed, 12 insertions(+) + +diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c +index 4cd9d6c4cd68..d4da971759fb 100644 +--- a/kernel/locking/rtmutex.c ++++ b/kernel/locking/rtmutex.c +@@ -1118,6 +1118,7 @@ void __lockfunc rt_spin_lock(spinlock_t *lock) + { + spin_acquire(&lock->dep_map, 0, 0, _RET_IP_); + rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock); ++ rcu_read_lock(); + migrate_disable(); + } + EXPORT_SYMBOL(rt_spin_lock); +@@ -1132,6 +1133,7 @@ void __lockfunc rt_spin_lock_nested(spinlock_t *lock, int subclass) + { + spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_); + rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock); ++ rcu_read_lock(); + migrate_disable(); + } + EXPORT_SYMBOL(rt_spin_lock_nested); +@@ -1141,6 +1143,7 @@ void __lockfunc rt_spin_lock_nest_lock(spinlock_t *lock, + { + spin_acquire_nest(&lock->dep_map, 0, 0, nest_lock, _RET_IP_); + rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock); ++ rcu_read_lock(); + migrate_disable(); + } + EXPORT_SYMBOL(rt_spin_lock_nest_lock); +@@ -1151,6 +1154,7 @@ void __lockfunc rt_spin_unlock(spinlock_t *lock) + /* NOTE: we always pass in '1' for nested, for simplicity */ + spin_release(&lock->dep_map, _RET_IP_); + migrate_enable(); ++ rcu_read_unlock(); + rt_spin_lock_fastunlock(&lock->lock, rt_spin_lock_slowunlock); + } + EXPORT_SYMBOL(rt_spin_unlock); +@@ -1180,6 +1184,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(); + migrate_disable(); + } + return ret; +@@ -1194,6 +1199,7 @@ int __lockfunc rt_spin_trylock_bh(spinlock_t *lock) + ret = __rt_mutex_trylock(&lock->lock); + if (ret) { + spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); ++ rcu_read_lock(); + migrate_disable(); + } else { + local_bh_enable(); +diff --git a/kernel/locking/rwlock-rt.c b/kernel/locking/rwlock-rt.c +index 948d10214ee2..cc8bc2ef4ba2 100644 +--- a/kernel/locking/rwlock-rt.c ++++ b/kernel/locking/rwlock-rt.c +@@ -270,6 +270,7 @@ int __lockfunc rt_read_trylock(rwlock_t *rwlock) + ret = __read_rt_trylock(rwlock); + if (ret) { + rwlock_acquire_read(&rwlock->dep_map, 0, 1, _RET_IP_); ++ rcu_read_lock(); + migrate_disable(); + } + return ret; +@@ -283,6 +284,7 @@ int __lockfunc rt_write_trylock(rwlock_t *rwlock) + ret = __write_rt_trylock(rwlock); + if (ret) { + rwlock_acquire(&rwlock->dep_map, 0, 1, _RET_IP_); ++ rcu_read_lock(); + migrate_disable(); + } + return ret; +@@ -293,6 +295,7 @@ void __lockfunc rt_read_lock(rwlock_t *rwlock) + { + rwlock_acquire_read(&rwlock->dep_map, 0, 0, _RET_IP_); + __read_rt_lock(rwlock); ++ rcu_read_lock(); + migrate_disable(); + } + EXPORT_SYMBOL(rt_read_lock); +@@ -301,6 +304,7 @@ void __lockfunc rt_write_lock(rwlock_t *rwlock) + { + rwlock_acquire(&rwlock->dep_map, 0, 0, _RET_IP_); + __write_rt_lock(rwlock); ++ rcu_read_lock(); + migrate_disable(); + } + EXPORT_SYMBOL(rt_write_lock); +@@ -309,6 +313,7 @@ void __lockfunc rt_read_unlock(rwlock_t *rwlock) + { + rwlock_release(&rwlock->dep_map, _RET_IP_); + migrate_enable(); ++ rcu_read_unlock(); + __read_rt_unlock(rwlock); + } + EXPORT_SYMBOL(rt_read_unlock); +@@ -317,6 +322,7 @@ void __lockfunc rt_write_unlock(rwlock_t *rwlock) + { + rwlock_release(&rwlock->dep_map, _RET_IP_); + migrate_enable(); ++ rcu_read_unlock(); + __write_rt_unlock(rwlock); + } + EXPORT_SYMBOL(rt_write_unlock); +-- +2.19.1 + |