diff options
Diffstat (limited to 'kernel/locking/rtmutex.c')
-rw-r--r-- | kernel/locking/rtmutex.c | 35 |
1 files changed, 11 insertions, 24 deletions
diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c index 649dc9d3951a..6f3dba6e4e9e 100644 --- a/kernel/locking/rtmutex.c +++ b/kernel/locking/rtmutex.c | |||
@@ -271,10 +271,10 @@ rt_mutex_waiter_equal(struct rt_mutex_waiter *left, | |||
271 | static void | 271 | static void |
272 | rt_mutex_enqueue(struct rt_mutex *lock, struct rt_mutex_waiter *waiter) | 272 | rt_mutex_enqueue(struct rt_mutex *lock, struct rt_mutex_waiter *waiter) |
273 | { | 273 | { |
274 | struct rb_node **link = &lock->waiters.rb_node; | 274 | struct rb_node **link = &lock->waiters.rb_root.rb_node; |
275 | struct rb_node *parent = NULL; | 275 | struct rb_node *parent = NULL; |
276 | struct rt_mutex_waiter *entry; | 276 | struct rt_mutex_waiter *entry; |
277 | int leftmost = 1; | 277 | bool leftmost = true; |
278 | 278 | ||
279 | while (*link) { | 279 | while (*link) { |
280 | parent = *link; | 280 | parent = *link; |
@@ -283,15 +283,12 @@ rt_mutex_enqueue(struct rt_mutex *lock, struct rt_mutex_waiter *waiter) | |||
283 | link = &parent->rb_left; | 283 | link = &parent->rb_left; |
284 | } else { | 284 | } else { |
285 | link = &parent->rb_right; | 285 | link = &parent->rb_right; |
286 | leftmost = 0; | 286 | leftmost = false; |
287 | } | 287 | } |
288 | } | 288 | } |
289 | 289 | ||
290 | if (leftmost) | ||
291 | lock->waiters_leftmost = &waiter->tree_entry; | ||
292 | |||
293 | rb_link_node(&waiter->tree_entry, parent, link); | 290 | rb_link_node(&waiter->tree_entry, parent, link); |
294 | rb_insert_color(&waiter->tree_entry, &lock->waiters); | 291 | rb_insert_color_cached(&waiter->tree_entry, &lock->waiters, leftmost); |
295 | } | 292 | } |
296 | 293 | ||
297 | static void | 294 | static void |
@@ -300,20 +297,17 @@ rt_mutex_dequeue(struct rt_mutex *lock, struct rt_mutex_waiter *waiter) | |||
300 | if (RB_EMPTY_NODE(&waiter->tree_entry)) | 297 | if (RB_EMPTY_NODE(&waiter->tree_entry)) |
301 | return; | 298 | return; |
302 | 299 | ||
303 | if (lock->waiters_leftmost == &waiter->tree_entry) | 300 | rb_erase_cached(&waiter->tree_entry, &lock->waiters); |
304 | lock->waiters_leftmost = rb_next(&waiter->tree_entry); | ||
305 | |||
306 | rb_erase(&waiter->tree_entry, &lock->waiters); | ||
307 | RB_CLEAR_NODE(&waiter->tree_entry); | 301 | RB_CLEAR_NODE(&waiter->tree_entry); |
308 | } | 302 | } |
309 | 303 | ||
310 | static void | 304 | static void |
311 | rt_mutex_enqueue_pi(struct task_struct *task, struct rt_mutex_waiter *waiter) | 305 | rt_mutex_enqueue_pi(struct task_struct *task, struct rt_mutex_waiter *waiter) |
312 | { | 306 | { |
313 | struct rb_node **link = &task->pi_waiters.rb_node; | 307 | struct rb_node **link = &task->pi_waiters.rb_root.rb_node; |
314 | struct rb_node *parent = NULL; | 308 | struct rb_node *parent = NULL; |
315 | struct rt_mutex_waiter *entry; | 309 | struct rt_mutex_waiter *entry; |
316 | int leftmost = 1; | 310 | bool leftmost = true; |
317 | 311 | ||
318 | while (*link) { | 312 | while (*link) { |
319 | parent = *link; | 313 | parent = *link; |
@@ -322,15 +316,12 @@ rt_mutex_enqueue_pi(struct task_struct *task, struct rt_mutex_waiter *waiter) | |||
322 | link = &parent->rb_left; | 316 | link = &parent->rb_left; |
323 | } else { | 317 | } else { |
324 | link = &parent->rb_right; | 318 | link = &parent->rb_right; |
325 | leftmost = 0; | 319 | leftmost = false; |
326 | } | 320 | } |
327 | } | 321 | } |
328 | 322 | ||
329 | if (leftmost) | ||
330 | task->pi_waiters_leftmost = &waiter->pi_tree_entry; | ||
331 | |||
332 | rb_link_node(&waiter->pi_tree_entry, parent, link); | 323 | rb_link_node(&waiter->pi_tree_entry, parent, link); |
333 | rb_insert_color(&waiter->pi_tree_entry, &task->pi_waiters); | 324 | rb_insert_color_cached(&waiter->pi_tree_entry, &task->pi_waiters, leftmost); |
334 | } | 325 | } |
335 | 326 | ||
336 | static void | 327 | static void |
@@ -339,10 +330,7 @@ rt_mutex_dequeue_pi(struct task_struct *task, struct rt_mutex_waiter *waiter) | |||
339 | if (RB_EMPTY_NODE(&waiter->pi_tree_entry)) | 330 | if (RB_EMPTY_NODE(&waiter->pi_tree_entry)) |
340 | return; | 331 | return; |
341 | 332 | ||
342 | if (task->pi_waiters_leftmost == &waiter->pi_tree_entry) | 333 | rb_erase_cached(&waiter->pi_tree_entry, &task->pi_waiters); |
343 | task->pi_waiters_leftmost = rb_next(&waiter->pi_tree_entry); | ||
344 | |||
345 | rb_erase(&waiter->pi_tree_entry, &task->pi_waiters); | ||
346 | RB_CLEAR_NODE(&waiter->pi_tree_entry); | 334 | RB_CLEAR_NODE(&waiter->pi_tree_entry); |
347 | } | 335 | } |
348 | 336 | ||
@@ -1657,8 +1645,7 @@ void __rt_mutex_init(struct rt_mutex *lock, const char *name, | |||
1657 | { | 1645 | { |
1658 | lock->owner = NULL; | 1646 | lock->owner = NULL; |
1659 | raw_spin_lock_init(&lock->wait_lock); | 1647 | raw_spin_lock_init(&lock->wait_lock); |
1660 | lock->waiters = RB_ROOT; | 1648 | lock->waiters = RB_ROOT_CACHED; |
1661 | lock->waiters_leftmost = NULL; | ||
1662 | 1649 | ||
1663 | if (name && key) | 1650 | if (name && key) |
1664 | debug_rt_mutex_init(lock, name, key); | 1651 | debug_rt_mutex_init(lock, name, key); |