In rwsem_down_write_failed(), if there are active locks after we wake up
(i.e. the lock got stolen from us), skip taking the wait_lock and go back
to sleep immediately.

Signed-off-by: Michel Lespinasse <wal...@google.com>

---
 lib/rwsem.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/lib/rwsem.c b/lib/rwsem.c
index 64c2dc007be2..edf3d9ca670e 100644
--- a/lib/rwsem.c
+++ b/lib/rwsem.c
@@ -214,8 +214,8 @@ struct rw_semaphore __sched *rwsem_down_write_failed(struct 
rw_semaphore *sem)
                sem = __rwsem_do_wake(sem, RWSEM_WAKE_READ_OWNED);
 
        /* wait until we successfully acquire the lock */
+       set_task_state(tsk, TASK_UNINTERRUPTIBLE);
        while (true) {
-               set_task_state(tsk, TASK_UNINTERRUPTIBLE);
 
                /* Try acquiring the write lock. */
                count = RWSEM_ACTIVE_WRITE_BIAS;
@@ -226,7 +226,13 @@ struct rw_semaphore __sched 
*rwsem_down_write_failed(struct rw_semaphore *sem)
                        break;
 
                raw_spin_unlock_irq(&sem->wait_lock);
-               schedule();
+
+               /* Block until there are no active lockers. */
+               do {
+                       schedule();
+                       set_task_state(tsk, TASK_UNINTERRUPTIBLE);
+               } while (sem->count & RWSEM_ACTIVE_MASK);
+
                raw_spin_lock_irq(&sem->wait_lock);
        }
 
-- 
1.8.1.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to