[PATCH] 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 woken up path. Cc: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Chris Wright <chrisw@sous-sol.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Willy Tarreau
parent
61540c3cf7
commit
b3b66101b6
+9
-2
@@ -659,9 +659,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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user