diff options
-rw-r--r-- | kernel/locking/rtmutex.c | 3 | ||||
-rw-r--r-- | kernel/locking/rtmutex_common.h | 11 |
2 files changed, 7 insertions, 7 deletions
diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c index 940633c63254..4f014be7a4b8 100644 --- a/kernel/locking/rtmutex.c +++ b/kernel/locking/rtmutex.c | |||
@@ -1268,8 +1268,7 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state, | |||
1268 | 1268 | ||
1269 | if (unlikely(ret)) { | 1269 | if (unlikely(ret)) { |
1270 | __set_current_state(TASK_RUNNING); | 1270 | __set_current_state(TASK_RUNNING); |
1271 | if (rt_mutex_has_waiters(lock)) | 1271 | remove_waiter(lock, &waiter); |
1272 | remove_waiter(lock, &waiter); | ||
1273 | rt_mutex_handle_deadlock(ret, chwalk, &waiter); | 1272 | rt_mutex_handle_deadlock(ret, chwalk, &waiter); |
1274 | } | 1273 | } |
1275 | 1274 | ||
diff --git a/kernel/locking/rtmutex_common.h b/kernel/locking/rtmutex_common.h index 68686b3ec3c1..d1d62f942be2 100644 --- a/kernel/locking/rtmutex_common.h +++ b/kernel/locking/rtmutex_common.h | |||
@@ -52,12 +52,13 @@ static inline int rt_mutex_has_waiters(struct rt_mutex *lock) | |||
52 | static inline struct rt_mutex_waiter * | 52 | static inline struct rt_mutex_waiter * |
53 | rt_mutex_top_waiter(struct rt_mutex *lock) | 53 | rt_mutex_top_waiter(struct rt_mutex *lock) |
54 | { | 54 | { |
55 | struct rt_mutex_waiter *w; | 55 | struct rb_node *leftmost = rb_first_cached(&lock->waiters); |
56 | 56 | struct rt_mutex_waiter *w = NULL; | |
57 | w = rb_entry(lock->waiters.rb_leftmost, | ||
58 | struct rt_mutex_waiter, tree_entry); | ||
59 | BUG_ON(w->lock != lock); | ||
60 | 57 | ||
58 | if (leftmost) { | ||
59 | w = rb_entry(leftmost, struct rt_mutex_waiter, tree_entry); | ||
60 | BUG_ON(w->lock != lock); | ||
61 | } | ||
61 | return w; | 62 | return w; |
62 | } | 63 | } |
63 | 64 | ||