mirror of https://gitee.com/openkylin/linux.git
rwsem: avoid taking wait_lock in rwsem_down_write_failed
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 <walken@google.com> Reviewed-by: Peter Hurley <peter@hurleysoftware.com> Acked-by: Davidlohr Bueso <davidlohr.bueso@hp.com> Acked-by: Rik van Riel <riel@redhat.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
5ede972df1
commit
a7d2c573ae
10
lib/rwsem.c
10
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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue