rt-mutex: fix stale return value
Alexey Kuznetsov found some problems in the pi-futex code. The major problem is a stale return value in rt_mutex_slowlock(): When the pi chain walk returns -EDEADLK, but the waiter was woken up during the phases where the locks were dropped, the rtmutex could be acquired, but due to the stale return value -EDEADLK returned to the caller. Reset the return value in the retry path. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Ingo Molnar <mingo@elte.hu> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru> Cc: Ulrich Drepper <drepper@redhat.com> Cc: Eric Dumazet <dada1@cosmosbay.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
51b94d2a5a
commit
c0d1d2bf5a
1 changed files with 9 additions and 2 deletions
|
@ -636,9 +636,16 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state,
|
|||
* all over without going into schedule to try
|
||||
* to get the lock now:
|
||||
*/
|
||||
if (unlikely(!waiter.task))
|
||||
if (unlikely(!waiter.task)) {
|
||||
/*
|
||||
* Reset the return value. We might
|
||||
* have returned with -EDEADLK and the
|
||||
* owner released the lock while we
|
||||
* were walking the pi chain.
|
||||
*/
|
||||
ret = 0;
|
||||
continue;
|
||||
|
||||
}
|
||||
if (unlikely(ret))
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue