aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/locking/rtmutex.c
diff options
context:
space:
mode:
authorDavidlohr Bueso <dave@stgolabs.net>2017-09-08 19:15:01 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-09-08 21:26:49 -0400
commita23ba907d5e65d6aeea3e59c82fda9cd206a7aad (patch)
treea0bd42b27596cf758517fa004d1d8681a7eef932 /kernel/locking/rtmutex.c
parent2161573ecd6931565936cb66793b2d2bf805c088 (diff)
locking/rtmutex: replace top-waiter and pi_waiters leftmost caching
... with the generic rbtree flavor instead. No changes in semantics whatsoever. Link: http://lkml.kernel.org/r/20170719014603.19029-10-dave@stgolabs.net Signed-off-by: Davidlohr Bueso <dbueso@suse.de> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/locking/rtmutex.c')
-rw-r--r--kernel/locking/rtmutex.c35
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,
271static void 271static void
272rt_mutex_enqueue(struct rt_mutex *lock, struct rt_mutex_waiter *waiter) 272rt_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
297static void 294static 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
310static void 304static void
311rt_mutex_enqueue_pi(struct task_struct *task, struct rt_mutex_waiter *waiter) 305rt_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
336static void 327static 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);