summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2007-06-08 10:29:28 +0000
committerGreg Kroah-Hartman <gregkh@suse.de>2007-08-04 09:10:23 -0700
commit21e3424ee9ce6760b03ed3bfc7a26e002b9de0ed (patch)
tree53794924b732fbfb86f009c285dd820fc8b4e5fc
parentb6b364eaa2ec37e9d1108fcbf4a025a3a407b879 (diff)
downloadlinux-stable-21e3424ee9ce6760b03ed3bfc7a26e002b9de0ed.tar.gz
linux-stable-21e3424ee9ce6760b03ed3bfc7a26e002b9de0ed.tar.bz2
linux-stable-21e3424ee9ce6760b03ed3bfc7a26e002b9de0ed.zip
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>
-rw-r--r--kernel/rtmutex.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/kernel/rtmutex.c b/kernel/rtmutex.c
index 180978cb2f75..21ebe7612f83 100644
--- a/kernel/rtmutex.c
+++ b/kernel/rtmutex.c
@@ -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;
}