On Wed, Mar 13, 2024 at 2:07 AM Wang, Li <li.w...@windriver.com> wrote: > > > On 3/13/2024 10:55, Bruce Ashfield wrote: > > In message: [linux-yocto][v5.15/standard/base][PATCH] locking/rwsem: > > Disable preemption while trying for rwsem lock > > on 10/03/2024 Li Wang via lists.yoctoproject.org wrote: > > > >> From: Gokul krishna Krishnakumar <quic_gokuk...@quicinc.com> > >> > >> commit 48dfb5d2560d36fb16c7d430c229d1604ea7d185 upstream > >> > >> Make the region inside the rwsem_write_trylock non preemptible. > >> > >> We observe RT task is hogging CPU when trying to acquire rwsem lock > >> which was acquired by a kworker task but before the rwsem owner was set. > >> > >> Here is the scenario: > >> 1. CFS task (affined to a particular CPU) takes rwsem lock. > >> > >> 2. CFS task gets preempted by a RT task before setting owner. > >> > >> 3. RT task (FIFO) is trying to acquire the lock, but spinning until > >> RT throttling happens for the lock as the lock was taken by CFS task. > >> > >> This patch attempts to fix the above issue by disabling preemption > >> until owner is set for the lock. While at it also fix the issues > >> at the places where rwsem_{set,clear}_owner() are called. > >> > >> This also adds lockdep annotation of preemption disable in > >> rwsem_{set,clear}_owner() on Peter Z. suggestion. > > Any thoughts on why this hasn't been picked up by -stable ? > > submitter want the patch into linux stable 5.10, but miss the receiver > mail of stable. > > we will wait the reply from the maintainer of stable: > > https://lore.kernel.org/all/b92644e5-529b-4403-aba7-d316262cc...@redhat.com/ >
Perfect! I'll do the merge now as well, since any conflicts will be easy to handle. I just wanted to be sure that we let -stable know (we've done our best, whether it makes -stable or not :) Bruce > Thanks, > LiWang. > > > > > Bruce > > > >> Signed-off-by: Gokul krishna Krishnakumar <quic_gokuk...@quicinc.com> > >> Signed-off-by: Mukesh Ojha <quic_mo...@quicinc.com> > >> Signed-off-by: Peter Zijlstra (Intel) <pet...@infradead.org> > >> Reviewed-by: Waiman Long <long...@redhat.com> > >> Link: > >> https://lore.kernel.org/r/1662661467-24203-1-git-send-email-quic_mo...@quicinc.com > >> Signed-off-by: Beniamin Sandu <beniamin.sa...@windriver.com> > >> Signed-off-by: Li Wang <li.w...@windriver.com> > >> --- > >> kernel/locking/rwsem.c | 14 ++++++++++++-- > >> 1 file changed, 12 insertions(+), 2 deletions(-) > >> > >> diff --git a/kernel/locking/rwsem.c b/kernel/locking/rwsem.c > >> index f0287a16b4ec..4a38d32b89fa 100644 > >> --- a/kernel/locking/rwsem.c > >> +++ b/kernel/locking/rwsem.c > >> @@ -133,14 +133,19 @@ > >> * the owner value concurrently without lock. Read from owner, however, > >> * may not need READ_ONCE() as long as the pointer value is only used > >> * for comparison and isn't being dereferenced. > >> + * > >> + * Both rwsem_{set,clear}_owner() functions should be in the same > >> + * preempt disable section as the atomic op that changes sem->count. > >> */ > >> static inline void rwsem_set_owner(struct rw_semaphore *sem) > >> { > >> + lockdep_assert_preemption_disabled(); > >> atomic_long_set(&sem->owner, (long)current); > >> } > >> > >> static inline void rwsem_clear_owner(struct rw_semaphore *sem) > >> { > >> + lockdep_assert_preemption_disabled(); > >> atomic_long_set(&sem->owner, 0); > >> } > >> > >> @@ -251,13 +256,16 @@ static inline bool rwsem_read_trylock(struct > >> rw_semaphore *sem, long *cntp) > >> static inline bool rwsem_write_trylock(struct rw_semaphore *sem) > >> { > >> long tmp = RWSEM_UNLOCKED_VALUE; > >> + bool ret = false; > >> > >> + preempt_disable(); > >> if (atomic_long_try_cmpxchg_acquire(&sem->count, &tmp, > >> RWSEM_WRITER_LOCKED)) { > >> rwsem_set_owner(sem); > >> - return true; > >> + ret = true; > >> } > >> > >> - return false; > >> + preempt_enable(); > >> + return ret; > >> } > >> > >> /* > >> @@ -1341,8 +1349,10 @@ static inline void __up_write(struct rw_semaphore > >> *sem) > >> DEBUG_RWSEMS_WARN_ON((rwsem_owner(sem) != current) && > >> !rwsem_test_oflags(sem, RWSEM_NONSPINNABLE), sem); > >> > >> + preempt_disable(); > >> rwsem_clear_owner(sem); > >> tmp = atomic_long_fetch_add_release(-RWSEM_WRITER_LOCKED, > >> &sem->count); > >> + preempt_enable(); > >> if (unlikely(tmp & RWSEM_FLAG_WAITERS)) > >> rwsem_wake(sem); > >> } > >> -- > >> 2.25.1 > >> > >> > >> -- - Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end - "Use the force Harry" - Gandalf, Star Trek II
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#13683): https://lists.yoctoproject.org/g/linux-yocto/message/13683 Mute This Topic: https://lists.yoctoproject.org/mt/104857955/21656 Group Owner: linux-yocto+ow...@lists.yoctoproject.org Unsubscribe: https://lists.yoctoproject.org/g/linux-yocto/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-