]> git.baikalelectronics.ru Git - kernel.git/commit
locking/rwsem: Allow slowpath writer to ignore handoff bit if not set by first waiter
authorWaiman Long <longman@redhat.com>
Wed, 22 Jun 2022 20:04:19 +0000 (16:04 -0400)
committerPeter Zijlstra <peterz@infradead.org>
Sat, 30 Jul 2022 08:58:28 +0000 (10:58 +0200)
commitd2d84512c5aea38d8043a92e4a0b14854e28e0a0
treeecb5fd0a4bb1de91b66c83b2a74ecdb5247175f0
parentb7eabeb88edc837581d3d6c77c88f187f9f53a86
locking/rwsem: Allow slowpath writer to ignore handoff bit if not set by first waiter

With commit adf56da3a439 ("locking/rwsem: Make handoff bit handling more
consistent"), the writer that sets the handoff bit can be interrupted
out without clearing the bit if the wait queue isn't empty. This disables
reader and writer optimistic lock spinning and stealing.

Now if a non-first writer in the queue is somehow woken up or a new
waiter enters the slowpath, it can't acquire the lock.  This is not the
case before commit adf56da3a439 as the writer that set the handoff bit
will clear it when exiting out via the out_nolock path. This is less
efficient as the busy rwsem stays in an unlock state for a longer time.

In some cases, this new behavior may cause lockups as shown in [1] and
[2].

This patch allows a non-first writer to ignore the handoff bit if it
is not originally set or initiated by the first waiter. This patch is
shown to be effective in fixing the lockup problem reported in [1].

[1] https://lore.kernel.org/lkml/20220617134325.GC30825@techsingularity.net/
[2] https://lore.kernel.org/lkml/3f02975c-1a9d-be20-32cf-f1d8e3dfafcc@oracle.com/

Fixes: adf56da3a439 ("locking/rwsem: Make handoff bit handling more consistent")
Signed-off-by: Waiman Long <longman@redhat.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: John Donnelly <john.p.donnelly@oracle.com>
Tested-by: Mel Gorman <mgorman@techsingularity.net>
Link: https://lore.kernel.org/r/20220622200419.778799-1-longman@redhat.com
kernel/locking/rwsem.c