Messages in this thread | | | Date | Fri, 30 Sep 2022 10:17:32 +0530 | Subject | Re: [PATCH] locking/rwsem: Prevent non-first waiter from spinning in down_write() slowpath | From | Mukesh Ojha <> |
| |
Hi,
On 9/29/2022 11:36 PM, Waiman Long wrote: > On 9/29/22 14:04, Waiman Long wrote: >> A non-first waiter can potentially spin in the for loop of >> rwsem_down_write_slowpath() without sleeping but fail to acquire the >> lock even if the rwsem is free if the following sequence happens: >> >> Non-first waiter First waiter Lock holder >> ---------------- ------------ ----------- >> Acquire wait_lock >> rwsem_try_write_lock(): >> Set handoff bit if RT or >> wait too long >> Set waiter->handoff_set >> Release wait_lock >> Acquire wait_lock >> Inherit waiter->handoff_set >> Release wait_lock >> Clear owner >> Release lock >> if (waiter.handoff_set) { >> rwsem_spin_on_owner((); >> if (OWNER_NULL) >> goto trylock_again; >> } >> trylock_again: >> Acquire wait_lock >> rwsem_try_write_lock(): >> if (first->handoff_set && (waiter != first)) >> return false; >> Release wait_lock >> >> It is especially problematic if the non-first waiter is an RT task and >> it is running on the same CPU as the first waiter as this can lead to >> live lock. >> >> Fixes: d257cc8cb8d5 ("locking/rwsem: Make handoff bit handling more >> consistent") >> Signed-off-by: Waiman Long <longman@redhat.com> >> --- >> kernel/locking/rwsem.c | 13 ++++++++++--- >> 1 file changed, 10 insertions(+), 3 deletions(-) > > Mukesh, can you test if this patch can fix the RT task lockup problem?
I will come back with the result.
Thank you.
> > Thanks, > Longman >
| |