diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2015-11-06 18:51:03 +0100 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2016-11-16 14:23:14 -0500 |
commit | f763c2c9713cd1a867b6193549a677e1aaaae2d3 (patch) | |
tree | 4cf1843967d2b66b51cab269a6c1f1401117de35 | |
parent | 7eae6c5173ba9cae55f667bb1080b56a8a71c669 (diff) | |
download | linux-rt-f763c2c9713cd1a867b6193549a677e1aaaae2d3.tar.gz |
rtmutex: Handle non enqueued waiters gracefully
Yimin debugged that in case of a PI wakeup in progress when
rt_mutex_start_proxy_lock() calls task_blocks_on_rt_mutex() the latter
returns -EAGAIN and in consequence the remove_waiter() call runs into
a BUG_ON() because there is nothing to remove.
Guard it with rt_mutex_has_waiters(). This is a quick fix which is
easy to backport. The proper fix is to have a central check in
remove_waiter() so we can call it unconditionally.
Reported-and-debugged-by: Yimin Deng <yimin11.deng@gmail.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: stable-rt@vger.kernel.org
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r-- | kernel/rtmutex.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/kernel/rtmutex.c b/kernel/rtmutex.c index 4cc273b85beb..d353e9191955 100644 --- a/kernel/rtmutex.c +++ b/kernel/rtmutex.c @@ -1911,7 +1911,7 @@ int rt_mutex_start_proxy_lock(struct rt_mutex *lock, ret = 0; } - if (unlikely(ret)) + if (ret && rt_mutex_has_waiters(lock)) remove_waiter(lock, waiter); raw_spin_unlock(&lock->wait_lock); |