Messages in this thread Patch in this message | | | From | Waiman Long <> | Subject | [PATCH 4/5] locking/rwsem: Wake up all waiting readers if RWSEM_WAKE_READ_OWNED | Date | Tue, 17 Nov 2020 22:04:28 -0500 |
| |
The rwsem wakeup logic has been modified by commit d3681e269fff ("locking/rwsem: Wake up almost all readers in wait queue") to wake up all readers in the wait queue if the first waiter is a reader. In the case of RWSEM_WAKE_READ_OWNED, not all readers can be woken up if the first waiter happens to be a writer. Complete the logic by waking up all readers even for this case.
Signed-off-by: Waiman Long <longman@redhat.com> --- kernel/locking/rwsem.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/kernel/locking/rwsem.c b/kernel/locking/rwsem.c index 930dd4af3639..23654e3950b5 100644 --- a/kernel/locking/rwsem.c +++ b/kernel/locking/rwsem.c @@ -426,7 +426,12 @@ static void rwsem_mark_wake(struct rw_semaphore *sem, lockevent_inc(rwsem_wake_writer); } - return; + /* + * If rwsem has already been owned by reader, wake up other + * readers in the wait queue even if first one is a writer. + */ + if (wake_type != RWSEM_WAKE_READ_OWNED) + return; } /* @@ -1052,8 +1057,7 @@ rwsem_down_read_slowpath(struct rw_semaphore *sem, int state, long count) if (rwsem_optimistic_spin(sem, false)) { /* rwsem_optimistic_spin() implies ACQUIRE on success */ /* - * Wake up other readers in the wait list if the front - * waiter is a reader. + * Wake up other readers in the wait queue. */ wake_readers: if ((atomic_long_read(&sem->count) & RWSEM_FLAG_WAITERS)) { -- 2.18.1
| |