]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
[PATCH] rt-mutex: Fix stale return value
authorThomas Gleixner <tglx@linutronix.de>
Fri, 8 Jun 2007 10:29:28 +0000 (10:29 +0000)
committerWilly Tarreau <w@1wt.eu>
Wed, 15 Aug 2007 08:02:25 +0000 (10:02 +0200)
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>
kernel/rtmutex.c

index 4ab17da46fd80de1690744f9022691923942cb70..9b08847b8f7fbafee13dd2c2ef797b128ec4bbef 100644 (file)
@@ -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;
                }