11696a8beSPeter Zijlstra /* 21696a8beSPeter Zijlstra * RT-Mutexes: simple blocking mutual exclusion locks with PI support 31696a8beSPeter Zijlstra * 41696a8beSPeter Zijlstra * started by Ingo Molnar and Thomas Gleixner. 51696a8beSPeter Zijlstra * 61696a8beSPeter Zijlstra * Copyright (C) 2004-2006 Red Hat, Inc., Ingo Molnar <[email protected]> 71696a8beSPeter Zijlstra * Copyright (C) 2005-2006 Timesys Corp., Thomas Gleixner <[email protected]> 81696a8beSPeter Zijlstra * Copyright (C) 2005 Kihon Technologies Inc., Steven Rostedt 91696a8beSPeter Zijlstra * Copyright (C) 2006 Esben Nielsen 101696a8beSPeter Zijlstra * 111696a8beSPeter Zijlstra * See Documentation/rt-mutex-design.txt for details. 121696a8beSPeter Zijlstra */ 131696a8beSPeter Zijlstra #include <linux/spinlock.h> 141696a8beSPeter Zijlstra #include <linux/export.h> 151696a8beSPeter Zijlstra #include <linux/sched.h> 161696a8beSPeter Zijlstra #include <linux/sched/rt.h> 17fb00aca4SPeter Zijlstra #include <linux/sched/deadline.h> 181696a8beSPeter Zijlstra #include <linux/timer.h> 191696a8beSPeter Zijlstra 201696a8beSPeter Zijlstra #include "rtmutex_common.h" 211696a8beSPeter Zijlstra 221696a8beSPeter Zijlstra /* 231696a8beSPeter Zijlstra * lock->owner state tracking: 241696a8beSPeter Zijlstra * 251696a8beSPeter Zijlstra * lock->owner holds the task_struct pointer of the owner. Bit 0 261696a8beSPeter Zijlstra * is used to keep track of the "lock has waiters" state. 271696a8beSPeter Zijlstra * 281696a8beSPeter Zijlstra * owner bit0 291696a8beSPeter Zijlstra * NULL 0 lock is free (fast acquire possible) 301696a8beSPeter Zijlstra * NULL 1 lock is free and has waiters and the top waiter 311696a8beSPeter Zijlstra * is going to take the lock* 321696a8beSPeter Zijlstra * taskpointer 0 lock is held (fast release possible) 331696a8beSPeter Zijlstra * taskpointer 1 lock is held and has waiters** 341696a8beSPeter Zijlstra * 351696a8beSPeter Zijlstra * The fast atomic compare exchange based acquire and release is only 361696a8beSPeter Zijlstra * possible when bit 0 of lock->owner is 0. 371696a8beSPeter Zijlstra * 381696a8beSPeter Zijlstra * (*) It also can be a transitional state when grabbing the lock 391696a8beSPeter Zijlstra * with ->wait_lock is held. To prevent any fast path cmpxchg to the lock, 401696a8beSPeter Zijlstra * we need to set the bit0 before looking at the lock, and the owner may be 411696a8beSPeter Zijlstra * NULL in this small time, hence this can be a transitional state. 421696a8beSPeter Zijlstra * 431696a8beSPeter Zijlstra * (**) There is a small time when bit 0 is set but there are no 441696a8beSPeter Zijlstra * waiters. This can happen when grabbing the lock in the slow path. 451696a8beSPeter Zijlstra * To prevent a cmpxchg of the owner releasing the lock, we need to 461696a8beSPeter Zijlstra * set this bit before looking at the lock. 471696a8beSPeter Zijlstra */ 481696a8beSPeter Zijlstra 491696a8beSPeter Zijlstra static void 501696a8beSPeter Zijlstra rt_mutex_set_owner(struct rt_mutex *lock, struct task_struct *owner) 511696a8beSPeter Zijlstra { 521696a8beSPeter Zijlstra unsigned long val = (unsigned long)owner; 531696a8beSPeter Zijlstra 541696a8beSPeter Zijlstra if (rt_mutex_has_waiters(lock)) 551696a8beSPeter Zijlstra val |= RT_MUTEX_HAS_WAITERS; 561696a8beSPeter Zijlstra 571696a8beSPeter Zijlstra lock->owner = (struct task_struct *)val; 581696a8beSPeter Zijlstra } 591696a8beSPeter Zijlstra 601696a8beSPeter Zijlstra static inline void clear_rt_mutex_waiters(struct rt_mutex *lock) 611696a8beSPeter Zijlstra { 621696a8beSPeter Zijlstra lock->owner = (struct task_struct *) 631696a8beSPeter Zijlstra ((unsigned long)lock->owner & ~RT_MUTEX_HAS_WAITERS); 641696a8beSPeter Zijlstra } 651696a8beSPeter Zijlstra 661696a8beSPeter Zijlstra static void fixup_rt_mutex_waiters(struct rt_mutex *lock) 671696a8beSPeter Zijlstra { 681696a8beSPeter Zijlstra if (!rt_mutex_has_waiters(lock)) 691696a8beSPeter Zijlstra clear_rt_mutex_waiters(lock); 701696a8beSPeter Zijlstra } 711696a8beSPeter Zijlstra 721696a8beSPeter Zijlstra /* 731696a8beSPeter Zijlstra * We can speed up the acquire/release, if the architecture 741696a8beSPeter Zijlstra * supports cmpxchg and if there's no debugging state to be set up 751696a8beSPeter Zijlstra */ 761696a8beSPeter Zijlstra #if defined(__HAVE_ARCH_CMPXCHG) && !defined(CONFIG_DEBUG_RT_MUTEXES) 771696a8beSPeter Zijlstra # define rt_mutex_cmpxchg(l,c,n) (cmpxchg(&l->owner, c, n) == c) 781696a8beSPeter Zijlstra static inline void mark_rt_mutex_waiters(struct rt_mutex *lock) 791696a8beSPeter Zijlstra { 801696a8beSPeter Zijlstra unsigned long owner, *p = (unsigned long *) &lock->owner; 811696a8beSPeter Zijlstra 821696a8beSPeter Zijlstra do { 831696a8beSPeter Zijlstra owner = *p; 841696a8beSPeter Zijlstra } while (cmpxchg(p, owner, owner | RT_MUTEX_HAS_WAITERS) != owner); 851696a8beSPeter Zijlstra } 8627e35715SThomas Gleixner 8727e35715SThomas Gleixner /* 8827e35715SThomas Gleixner * Safe fastpath aware unlock: 8927e35715SThomas Gleixner * 1) Clear the waiters bit 9027e35715SThomas Gleixner * 2) Drop lock->wait_lock 9127e35715SThomas Gleixner * 3) Try to unlock the lock with cmpxchg 9227e35715SThomas Gleixner */ 9327e35715SThomas Gleixner static inline bool unlock_rt_mutex_safe(struct rt_mutex *lock) 9427e35715SThomas Gleixner __releases(lock->wait_lock) 9527e35715SThomas Gleixner { 9627e35715SThomas Gleixner struct task_struct *owner = rt_mutex_owner(lock); 9727e35715SThomas Gleixner 9827e35715SThomas Gleixner clear_rt_mutex_waiters(lock); 9927e35715SThomas Gleixner raw_spin_unlock(&lock->wait_lock); 10027e35715SThomas Gleixner /* 10127e35715SThomas Gleixner * If a new waiter comes in between the unlock and the cmpxchg 10227e35715SThomas Gleixner * we have two situations: 10327e35715SThomas Gleixner * 10427e35715SThomas Gleixner * unlock(wait_lock); 10527e35715SThomas Gleixner * lock(wait_lock); 10627e35715SThomas Gleixner * cmpxchg(p, owner, 0) == owner 10727e35715SThomas Gleixner * mark_rt_mutex_waiters(lock); 10827e35715SThomas Gleixner * acquire(lock); 10927e35715SThomas Gleixner * or: 11027e35715SThomas Gleixner * 11127e35715SThomas Gleixner * unlock(wait_lock); 11227e35715SThomas Gleixner * lock(wait_lock); 11327e35715SThomas Gleixner * mark_rt_mutex_waiters(lock); 11427e35715SThomas Gleixner * 11527e35715SThomas Gleixner * cmpxchg(p, owner, 0) != owner 11627e35715SThomas Gleixner * enqueue_waiter(); 11727e35715SThomas Gleixner * unlock(wait_lock); 11827e35715SThomas Gleixner * lock(wait_lock); 11927e35715SThomas Gleixner * wake waiter(); 12027e35715SThomas Gleixner * unlock(wait_lock); 12127e35715SThomas Gleixner * lock(wait_lock); 12227e35715SThomas Gleixner * acquire(lock); 12327e35715SThomas Gleixner */ 12427e35715SThomas Gleixner return rt_mutex_cmpxchg(lock, owner, NULL); 12527e35715SThomas Gleixner } 12627e35715SThomas Gleixner 1271696a8beSPeter Zijlstra #else 1281696a8beSPeter Zijlstra # define rt_mutex_cmpxchg(l,c,n) (0) 1291696a8beSPeter Zijlstra static inline void mark_rt_mutex_waiters(struct rt_mutex *lock) 1301696a8beSPeter Zijlstra { 1311696a8beSPeter Zijlstra lock->owner = (struct task_struct *) 1321696a8beSPeter Zijlstra ((unsigned long)lock->owner | RT_MUTEX_HAS_WAITERS); 1331696a8beSPeter Zijlstra } 13427e35715SThomas Gleixner 13527e35715SThomas Gleixner /* 13627e35715SThomas Gleixner * Simple slow path only version: lock->owner is protected by lock->wait_lock. 13727e35715SThomas Gleixner */ 13827e35715SThomas Gleixner static inline bool unlock_rt_mutex_safe(struct rt_mutex *lock) 13927e35715SThomas Gleixner __releases(lock->wait_lock) 14027e35715SThomas Gleixner { 14127e35715SThomas Gleixner lock->owner = NULL; 14227e35715SThomas Gleixner raw_spin_unlock(&lock->wait_lock); 14327e35715SThomas Gleixner return true; 14427e35715SThomas Gleixner } 1451696a8beSPeter Zijlstra #endif 1461696a8beSPeter Zijlstra 147fb00aca4SPeter Zijlstra static inline int 148fb00aca4SPeter Zijlstra rt_mutex_waiter_less(struct rt_mutex_waiter *left, 149fb00aca4SPeter Zijlstra struct rt_mutex_waiter *right) 150fb00aca4SPeter Zijlstra { 1512d3d891dSDario Faggioli if (left->prio < right->prio) 152fb00aca4SPeter Zijlstra return 1; 153fb00aca4SPeter Zijlstra 1541696a8beSPeter Zijlstra /* 1552d3d891dSDario Faggioli * If both waiters have dl_prio(), we check the deadlines of the 1562d3d891dSDario Faggioli * associated tasks. 1572d3d891dSDario Faggioli * If left waiter has a dl_prio(), and we didn't return 1 above, 1582d3d891dSDario Faggioli * then right waiter has a dl_prio() too. 159fb00aca4SPeter Zijlstra */ 1602d3d891dSDario Faggioli if (dl_prio(left->prio)) 161fb00aca4SPeter Zijlstra return (left->task->dl.deadline < right->task->dl.deadline); 162fb00aca4SPeter Zijlstra 163fb00aca4SPeter Zijlstra return 0; 164fb00aca4SPeter Zijlstra } 165fb00aca4SPeter Zijlstra 166fb00aca4SPeter Zijlstra static void 167fb00aca4SPeter Zijlstra rt_mutex_enqueue(struct rt_mutex *lock, struct rt_mutex_waiter *waiter) 168fb00aca4SPeter Zijlstra { 169fb00aca4SPeter Zijlstra struct rb_node **link = &lock->waiters.rb_node; 170fb00aca4SPeter Zijlstra struct rb_node *parent = NULL; 171fb00aca4SPeter Zijlstra struct rt_mutex_waiter *entry; 172fb00aca4SPeter Zijlstra int leftmost = 1; 173fb00aca4SPeter Zijlstra 174fb00aca4SPeter Zijlstra while (*link) { 175fb00aca4SPeter Zijlstra parent = *link; 176fb00aca4SPeter Zijlstra entry = rb_entry(parent, struct rt_mutex_waiter, tree_entry); 177fb00aca4SPeter Zijlstra if (rt_mutex_waiter_less(waiter, entry)) { 178fb00aca4SPeter Zijlstra link = &parent->rb_left; 179fb00aca4SPeter Zijlstra } else { 180fb00aca4SPeter Zijlstra link = &parent->rb_right; 181fb00aca4SPeter Zijlstra leftmost = 0; 182fb00aca4SPeter Zijlstra } 183fb00aca4SPeter Zijlstra } 184fb00aca4SPeter Zijlstra 185fb00aca4SPeter Zijlstra if (leftmost) 186fb00aca4SPeter Zijlstra lock->waiters_leftmost = &waiter->tree_entry; 187fb00aca4SPeter Zijlstra 188fb00aca4SPeter Zijlstra rb_link_node(&waiter->tree_entry, parent, link); 189fb00aca4SPeter Zijlstra rb_insert_color(&waiter->tree_entry, &lock->waiters); 190fb00aca4SPeter Zijlstra } 191fb00aca4SPeter Zijlstra 192fb00aca4SPeter Zijlstra static void 193fb00aca4SPeter Zijlstra rt_mutex_dequeue(struct rt_mutex *lock, struct rt_mutex_waiter *waiter) 194fb00aca4SPeter Zijlstra { 195fb00aca4SPeter Zijlstra if (RB_EMPTY_NODE(&waiter->tree_entry)) 196fb00aca4SPeter Zijlstra return; 197fb00aca4SPeter Zijlstra 198fb00aca4SPeter Zijlstra if (lock->waiters_leftmost == &waiter->tree_entry) 199fb00aca4SPeter Zijlstra lock->waiters_leftmost = rb_next(&waiter->tree_entry); 200fb00aca4SPeter Zijlstra 201fb00aca4SPeter Zijlstra rb_erase(&waiter->tree_entry, &lock->waiters); 202fb00aca4SPeter Zijlstra RB_CLEAR_NODE(&waiter->tree_entry); 203fb00aca4SPeter Zijlstra } 204fb00aca4SPeter Zijlstra 205fb00aca4SPeter Zijlstra static void 206fb00aca4SPeter Zijlstra rt_mutex_enqueue_pi(struct task_struct *task, struct rt_mutex_waiter *waiter) 207fb00aca4SPeter Zijlstra { 208fb00aca4SPeter Zijlstra struct rb_node **link = &task->pi_waiters.rb_node; 209fb00aca4SPeter Zijlstra struct rb_node *parent = NULL; 210fb00aca4SPeter Zijlstra struct rt_mutex_waiter *entry; 211fb00aca4SPeter Zijlstra int leftmost = 1; 212fb00aca4SPeter Zijlstra 213fb00aca4SPeter Zijlstra while (*link) { 214fb00aca4SPeter Zijlstra parent = *link; 215fb00aca4SPeter Zijlstra entry = rb_entry(parent, struct rt_mutex_waiter, pi_tree_entry); 216fb00aca4SPeter Zijlstra if (rt_mutex_waiter_less(waiter, entry)) { 217fb00aca4SPeter Zijlstra link = &parent->rb_left; 218fb00aca4SPeter Zijlstra } else { 219fb00aca4SPeter Zijlstra link = &parent->rb_right; 220fb00aca4SPeter Zijlstra leftmost = 0; 221fb00aca4SPeter Zijlstra } 222fb00aca4SPeter Zijlstra } 223fb00aca4SPeter Zijlstra 224fb00aca4SPeter Zijlstra if (leftmost) 225fb00aca4SPeter Zijlstra task->pi_waiters_leftmost = &waiter->pi_tree_entry; 226fb00aca4SPeter Zijlstra 227fb00aca4SPeter Zijlstra rb_link_node(&waiter->pi_tree_entry, parent, link); 228fb00aca4SPeter Zijlstra rb_insert_color(&waiter->pi_tree_entry, &task->pi_waiters); 229fb00aca4SPeter Zijlstra } 230fb00aca4SPeter Zijlstra 231fb00aca4SPeter Zijlstra static void 232fb00aca4SPeter Zijlstra rt_mutex_dequeue_pi(struct task_struct *task, struct rt_mutex_waiter *waiter) 233fb00aca4SPeter Zijlstra { 234fb00aca4SPeter Zijlstra if (RB_EMPTY_NODE(&waiter->pi_tree_entry)) 235fb00aca4SPeter Zijlstra return; 236fb00aca4SPeter Zijlstra 237fb00aca4SPeter Zijlstra if (task->pi_waiters_leftmost == &waiter->pi_tree_entry) 238fb00aca4SPeter Zijlstra task->pi_waiters_leftmost = rb_next(&waiter->pi_tree_entry); 239fb00aca4SPeter Zijlstra 240fb00aca4SPeter Zijlstra rb_erase(&waiter->pi_tree_entry, &task->pi_waiters); 241fb00aca4SPeter Zijlstra RB_CLEAR_NODE(&waiter->pi_tree_entry); 242fb00aca4SPeter Zijlstra } 243fb00aca4SPeter Zijlstra 244fb00aca4SPeter Zijlstra /* 245fb00aca4SPeter Zijlstra * Calculate task priority from the waiter tree priority 2461696a8beSPeter Zijlstra * 247fb00aca4SPeter Zijlstra * Return task->normal_prio when the waiter tree is empty or when 2481696a8beSPeter Zijlstra * the waiter is not allowed to do priority boosting 2491696a8beSPeter Zijlstra */ 2501696a8beSPeter Zijlstra int rt_mutex_getprio(struct task_struct *task) 2511696a8beSPeter Zijlstra { 2521696a8beSPeter Zijlstra if (likely(!task_has_pi_waiters(task))) 2531696a8beSPeter Zijlstra return task->normal_prio; 2541696a8beSPeter Zijlstra 2552d3d891dSDario Faggioli return min(task_top_pi_waiter(task)->prio, 2561696a8beSPeter Zijlstra task->normal_prio); 2571696a8beSPeter Zijlstra } 2581696a8beSPeter Zijlstra 2592d3d891dSDario Faggioli struct task_struct *rt_mutex_get_top_task(struct task_struct *task) 2602d3d891dSDario Faggioli { 2612d3d891dSDario Faggioli if (likely(!task_has_pi_waiters(task))) 2622d3d891dSDario Faggioli return NULL; 2632d3d891dSDario Faggioli 2642d3d891dSDario Faggioli return task_top_pi_waiter(task)->task; 2652d3d891dSDario Faggioli } 2662d3d891dSDario Faggioli 2671696a8beSPeter Zijlstra /* 268c365c292SThomas Gleixner * Called by sched_setscheduler() to check whether the priority change 269c365c292SThomas Gleixner * is overruled by a possible priority boosting. 270c365c292SThomas Gleixner */ 271c365c292SThomas Gleixner int rt_mutex_check_prio(struct task_struct *task, int newprio) 272c365c292SThomas Gleixner { 273c365c292SThomas Gleixner if (!task_has_pi_waiters(task)) 274c365c292SThomas Gleixner return 0; 275c365c292SThomas Gleixner 276c365c292SThomas Gleixner return task_top_pi_waiter(task)->task->prio <= newprio; 277c365c292SThomas Gleixner } 278c365c292SThomas Gleixner 279c365c292SThomas Gleixner /* 2801696a8beSPeter Zijlstra * Adjust the priority of a task, after its pi_waiters got modified. 2811696a8beSPeter Zijlstra * 2821696a8beSPeter Zijlstra * This can be both boosting and unboosting. task->pi_lock must be held. 2831696a8beSPeter Zijlstra */ 2841696a8beSPeter Zijlstra static void __rt_mutex_adjust_prio(struct task_struct *task) 2851696a8beSPeter Zijlstra { 2861696a8beSPeter Zijlstra int prio = rt_mutex_getprio(task); 2871696a8beSPeter Zijlstra 2882d3d891dSDario Faggioli if (task->prio != prio || dl_prio(prio)) 2891696a8beSPeter Zijlstra rt_mutex_setprio(task, prio); 2901696a8beSPeter Zijlstra } 2911696a8beSPeter Zijlstra 2921696a8beSPeter Zijlstra /* 2931696a8beSPeter Zijlstra * Adjust task priority (undo boosting). Called from the exit path of 2941696a8beSPeter Zijlstra * rt_mutex_slowunlock() and rt_mutex_slowlock(). 2951696a8beSPeter Zijlstra * 2961696a8beSPeter Zijlstra * (Note: We do this outside of the protection of lock->wait_lock to 2971696a8beSPeter Zijlstra * allow the lock to be taken while or before we readjust the priority 2981696a8beSPeter Zijlstra * of task. We do not use the spin_xx_mutex() variants here as we are 2991696a8beSPeter Zijlstra * outside of the debug path.) 3001696a8beSPeter Zijlstra */ 3011696a8beSPeter Zijlstra static void rt_mutex_adjust_prio(struct task_struct *task) 3021696a8beSPeter Zijlstra { 3031696a8beSPeter Zijlstra unsigned long flags; 3041696a8beSPeter Zijlstra 3051696a8beSPeter Zijlstra raw_spin_lock_irqsave(&task->pi_lock, flags); 3061696a8beSPeter Zijlstra __rt_mutex_adjust_prio(task); 3071696a8beSPeter Zijlstra raw_spin_unlock_irqrestore(&task->pi_lock, flags); 3081696a8beSPeter Zijlstra } 3091696a8beSPeter Zijlstra 3101696a8beSPeter Zijlstra /* 3111696a8beSPeter Zijlstra * Max number of times we'll walk the boosting chain: 3121696a8beSPeter Zijlstra */ 3131696a8beSPeter Zijlstra int max_lock_depth = 1024; 3141696a8beSPeter Zijlstra 31582084984SThomas Gleixner static inline struct rt_mutex *task_blocked_on_lock(struct task_struct *p) 31682084984SThomas Gleixner { 31782084984SThomas Gleixner return p->pi_blocked_on ? p->pi_blocked_on->lock : NULL; 31882084984SThomas Gleixner } 31982084984SThomas Gleixner 3201696a8beSPeter Zijlstra /* 3211696a8beSPeter Zijlstra * Adjust the priority chain. Also used for deadlock detection. 3221696a8beSPeter Zijlstra * Decreases task's usage by one - may thus free the task. 3231696a8beSPeter Zijlstra * 32482084984SThomas Gleixner * @task: the task owning the mutex (owner) for which a chain walk is 32582084984SThomas Gleixner * probably needed 3261696a8beSPeter Zijlstra * @deadlock_detect: do we have to carry out deadlock detection? 3271696a8beSPeter Zijlstra * @orig_lock: the mutex (can be NULL if we are walking the chain to recheck 3281696a8beSPeter Zijlstra * things for a task that has just got its priority adjusted, and 3291696a8beSPeter Zijlstra * is waiting on a mutex) 33082084984SThomas Gleixner * @next_lock: the mutex on which the owner of @orig_lock was blocked before 33182084984SThomas Gleixner * we dropped its pi_lock. Is never dereferenced, only used for 33282084984SThomas Gleixner * comparison to detect lock chain changes. 3331696a8beSPeter Zijlstra * @orig_waiter: rt_mutex_waiter struct for the task that has just donated 3341696a8beSPeter Zijlstra * its priority to the mutex owner (can be NULL in the case 3351696a8beSPeter Zijlstra * depicted above or if the top waiter is gone away and we are 3361696a8beSPeter Zijlstra * actually deboosting the owner) 3371696a8beSPeter Zijlstra * @top_task: the current top waiter 3381696a8beSPeter Zijlstra * 3391696a8beSPeter Zijlstra * Returns 0 or -EDEADLK. 3401696a8beSPeter Zijlstra */ 3411696a8beSPeter Zijlstra static int rt_mutex_adjust_prio_chain(struct task_struct *task, 3421696a8beSPeter Zijlstra int deadlock_detect, 3431696a8beSPeter Zijlstra struct rt_mutex *orig_lock, 34482084984SThomas Gleixner struct rt_mutex *next_lock, 3451696a8beSPeter Zijlstra struct rt_mutex_waiter *orig_waiter, 3461696a8beSPeter Zijlstra struct task_struct *top_task) 3471696a8beSPeter Zijlstra { 3481696a8beSPeter Zijlstra struct rt_mutex *lock; 3491696a8beSPeter Zijlstra struct rt_mutex_waiter *waiter, *top_waiter = orig_waiter; 3501696a8beSPeter Zijlstra int detect_deadlock, ret = 0, depth = 0; 3511696a8beSPeter Zijlstra unsigned long flags; 3521696a8beSPeter Zijlstra 3531696a8beSPeter Zijlstra detect_deadlock = debug_rt_mutex_detect_deadlock(orig_waiter, 3541696a8beSPeter Zijlstra deadlock_detect); 3551696a8beSPeter Zijlstra 3561696a8beSPeter Zijlstra /* 3571696a8beSPeter Zijlstra * The (de)boosting is a step by step approach with a lot of 3581696a8beSPeter Zijlstra * pitfalls. We want this to be preemptible and we want hold a 3591696a8beSPeter Zijlstra * maximum of two locks per step. So we have to check 3601696a8beSPeter Zijlstra * carefully whether things change under us. 3611696a8beSPeter Zijlstra */ 3621696a8beSPeter Zijlstra again: 3631696a8beSPeter Zijlstra if (++depth > max_lock_depth) { 3641696a8beSPeter Zijlstra static int prev_max; 3651696a8beSPeter Zijlstra 3661696a8beSPeter Zijlstra /* 3671696a8beSPeter Zijlstra * Print this only once. If the admin changes the limit, 3681696a8beSPeter Zijlstra * print a new message when reaching the limit again. 3691696a8beSPeter Zijlstra */ 3701696a8beSPeter Zijlstra if (prev_max != max_lock_depth) { 3711696a8beSPeter Zijlstra prev_max = max_lock_depth; 3721696a8beSPeter Zijlstra printk(KERN_WARNING "Maximum lock depth %d reached " 3731696a8beSPeter Zijlstra "task: %s (%d)\n", max_lock_depth, 3741696a8beSPeter Zijlstra top_task->comm, task_pid_nr(top_task)); 3751696a8beSPeter Zijlstra } 3761696a8beSPeter Zijlstra put_task_struct(task); 3771696a8beSPeter Zijlstra 3783d5c9340SThomas Gleixner return -EDEADLK; 3791696a8beSPeter Zijlstra } 3801696a8beSPeter Zijlstra retry: 3811696a8beSPeter Zijlstra /* 3821696a8beSPeter Zijlstra * Task can not go away as we did a get_task() before ! 3831696a8beSPeter Zijlstra */ 3841696a8beSPeter Zijlstra raw_spin_lock_irqsave(&task->pi_lock, flags); 3851696a8beSPeter Zijlstra 3861696a8beSPeter Zijlstra waiter = task->pi_blocked_on; 3871696a8beSPeter Zijlstra /* 3881696a8beSPeter Zijlstra * Check whether the end of the boosting chain has been 3891696a8beSPeter Zijlstra * reached or the state of the chain has changed while we 3901696a8beSPeter Zijlstra * dropped the locks. 3911696a8beSPeter Zijlstra */ 3921696a8beSPeter Zijlstra if (!waiter) 3931696a8beSPeter Zijlstra goto out_unlock_pi; 3941696a8beSPeter Zijlstra 3951696a8beSPeter Zijlstra /* 3961696a8beSPeter Zijlstra * Check the orig_waiter state. After we dropped the locks, 3971696a8beSPeter Zijlstra * the previous owner of the lock might have released the lock. 3981696a8beSPeter Zijlstra */ 3991696a8beSPeter Zijlstra if (orig_waiter && !rt_mutex_owner(orig_lock)) 4001696a8beSPeter Zijlstra goto out_unlock_pi; 4011696a8beSPeter Zijlstra 4021696a8beSPeter Zijlstra /* 40382084984SThomas Gleixner * We dropped all locks after taking a refcount on @task, so 40482084984SThomas Gleixner * the task might have moved on in the lock chain or even left 40582084984SThomas Gleixner * the chain completely and blocks now on an unrelated lock or 40682084984SThomas Gleixner * on @orig_lock. 40782084984SThomas Gleixner * 40882084984SThomas Gleixner * We stored the lock on which @task was blocked in @next_lock, 40982084984SThomas Gleixner * so we can detect the chain change. 41082084984SThomas Gleixner */ 41182084984SThomas Gleixner if (next_lock != waiter->lock) 41282084984SThomas Gleixner goto out_unlock_pi; 41382084984SThomas Gleixner 41482084984SThomas Gleixner /* 4151696a8beSPeter Zijlstra * Drop out, when the task has no waiters. Note, 4161696a8beSPeter Zijlstra * top_waiter can be NULL, when we are in the deboosting 4171696a8beSPeter Zijlstra * mode! 4181696a8beSPeter Zijlstra */ 419397335f0SThomas Gleixner if (top_waiter) { 420397335f0SThomas Gleixner if (!task_has_pi_waiters(task)) 4211696a8beSPeter Zijlstra goto out_unlock_pi; 422397335f0SThomas Gleixner /* 423397335f0SThomas Gleixner * If deadlock detection is off, we stop here if we 424397335f0SThomas Gleixner * are not the top pi waiter of the task. 425397335f0SThomas Gleixner */ 426397335f0SThomas Gleixner if (!detect_deadlock && top_waiter != task_top_pi_waiter(task)) 427397335f0SThomas Gleixner goto out_unlock_pi; 428397335f0SThomas Gleixner } 4291696a8beSPeter Zijlstra 4301696a8beSPeter Zijlstra /* 4311696a8beSPeter Zijlstra * When deadlock detection is off then we check, if further 4321696a8beSPeter Zijlstra * priority adjustment is necessary. 4331696a8beSPeter Zijlstra */ 4342d3d891dSDario Faggioli if (!detect_deadlock && waiter->prio == task->prio) 4351696a8beSPeter Zijlstra goto out_unlock_pi; 4361696a8beSPeter Zijlstra 4371696a8beSPeter Zijlstra lock = waiter->lock; 4381696a8beSPeter Zijlstra if (!raw_spin_trylock(&lock->wait_lock)) { 4391696a8beSPeter Zijlstra raw_spin_unlock_irqrestore(&task->pi_lock, flags); 4401696a8beSPeter Zijlstra cpu_relax(); 4411696a8beSPeter Zijlstra goto retry; 4421696a8beSPeter Zijlstra } 4431696a8beSPeter Zijlstra 444397335f0SThomas Gleixner /* 445397335f0SThomas Gleixner * Deadlock detection. If the lock is the same as the original 446397335f0SThomas Gleixner * lock which caused us to walk the lock chain or if the 447397335f0SThomas Gleixner * current lock is owned by the task which initiated the chain 448397335f0SThomas Gleixner * walk, we detected a deadlock. 449397335f0SThomas Gleixner */ 4501696a8beSPeter Zijlstra if (lock == orig_lock || rt_mutex_owner(lock) == top_task) { 4511696a8beSPeter Zijlstra debug_rt_mutex_deadlock(deadlock_detect, orig_waiter, lock); 4521696a8beSPeter Zijlstra raw_spin_unlock(&lock->wait_lock); 4533d5c9340SThomas Gleixner ret = -EDEADLK; 4541696a8beSPeter Zijlstra goto out_unlock_pi; 4551696a8beSPeter Zijlstra } 4561696a8beSPeter Zijlstra 4571696a8beSPeter Zijlstra top_waiter = rt_mutex_top_waiter(lock); 4581696a8beSPeter Zijlstra 4591696a8beSPeter Zijlstra /* Requeue the waiter */ 460fb00aca4SPeter Zijlstra rt_mutex_dequeue(lock, waiter); 4612d3d891dSDario Faggioli waiter->prio = task->prio; 462fb00aca4SPeter Zijlstra rt_mutex_enqueue(lock, waiter); 4631696a8beSPeter Zijlstra 4641696a8beSPeter Zijlstra /* Release the task */ 4651696a8beSPeter Zijlstra raw_spin_unlock_irqrestore(&task->pi_lock, flags); 4661696a8beSPeter Zijlstra if (!rt_mutex_owner(lock)) { 4671696a8beSPeter Zijlstra /* 4681696a8beSPeter Zijlstra * If the requeue above changed the top waiter, then we need 4691696a8beSPeter Zijlstra * to wake the new top waiter up to try to get the lock. 4701696a8beSPeter Zijlstra */ 4711696a8beSPeter Zijlstra 4721696a8beSPeter Zijlstra if (top_waiter != rt_mutex_top_waiter(lock)) 4731696a8beSPeter Zijlstra wake_up_process(rt_mutex_top_waiter(lock)->task); 4741696a8beSPeter Zijlstra raw_spin_unlock(&lock->wait_lock); 4751696a8beSPeter Zijlstra goto out_put_task; 4761696a8beSPeter Zijlstra } 4771696a8beSPeter Zijlstra put_task_struct(task); 4781696a8beSPeter Zijlstra 4791696a8beSPeter Zijlstra /* Grab the next task */ 4801696a8beSPeter Zijlstra task = rt_mutex_owner(lock); 4811696a8beSPeter Zijlstra get_task_struct(task); 4821696a8beSPeter Zijlstra raw_spin_lock_irqsave(&task->pi_lock, flags); 4831696a8beSPeter Zijlstra 4841696a8beSPeter Zijlstra if (waiter == rt_mutex_top_waiter(lock)) { 4851696a8beSPeter Zijlstra /* Boost the owner */ 486fb00aca4SPeter Zijlstra rt_mutex_dequeue_pi(task, top_waiter); 487fb00aca4SPeter Zijlstra rt_mutex_enqueue_pi(task, waiter); 4881696a8beSPeter Zijlstra __rt_mutex_adjust_prio(task); 4891696a8beSPeter Zijlstra 4901696a8beSPeter Zijlstra } else if (top_waiter == waiter) { 4911696a8beSPeter Zijlstra /* Deboost the owner */ 492fb00aca4SPeter Zijlstra rt_mutex_dequeue_pi(task, waiter); 4931696a8beSPeter Zijlstra waiter = rt_mutex_top_waiter(lock); 494fb00aca4SPeter Zijlstra rt_mutex_enqueue_pi(task, waiter); 4951696a8beSPeter Zijlstra __rt_mutex_adjust_prio(task); 4961696a8beSPeter Zijlstra } 4971696a8beSPeter Zijlstra 49882084984SThomas Gleixner /* 49982084984SThomas Gleixner * Check whether the task which owns the current lock is pi 50082084984SThomas Gleixner * blocked itself. If yes we store a pointer to the lock for 50182084984SThomas Gleixner * the lock chain change detection above. After we dropped 50282084984SThomas Gleixner * task->pi_lock next_lock cannot be dereferenced anymore. 50382084984SThomas Gleixner */ 50482084984SThomas Gleixner next_lock = task_blocked_on_lock(task); 50582084984SThomas Gleixner 5061696a8beSPeter Zijlstra raw_spin_unlock_irqrestore(&task->pi_lock, flags); 5071696a8beSPeter Zijlstra 5081696a8beSPeter Zijlstra top_waiter = rt_mutex_top_waiter(lock); 5091696a8beSPeter Zijlstra raw_spin_unlock(&lock->wait_lock); 5101696a8beSPeter Zijlstra 51182084984SThomas Gleixner /* 51282084984SThomas Gleixner * We reached the end of the lock chain. Stop right here. No 51382084984SThomas Gleixner * point to go back just to figure that out. 51482084984SThomas Gleixner */ 51582084984SThomas Gleixner if (!next_lock) 51682084984SThomas Gleixner goto out_put_task; 51782084984SThomas Gleixner 5181696a8beSPeter Zijlstra if (!detect_deadlock && waiter != top_waiter) 5191696a8beSPeter Zijlstra goto out_put_task; 5201696a8beSPeter Zijlstra 5211696a8beSPeter Zijlstra goto again; 5221696a8beSPeter Zijlstra 5231696a8beSPeter Zijlstra out_unlock_pi: 5241696a8beSPeter Zijlstra raw_spin_unlock_irqrestore(&task->pi_lock, flags); 5251696a8beSPeter Zijlstra out_put_task: 5261696a8beSPeter Zijlstra put_task_struct(task); 5271696a8beSPeter Zijlstra 5281696a8beSPeter Zijlstra return ret; 5291696a8beSPeter Zijlstra } 5301696a8beSPeter Zijlstra 5311696a8beSPeter Zijlstra /* 5321696a8beSPeter Zijlstra * Try to take an rt-mutex 5331696a8beSPeter Zijlstra * 5341696a8beSPeter Zijlstra * Must be called with lock->wait_lock held. 5351696a8beSPeter Zijlstra * 536*358c331fSThomas Gleixner * @lock: The lock to be acquired. 537*358c331fSThomas Gleixner * @task: The task which wants to acquire the lock 538*358c331fSThomas Gleixner * @waiter: The waiter that is queued to the lock's wait list if the 539*358c331fSThomas Gleixner * callsite called task_blocked_on_lock(), otherwise NULL 5401696a8beSPeter Zijlstra */ 5411696a8beSPeter Zijlstra static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, 5421696a8beSPeter Zijlstra struct rt_mutex_waiter *waiter) 5431696a8beSPeter Zijlstra { 544*358c331fSThomas Gleixner unsigned long flags; 545*358c331fSThomas Gleixner 5461696a8beSPeter Zijlstra /* 547*358c331fSThomas Gleixner * Before testing whether we can acquire @lock, we set the 548*358c331fSThomas Gleixner * RT_MUTEX_HAS_WAITERS bit in @lock->owner. This forces all 549*358c331fSThomas Gleixner * other tasks which try to modify @lock into the slow path 550*358c331fSThomas Gleixner * and they serialize on @lock->wait_lock. 5511696a8beSPeter Zijlstra * 552*358c331fSThomas Gleixner * The RT_MUTEX_HAS_WAITERS bit can have a transitional state 553*358c331fSThomas Gleixner * as explained at the top of this file if and only if: 5541696a8beSPeter Zijlstra * 555*358c331fSThomas Gleixner * - There is a lock owner. The caller must fixup the 556*358c331fSThomas Gleixner * transient state if it does a trylock or leaves the lock 557*358c331fSThomas Gleixner * function due to a signal or timeout. 558*358c331fSThomas Gleixner * 559*358c331fSThomas Gleixner * - @task acquires the lock and there are no other 560*358c331fSThomas Gleixner * waiters. This is undone in rt_mutex_set_owner(@task) at 561*358c331fSThomas Gleixner * the end of this function. 5621696a8beSPeter Zijlstra */ 5631696a8beSPeter Zijlstra mark_rt_mutex_waiters(lock); 5641696a8beSPeter Zijlstra 565*358c331fSThomas Gleixner /* 566*358c331fSThomas Gleixner * If @lock has an owner, give up. 567*358c331fSThomas Gleixner */ 5681696a8beSPeter Zijlstra if (rt_mutex_owner(lock)) 5691696a8beSPeter Zijlstra return 0; 5701696a8beSPeter Zijlstra 5711696a8beSPeter Zijlstra /* 572*358c331fSThomas Gleixner * If @waiter != NULL, @task has already enqueued the waiter 573*358c331fSThomas Gleixner * into @lock waiter list. If @waiter == NULL then this is a 574*358c331fSThomas Gleixner * trylock attempt. 575*358c331fSThomas Gleixner */ 576*358c331fSThomas Gleixner if (waiter) { 577*358c331fSThomas Gleixner /* 578*358c331fSThomas Gleixner * If waiter is not the highest priority waiter of 579*358c331fSThomas Gleixner * @lock, give up. 580*358c331fSThomas Gleixner */ 581*358c331fSThomas Gleixner if (waiter != rt_mutex_top_waiter(lock)) 582*358c331fSThomas Gleixner return 0; 583*358c331fSThomas Gleixner 584*358c331fSThomas Gleixner /* 585*358c331fSThomas Gleixner * We can acquire the lock. Remove the waiter from the 586*358c331fSThomas Gleixner * lock waiters list. 587*358c331fSThomas Gleixner */ 588*358c331fSThomas Gleixner rt_mutex_dequeue(lock, waiter); 589*358c331fSThomas Gleixner 590*358c331fSThomas Gleixner } else { 591*358c331fSThomas Gleixner /* 592*358c331fSThomas Gleixner * If the lock has waiters already we check whether @task is 593*358c331fSThomas Gleixner * eligible to take over the lock. 594*358c331fSThomas Gleixner * 595*358c331fSThomas Gleixner * If there are no other waiters, @task can acquire 596*358c331fSThomas Gleixner * the lock. @task->pi_blocked_on is NULL, so it does 597*358c331fSThomas Gleixner * not need to be dequeued. 5981696a8beSPeter Zijlstra */ 5991696a8beSPeter Zijlstra if (rt_mutex_has_waiters(lock)) { 600*358c331fSThomas Gleixner /* 601*358c331fSThomas Gleixner * If @task->prio is greater than or equal to 602*358c331fSThomas Gleixner * the top waiter priority (kernel view), 603*358c331fSThomas Gleixner * @task lost. 604*358c331fSThomas Gleixner */ 605*358c331fSThomas Gleixner if (task->prio >= rt_mutex_top_waiter(lock)->prio) 6061696a8beSPeter Zijlstra return 0; 607*358c331fSThomas Gleixner 608*358c331fSThomas Gleixner /* 609*358c331fSThomas Gleixner * The current top waiter stays enqueued. We 610*358c331fSThomas Gleixner * don't have to change anything in the lock 611*358c331fSThomas Gleixner * waiters order. 612*358c331fSThomas Gleixner */ 613*358c331fSThomas Gleixner } else { 614*358c331fSThomas Gleixner /* 615*358c331fSThomas Gleixner * No waiters. Take the lock without the 616*358c331fSThomas Gleixner * pi_lock dance.@task->pi_blocked_on is NULL 617*358c331fSThomas Gleixner * and we have no waiters to enqueue in @task 618*358c331fSThomas Gleixner * pi waiters list. 619*358c331fSThomas Gleixner */ 620*358c331fSThomas Gleixner goto takeit; 6211696a8beSPeter Zijlstra } 6221696a8beSPeter Zijlstra } 6231696a8beSPeter Zijlstra 6241696a8beSPeter Zijlstra /* 625*358c331fSThomas Gleixner * Clear @task->pi_blocked_on. Requires protection by 626*358c331fSThomas Gleixner * @task->pi_lock. Redundant operation for the @waiter == NULL 627*358c331fSThomas Gleixner * case, but conditionals are more expensive than a redundant 628*358c331fSThomas Gleixner * store. 6291696a8beSPeter Zijlstra */ 630*358c331fSThomas Gleixner raw_spin_lock_irqsave(&task->pi_lock, flags); 631*358c331fSThomas Gleixner task->pi_blocked_on = NULL; 632*358c331fSThomas Gleixner /* 633*358c331fSThomas Gleixner * Finish the lock acquisition. @task is the new owner. If 634*358c331fSThomas Gleixner * other waiters exist we have to insert the highest priority 635*358c331fSThomas Gleixner * waiter into @task->pi_waiters list. 636*358c331fSThomas Gleixner */ 637*358c331fSThomas Gleixner if (rt_mutex_has_waiters(lock)) 638*358c331fSThomas Gleixner rt_mutex_enqueue_pi(task, rt_mutex_top_waiter(lock)); 6391696a8beSPeter Zijlstra raw_spin_unlock_irqrestore(&task->pi_lock, flags); 6401696a8beSPeter Zijlstra 641*358c331fSThomas Gleixner takeit: 6421696a8beSPeter Zijlstra /* We got the lock. */ 6431696a8beSPeter Zijlstra debug_rt_mutex_lock(lock); 6441696a8beSPeter Zijlstra 645*358c331fSThomas Gleixner /* 646*358c331fSThomas Gleixner * This either preserves the RT_MUTEX_HAS_WAITERS bit if there 647*358c331fSThomas Gleixner * are still waiters or clears it. 648*358c331fSThomas Gleixner */ 6491696a8beSPeter Zijlstra rt_mutex_set_owner(lock, task); 6501696a8beSPeter Zijlstra 6511696a8beSPeter Zijlstra rt_mutex_deadlock_account_lock(lock, task); 6521696a8beSPeter Zijlstra 6531696a8beSPeter Zijlstra return 1; 6541696a8beSPeter Zijlstra } 6551696a8beSPeter Zijlstra 6561696a8beSPeter Zijlstra /* 6571696a8beSPeter Zijlstra * Task blocks on lock. 6581696a8beSPeter Zijlstra * 6591696a8beSPeter Zijlstra * Prepare waiter and propagate pi chain 6601696a8beSPeter Zijlstra * 6611696a8beSPeter Zijlstra * This must be called with lock->wait_lock held. 6621696a8beSPeter Zijlstra */ 6631696a8beSPeter Zijlstra static int task_blocks_on_rt_mutex(struct rt_mutex *lock, 6641696a8beSPeter Zijlstra struct rt_mutex_waiter *waiter, 6651696a8beSPeter Zijlstra struct task_struct *task, 6661696a8beSPeter Zijlstra int detect_deadlock) 6671696a8beSPeter Zijlstra { 6681696a8beSPeter Zijlstra struct task_struct *owner = rt_mutex_owner(lock); 6691696a8beSPeter Zijlstra struct rt_mutex_waiter *top_waiter = waiter; 67082084984SThomas Gleixner struct rt_mutex *next_lock; 6711696a8beSPeter Zijlstra int chain_walk = 0, res; 67282084984SThomas Gleixner unsigned long flags; 6731696a8beSPeter Zijlstra 674397335f0SThomas Gleixner /* 675397335f0SThomas Gleixner * Early deadlock detection. We really don't want the task to 676397335f0SThomas Gleixner * enqueue on itself just to untangle the mess later. It's not 677397335f0SThomas Gleixner * only an optimization. We drop the locks, so another waiter 678397335f0SThomas Gleixner * can come in before the chain walk detects the deadlock. So 679397335f0SThomas Gleixner * the other will detect the deadlock and return -EDEADLOCK, 680397335f0SThomas Gleixner * which is wrong, as the other waiter is not in a deadlock 681397335f0SThomas Gleixner * situation. 682397335f0SThomas Gleixner */ 6833d5c9340SThomas Gleixner if (owner == task) 684397335f0SThomas Gleixner return -EDEADLK; 685397335f0SThomas Gleixner 6861696a8beSPeter Zijlstra raw_spin_lock_irqsave(&task->pi_lock, flags); 6871696a8beSPeter Zijlstra __rt_mutex_adjust_prio(task); 6881696a8beSPeter Zijlstra waiter->task = task; 6891696a8beSPeter Zijlstra waiter->lock = lock; 6902d3d891dSDario Faggioli waiter->prio = task->prio; 6911696a8beSPeter Zijlstra 6921696a8beSPeter Zijlstra /* Get the top priority waiter on the lock */ 6931696a8beSPeter Zijlstra if (rt_mutex_has_waiters(lock)) 6941696a8beSPeter Zijlstra top_waiter = rt_mutex_top_waiter(lock); 695fb00aca4SPeter Zijlstra rt_mutex_enqueue(lock, waiter); 6961696a8beSPeter Zijlstra 6971696a8beSPeter Zijlstra task->pi_blocked_on = waiter; 6981696a8beSPeter Zijlstra 6991696a8beSPeter Zijlstra raw_spin_unlock_irqrestore(&task->pi_lock, flags); 7001696a8beSPeter Zijlstra 7011696a8beSPeter Zijlstra if (!owner) 7021696a8beSPeter Zijlstra return 0; 7031696a8beSPeter Zijlstra 7041696a8beSPeter Zijlstra raw_spin_lock_irqsave(&owner->pi_lock, flags); 70582084984SThomas Gleixner if (waiter == rt_mutex_top_waiter(lock)) { 706fb00aca4SPeter Zijlstra rt_mutex_dequeue_pi(owner, top_waiter); 707fb00aca4SPeter Zijlstra rt_mutex_enqueue_pi(owner, waiter); 7081696a8beSPeter Zijlstra 7091696a8beSPeter Zijlstra __rt_mutex_adjust_prio(owner); 7101696a8beSPeter Zijlstra if (owner->pi_blocked_on) 7111696a8beSPeter Zijlstra chain_walk = 1; 71282084984SThomas Gleixner } else if (debug_rt_mutex_detect_deadlock(waiter, detect_deadlock)) { 7131696a8beSPeter Zijlstra chain_walk = 1; 71482084984SThomas Gleixner } 7151696a8beSPeter Zijlstra 71682084984SThomas Gleixner /* Store the lock on which owner is blocked or NULL */ 71782084984SThomas Gleixner next_lock = task_blocked_on_lock(owner); 71882084984SThomas Gleixner 71982084984SThomas Gleixner raw_spin_unlock_irqrestore(&owner->pi_lock, flags); 72082084984SThomas Gleixner /* 72182084984SThomas Gleixner * Even if full deadlock detection is on, if the owner is not 72282084984SThomas Gleixner * blocked itself, we can avoid finding this out in the chain 72382084984SThomas Gleixner * walk. 72482084984SThomas Gleixner */ 72582084984SThomas Gleixner if (!chain_walk || !next_lock) 7261696a8beSPeter Zijlstra return 0; 7271696a8beSPeter Zijlstra 7281696a8beSPeter Zijlstra /* 7291696a8beSPeter Zijlstra * The owner can't disappear while holding a lock, 7301696a8beSPeter Zijlstra * so the owner struct is protected by wait_lock. 7311696a8beSPeter Zijlstra * Gets dropped in rt_mutex_adjust_prio_chain()! 7321696a8beSPeter Zijlstra */ 7331696a8beSPeter Zijlstra get_task_struct(owner); 7341696a8beSPeter Zijlstra 7351696a8beSPeter Zijlstra raw_spin_unlock(&lock->wait_lock); 7361696a8beSPeter Zijlstra 73782084984SThomas Gleixner res = rt_mutex_adjust_prio_chain(owner, detect_deadlock, lock, 73882084984SThomas Gleixner next_lock, waiter, task); 7391696a8beSPeter Zijlstra 7401696a8beSPeter Zijlstra raw_spin_lock(&lock->wait_lock); 7411696a8beSPeter Zijlstra 7421696a8beSPeter Zijlstra return res; 7431696a8beSPeter Zijlstra } 7441696a8beSPeter Zijlstra 7451696a8beSPeter Zijlstra /* 7461696a8beSPeter Zijlstra * Wake up the next waiter on the lock. 7471696a8beSPeter Zijlstra * 74827e35715SThomas Gleixner * Remove the top waiter from the current tasks pi waiter list and 74927e35715SThomas Gleixner * wake it up. 7501696a8beSPeter Zijlstra * 7511696a8beSPeter Zijlstra * Called with lock->wait_lock held. 7521696a8beSPeter Zijlstra */ 7531696a8beSPeter Zijlstra static void wakeup_next_waiter(struct rt_mutex *lock) 7541696a8beSPeter Zijlstra { 7551696a8beSPeter Zijlstra struct rt_mutex_waiter *waiter; 7561696a8beSPeter Zijlstra unsigned long flags; 7571696a8beSPeter Zijlstra 7581696a8beSPeter Zijlstra raw_spin_lock_irqsave(¤t->pi_lock, flags); 7591696a8beSPeter Zijlstra 7601696a8beSPeter Zijlstra waiter = rt_mutex_top_waiter(lock); 7611696a8beSPeter Zijlstra 7621696a8beSPeter Zijlstra /* 7631696a8beSPeter Zijlstra * Remove it from current->pi_waiters. We do not adjust a 7641696a8beSPeter Zijlstra * possible priority boost right now. We execute wakeup in the 7651696a8beSPeter Zijlstra * boosted mode and go back to normal after releasing 7661696a8beSPeter Zijlstra * lock->wait_lock. 7671696a8beSPeter Zijlstra */ 768fb00aca4SPeter Zijlstra rt_mutex_dequeue_pi(current, waiter); 7691696a8beSPeter Zijlstra 77027e35715SThomas Gleixner /* 77127e35715SThomas Gleixner * As we are waking up the top waiter, and the waiter stays 77227e35715SThomas Gleixner * queued on the lock until it gets the lock, this lock 77327e35715SThomas Gleixner * obviously has waiters. Just set the bit here and this has 77427e35715SThomas Gleixner * the added benefit of forcing all new tasks into the 77527e35715SThomas Gleixner * slow path making sure no task of lower priority than 77627e35715SThomas Gleixner * the top waiter can steal this lock. 77727e35715SThomas Gleixner */ 77827e35715SThomas Gleixner lock->owner = (void *) RT_MUTEX_HAS_WAITERS; 7791696a8beSPeter Zijlstra 7801696a8beSPeter Zijlstra raw_spin_unlock_irqrestore(¤t->pi_lock, flags); 7811696a8beSPeter Zijlstra 78227e35715SThomas Gleixner /* 78327e35715SThomas Gleixner * It's safe to dereference waiter as it cannot go away as 78427e35715SThomas Gleixner * long as we hold lock->wait_lock. The waiter task needs to 78527e35715SThomas Gleixner * acquire it in order to dequeue the waiter. 78627e35715SThomas Gleixner */ 7871696a8beSPeter Zijlstra wake_up_process(waiter->task); 7881696a8beSPeter Zijlstra } 7891696a8beSPeter Zijlstra 7901696a8beSPeter Zijlstra /* 7911696a8beSPeter Zijlstra * Remove a waiter from a lock and give up 7921696a8beSPeter Zijlstra * 7931696a8beSPeter Zijlstra * Must be called with lock->wait_lock held and 7941696a8beSPeter Zijlstra * have just failed to try_to_take_rt_mutex(). 7951696a8beSPeter Zijlstra */ 7961696a8beSPeter Zijlstra static void remove_waiter(struct rt_mutex *lock, 7971696a8beSPeter Zijlstra struct rt_mutex_waiter *waiter) 7981696a8beSPeter Zijlstra { 7991696a8beSPeter Zijlstra int first = (waiter == rt_mutex_top_waiter(lock)); 8001696a8beSPeter Zijlstra struct task_struct *owner = rt_mutex_owner(lock); 80182084984SThomas Gleixner struct rt_mutex *next_lock = NULL; 8021696a8beSPeter Zijlstra unsigned long flags; 8031696a8beSPeter Zijlstra 8041696a8beSPeter Zijlstra raw_spin_lock_irqsave(¤t->pi_lock, flags); 805fb00aca4SPeter Zijlstra rt_mutex_dequeue(lock, waiter); 8061696a8beSPeter Zijlstra current->pi_blocked_on = NULL; 8071696a8beSPeter Zijlstra raw_spin_unlock_irqrestore(¤t->pi_lock, flags); 8081696a8beSPeter Zijlstra 8091696a8beSPeter Zijlstra if (!owner) 8101696a8beSPeter Zijlstra return; 8111696a8beSPeter Zijlstra 8121696a8beSPeter Zijlstra if (first) { 8131696a8beSPeter Zijlstra 8141696a8beSPeter Zijlstra raw_spin_lock_irqsave(&owner->pi_lock, flags); 8151696a8beSPeter Zijlstra 816fb00aca4SPeter Zijlstra rt_mutex_dequeue_pi(owner, waiter); 8171696a8beSPeter Zijlstra 8181696a8beSPeter Zijlstra if (rt_mutex_has_waiters(lock)) { 8191696a8beSPeter Zijlstra struct rt_mutex_waiter *next; 8201696a8beSPeter Zijlstra 8211696a8beSPeter Zijlstra next = rt_mutex_top_waiter(lock); 822fb00aca4SPeter Zijlstra rt_mutex_enqueue_pi(owner, next); 8231696a8beSPeter Zijlstra } 8241696a8beSPeter Zijlstra __rt_mutex_adjust_prio(owner); 8251696a8beSPeter Zijlstra 82682084984SThomas Gleixner /* Store the lock on which owner is blocked or NULL */ 82782084984SThomas Gleixner next_lock = task_blocked_on_lock(owner); 8281696a8beSPeter Zijlstra 8291696a8beSPeter Zijlstra raw_spin_unlock_irqrestore(&owner->pi_lock, flags); 8301696a8beSPeter Zijlstra } 8311696a8beSPeter Zijlstra 83282084984SThomas Gleixner if (!next_lock) 8331696a8beSPeter Zijlstra return; 8341696a8beSPeter Zijlstra 8351696a8beSPeter Zijlstra /* gets dropped in rt_mutex_adjust_prio_chain()! */ 8361696a8beSPeter Zijlstra get_task_struct(owner); 8371696a8beSPeter Zijlstra 8381696a8beSPeter Zijlstra raw_spin_unlock(&lock->wait_lock); 8391696a8beSPeter Zijlstra 84082084984SThomas Gleixner rt_mutex_adjust_prio_chain(owner, 0, lock, next_lock, NULL, current); 8411696a8beSPeter Zijlstra 8421696a8beSPeter Zijlstra raw_spin_lock(&lock->wait_lock); 8431696a8beSPeter Zijlstra } 8441696a8beSPeter Zijlstra 8451696a8beSPeter Zijlstra /* 8461696a8beSPeter Zijlstra * Recheck the pi chain, in case we got a priority setting 8471696a8beSPeter Zijlstra * 8481696a8beSPeter Zijlstra * Called from sched_setscheduler 8491696a8beSPeter Zijlstra */ 8501696a8beSPeter Zijlstra void rt_mutex_adjust_pi(struct task_struct *task) 8511696a8beSPeter Zijlstra { 8521696a8beSPeter Zijlstra struct rt_mutex_waiter *waiter; 85382084984SThomas Gleixner struct rt_mutex *next_lock; 8541696a8beSPeter Zijlstra unsigned long flags; 8551696a8beSPeter Zijlstra 8561696a8beSPeter Zijlstra raw_spin_lock_irqsave(&task->pi_lock, flags); 8571696a8beSPeter Zijlstra 8581696a8beSPeter Zijlstra waiter = task->pi_blocked_on; 8592d3d891dSDario Faggioli if (!waiter || (waiter->prio == task->prio && 8602d3d891dSDario Faggioli !dl_prio(task->prio))) { 8611696a8beSPeter Zijlstra raw_spin_unlock_irqrestore(&task->pi_lock, flags); 8621696a8beSPeter Zijlstra return; 8631696a8beSPeter Zijlstra } 86482084984SThomas Gleixner next_lock = waiter->lock; 8651696a8beSPeter Zijlstra raw_spin_unlock_irqrestore(&task->pi_lock, flags); 8661696a8beSPeter Zijlstra 8671696a8beSPeter Zijlstra /* gets dropped in rt_mutex_adjust_prio_chain()! */ 8681696a8beSPeter Zijlstra get_task_struct(task); 86982084984SThomas Gleixner 87082084984SThomas Gleixner rt_mutex_adjust_prio_chain(task, 0, NULL, next_lock, NULL, task); 8711696a8beSPeter Zijlstra } 8721696a8beSPeter Zijlstra 8731696a8beSPeter Zijlstra /** 8741696a8beSPeter Zijlstra * __rt_mutex_slowlock() - Perform the wait-wake-try-to-take loop 8751696a8beSPeter Zijlstra * @lock: the rt_mutex to take 8761696a8beSPeter Zijlstra * @state: the state the task should block in (TASK_INTERRUPTIBLE 8771696a8beSPeter Zijlstra * or TASK_UNINTERRUPTIBLE) 8781696a8beSPeter Zijlstra * @timeout: the pre-initialized and started timer, or NULL for none 8791696a8beSPeter Zijlstra * @waiter: the pre-initialized rt_mutex_waiter 8801696a8beSPeter Zijlstra * 8811696a8beSPeter Zijlstra * lock->wait_lock must be held by the caller. 8821696a8beSPeter Zijlstra */ 8831696a8beSPeter Zijlstra static int __sched 8841696a8beSPeter Zijlstra __rt_mutex_slowlock(struct rt_mutex *lock, int state, 8851696a8beSPeter Zijlstra struct hrtimer_sleeper *timeout, 8861696a8beSPeter Zijlstra struct rt_mutex_waiter *waiter) 8871696a8beSPeter Zijlstra { 8881696a8beSPeter Zijlstra int ret = 0; 8891696a8beSPeter Zijlstra 8901696a8beSPeter Zijlstra for (;;) { 8911696a8beSPeter Zijlstra /* Try to acquire the lock: */ 8921696a8beSPeter Zijlstra if (try_to_take_rt_mutex(lock, current, waiter)) 8931696a8beSPeter Zijlstra break; 8941696a8beSPeter Zijlstra 8951696a8beSPeter Zijlstra /* 8961696a8beSPeter Zijlstra * TASK_INTERRUPTIBLE checks for signals and 8971696a8beSPeter Zijlstra * timeout. Ignored otherwise. 8981696a8beSPeter Zijlstra */ 8991696a8beSPeter Zijlstra if (unlikely(state == TASK_INTERRUPTIBLE)) { 9001696a8beSPeter Zijlstra /* Signal pending? */ 9011696a8beSPeter Zijlstra if (signal_pending(current)) 9021696a8beSPeter Zijlstra ret = -EINTR; 9031696a8beSPeter Zijlstra if (timeout && !timeout->task) 9041696a8beSPeter Zijlstra ret = -ETIMEDOUT; 9051696a8beSPeter Zijlstra if (ret) 9061696a8beSPeter Zijlstra break; 9071696a8beSPeter Zijlstra } 9081696a8beSPeter Zijlstra 9091696a8beSPeter Zijlstra raw_spin_unlock(&lock->wait_lock); 9101696a8beSPeter Zijlstra 9111696a8beSPeter Zijlstra debug_rt_mutex_print_deadlock(waiter); 9121696a8beSPeter Zijlstra 9131696a8beSPeter Zijlstra schedule_rt_mutex(lock); 9141696a8beSPeter Zijlstra 9151696a8beSPeter Zijlstra raw_spin_lock(&lock->wait_lock); 9161696a8beSPeter Zijlstra set_current_state(state); 9171696a8beSPeter Zijlstra } 9181696a8beSPeter Zijlstra 9191696a8beSPeter Zijlstra return ret; 9201696a8beSPeter Zijlstra } 9211696a8beSPeter Zijlstra 9223d5c9340SThomas Gleixner static void rt_mutex_handle_deadlock(int res, int detect_deadlock, 9233d5c9340SThomas Gleixner struct rt_mutex_waiter *w) 9243d5c9340SThomas Gleixner { 9253d5c9340SThomas Gleixner /* 9263d5c9340SThomas Gleixner * If the result is not -EDEADLOCK or the caller requested 9273d5c9340SThomas Gleixner * deadlock detection, nothing to do here. 9283d5c9340SThomas Gleixner */ 9293d5c9340SThomas Gleixner if (res != -EDEADLOCK || detect_deadlock) 9303d5c9340SThomas Gleixner return; 9313d5c9340SThomas Gleixner 9323d5c9340SThomas Gleixner /* 9333d5c9340SThomas Gleixner * Yell lowdly and stop the task right here. 9343d5c9340SThomas Gleixner */ 9353d5c9340SThomas Gleixner rt_mutex_print_deadlock(w); 9363d5c9340SThomas Gleixner while (1) { 9373d5c9340SThomas Gleixner set_current_state(TASK_INTERRUPTIBLE); 9383d5c9340SThomas Gleixner schedule(); 9393d5c9340SThomas Gleixner } 9403d5c9340SThomas Gleixner } 9413d5c9340SThomas Gleixner 9421696a8beSPeter Zijlstra /* 9431696a8beSPeter Zijlstra * Slow path lock function: 9441696a8beSPeter Zijlstra */ 9451696a8beSPeter Zijlstra static int __sched 9461696a8beSPeter Zijlstra rt_mutex_slowlock(struct rt_mutex *lock, int state, 9471696a8beSPeter Zijlstra struct hrtimer_sleeper *timeout, 9481696a8beSPeter Zijlstra int detect_deadlock) 9491696a8beSPeter Zijlstra { 9501696a8beSPeter Zijlstra struct rt_mutex_waiter waiter; 9511696a8beSPeter Zijlstra int ret = 0; 9521696a8beSPeter Zijlstra 9531696a8beSPeter Zijlstra debug_rt_mutex_init_waiter(&waiter); 954fb00aca4SPeter Zijlstra RB_CLEAR_NODE(&waiter.pi_tree_entry); 955fb00aca4SPeter Zijlstra RB_CLEAR_NODE(&waiter.tree_entry); 9561696a8beSPeter Zijlstra 9571696a8beSPeter Zijlstra raw_spin_lock(&lock->wait_lock); 9581696a8beSPeter Zijlstra 9591696a8beSPeter Zijlstra /* Try to acquire the lock again: */ 9601696a8beSPeter Zijlstra if (try_to_take_rt_mutex(lock, current, NULL)) { 9611696a8beSPeter Zijlstra raw_spin_unlock(&lock->wait_lock); 9621696a8beSPeter Zijlstra return 0; 9631696a8beSPeter Zijlstra } 9641696a8beSPeter Zijlstra 9651696a8beSPeter Zijlstra set_current_state(state); 9661696a8beSPeter Zijlstra 9671696a8beSPeter Zijlstra /* Setup the timer, when timeout != NULL */ 9681696a8beSPeter Zijlstra if (unlikely(timeout)) { 9691696a8beSPeter Zijlstra hrtimer_start_expires(&timeout->timer, HRTIMER_MODE_ABS); 9701696a8beSPeter Zijlstra if (!hrtimer_active(&timeout->timer)) 9711696a8beSPeter Zijlstra timeout->task = NULL; 9721696a8beSPeter Zijlstra } 9731696a8beSPeter Zijlstra 9741696a8beSPeter Zijlstra ret = task_blocks_on_rt_mutex(lock, &waiter, current, detect_deadlock); 9751696a8beSPeter Zijlstra 9761696a8beSPeter Zijlstra if (likely(!ret)) 9771696a8beSPeter Zijlstra ret = __rt_mutex_slowlock(lock, state, timeout, &waiter); 9781696a8beSPeter Zijlstra 9791696a8beSPeter Zijlstra set_current_state(TASK_RUNNING); 9801696a8beSPeter Zijlstra 9813d5c9340SThomas Gleixner if (unlikely(ret)) { 9821696a8beSPeter Zijlstra remove_waiter(lock, &waiter); 9833d5c9340SThomas Gleixner rt_mutex_handle_deadlock(ret, detect_deadlock, &waiter); 9843d5c9340SThomas Gleixner } 9851696a8beSPeter Zijlstra 9861696a8beSPeter Zijlstra /* 9871696a8beSPeter Zijlstra * try_to_take_rt_mutex() sets the waiter bit 9881696a8beSPeter Zijlstra * unconditionally. We might have to fix that up. 9891696a8beSPeter Zijlstra */ 9901696a8beSPeter Zijlstra fixup_rt_mutex_waiters(lock); 9911696a8beSPeter Zijlstra 9921696a8beSPeter Zijlstra raw_spin_unlock(&lock->wait_lock); 9931696a8beSPeter Zijlstra 9941696a8beSPeter Zijlstra /* Remove pending timer: */ 9951696a8beSPeter Zijlstra if (unlikely(timeout)) 9961696a8beSPeter Zijlstra hrtimer_cancel(&timeout->timer); 9971696a8beSPeter Zijlstra 9981696a8beSPeter Zijlstra debug_rt_mutex_free_waiter(&waiter); 9991696a8beSPeter Zijlstra 10001696a8beSPeter Zijlstra return ret; 10011696a8beSPeter Zijlstra } 10021696a8beSPeter Zijlstra 10031696a8beSPeter Zijlstra /* 10041696a8beSPeter Zijlstra * Slow path try-lock function: 10051696a8beSPeter Zijlstra */ 100688f2b4c1SThomas Gleixner static inline int rt_mutex_slowtrylock(struct rt_mutex *lock) 10071696a8beSPeter Zijlstra { 100888f2b4c1SThomas Gleixner int ret; 10091696a8beSPeter Zijlstra 101088f2b4c1SThomas Gleixner /* 101188f2b4c1SThomas Gleixner * If the lock already has an owner we fail to get the lock. 101288f2b4c1SThomas Gleixner * This can be done without taking the @lock->wait_lock as 101388f2b4c1SThomas Gleixner * it is only being read, and this is a trylock anyway. 101488f2b4c1SThomas Gleixner */ 101588f2b4c1SThomas Gleixner if (rt_mutex_owner(lock)) 101688f2b4c1SThomas Gleixner return 0; 101788f2b4c1SThomas Gleixner 101888f2b4c1SThomas Gleixner /* 101988f2b4c1SThomas Gleixner * The mutex has currently no owner. Lock the wait lock and 102088f2b4c1SThomas Gleixner * try to acquire the lock. 102188f2b4c1SThomas Gleixner */ 10221696a8beSPeter Zijlstra raw_spin_lock(&lock->wait_lock); 10231696a8beSPeter Zijlstra 10241696a8beSPeter Zijlstra ret = try_to_take_rt_mutex(lock, current, NULL); 102588f2b4c1SThomas Gleixner 10261696a8beSPeter Zijlstra /* 102788f2b4c1SThomas Gleixner * try_to_take_rt_mutex() sets the lock waiters bit 102888f2b4c1SThomas Gleixner * unconditionally. Clean this up. 10291696a8beSPeter Zijlstra */ 10301696a8beSPeter Zijlstra fixup_rt_mutex_waiters(lock); 10311696a8beSPeter Zijlstra 10321696a8beSPeter Zijlstra raw_spin_unlock(&lock->wait_lock); 10331696a8beSPeter Zijlstra 10341696a8beSPeter Zijlstra return ret; 10351696a8beSPeter Zijlstra } 10361696a8beSPeter Zijlstra 10371696a8beSPeter Zijlstra /* 10381696a8beSPeter Zijlstra * Slow path to release a rt-mutex: 10391696a8beSPeter Zijlstra */ 10401696a8beSPeter Zijlstra static void __sched 10411696a8beSPeter Zijlstra rt_mutex_slowunlock(struct rt_mutex *lock) 10421696a8beSPeter Zijlstra { 10431696a8beSPeter Zijlstra raw_spin_lock(&lock->wait_lock); 10441696a8beSPeter Zijlstra 10451696a8beSPeter Zijlstra debug_rt_mutex_unlock(lock); 10461696a8beSPeter Zijlstra 10471696a8beSPeter Zijlstra rt_mutex_deadlock_account_unlock(current); 10481696a8beSPeter Zijlstra 104927e35715SThomas Gleixner /* 105027e35715SThomas Gleixner * We must be careful here if the fast path is enabled. If we 105127e35715SThomas Gleixner * have no waiters queued we cannot set owner to NULL here 105227e35715SThomas Gleixner * because of: 105327e35715SThomas Gleixner * 105427e35715SThomas Gleixner * foo->lock->owner = NULL; 105527e35715SThomas Gleixner * rtmutex_lock(foo->lock); <- fast path 105627e35715SThomas Gleixner * free = atomic_dec_and_test(foo->refcnt); 105727e35715SThomas Gleixner * rtmutex_unlock(foo->lock); <- fast path 105827e35715SThomas Gleixner * if (free) 105927e35715SThomas Gleixner * kfree(foo); 106027e35715SThomas Gleixner * raw_spin_unlock(foo->lock->wait_lock); 106127e35715SThomas Gleixner * 106227e35715SThomas Gleixner * So for the fastpath enabled kernel: 106327e35715SThomas Gleixner * 106427e35715SThomas Gleixner * Nothing can set the waiters bit as long as we hold 106527e35715SThomas Gleixner * lock->wait_lock. So we do the following sequence: 106627e35715SThomas Gleixner * 106727e35715SThomas Gleixner * owner = rt_mutex_owner(lock); 106827e35715SThomas Gleixner * clear_rt_mutex_waiters(lock); 106927e35715SThomas Gleixner * raw_spin_unlock(&lock->wait_lock); 107027e35715SThomas Gleixner * if (cmpxchg(&lock->owner, owner, 0) == owner) 107127e35715SThomas Gleixner * return; 107227e35715SThomas Gleixner * goto retry; 107327e35715SThomas Gleixner * 107427e35715SThomas Gleixner * The fastpath disabled variant is simple as all access to 107527e35715SThomas Gleixner * lock->owner is serialized by lock->wait_lock: 107627e35715SThomas Gleixner * 107727e35715SThomas Gleixner * lock->owner = NULL; 107827e35715SThomas Gleixner * raw_spin_unlock(&lock->wait_lock); 107927e35715SThomas Gleixner */ 108027e35715SThomas Gleixner while (!rt_mutex_has_waiters(lock)) { 108127e35715SThomas Gleixner /* Drops lock->wait_lock ! */ 108227e35715SThomas Gleixner if (unlock_rt_mutex_safe(lock) == true) 10831696a8beSPeter Zijlstra return; 108427e35715SThomas Gleixner /* Relock the rtmutex and try again */ 108527e35715SThomas Gleixner raw_spin_lock(&lock->wait_lock); 10861696a8beSPeter Zijlstra } 10871696a8beSPeter Zijlstra 108827e35715SThomas Gleixner /* 108927e35715SThomas Gleixner * The wakeup next waiter path does not suffer from the above 109027e35715SThomas Gleixner * race. See the comments there. 109127e35715SThomas Gleixner */ 10921696a8beSPeter Zijlstra wakeup_next_waiter(lock); 10931696a8beSPeter Zijlstra 10941696a8beSPeter Zijlstra raw_spin_unlock(&lock->wait_lock); 10951696a8beSPeter Zijlstra 10961696a8beSPeter Zijlstra /* Undo pi boosting if necessary: */ 10971696a8beSPeter Zijlstra rt_mutex_adjust_prio(current); 10981696a8beSPeter Zijlstra } 10991696a8beSPeter Zijlstra 11001696a8beSPeter Zijlstra /* 11011696a8beSPeter Zijlstra * debug aware fast / slowpath lock,trylock,unlock 11021696a8beSPeter Zijlstra * 11031696a8beSPeter Zijlstra * The atomic acquire/release ops are compiled away, when either the 11041696a8beSPeter Zijlstra * architecture does not support cmpxchg or when debugging is enabled. 11051696a8beSPeter Zijlstra */ 11061696a8beSPeter Zijlstra static inline int 11071696a8beSPeter Zijlstra rt_mutex_fastlock(struct rt_mutex *lock, int state, 11081696a8beSPeter Zijlstra int detect_deadlock, 11091696a8beSPeter Zijlstra int (*slowfn)(struct rt_mutex *lock, int state, 11101696a8beSPeter Zijlstra struct hrtimer_sleeper *timeout, 11111696a8beSPeter Zijlstra int detect_deadlock)) 11121696a8beSPeter Zijlstra { 11131696a8beSPeter Zijlstra if (!detect_deadlock && likely(rt_mutex_cmpxchg(lock, NULL, current))) { 11141696a8beSPeter Zijlstra rt_mutex_deadlock_account_lock(lock, current); 11151696a8beSPeter Zijlstra return 0; 11161696a8beSPeter Zijlstra } else 11171696a8beSPeter Zijlstra return slowfn(lock, state, NULL, detect_deadlock); 11181696a8beSPeter Zijlstra } 11191696a8beSPeter Zijlstra 11201696a8beSPeter Zijlstra static inline int 11211696a8beSPeter Zijlstra rt_mutex_timed_fastlock(struct rt_mutex *lock, int state, 11221696a8beSPeter Zijlstra struct hrtimer_sleeper *timeout, int detect_deadlock, 11231696a8beSPeter Zijlstra int (*slowfn)(struct rt_mutex *lock, int state, 11241696a8beSPeter Zijlstra struct hrtimer_sleeper *timeout, 11251696a8beSPeter Zijlstra int detect_deadlock)) 11261696a8beSPeter Zijlstra { 11271696a8beSPeter Zijlstra if (!detect_deadlock && likely(rt_mutex_cmpxchg(lock, NULL, current))) { 11281696a8beSPeter Zijlstra rt_mutex_deadlock_account_lock(lock, current); 11291696a8beSPeter Zijlstra return 0; 11301696a8beSPeter Zijlstra } else 11311696a8beSPeter Zijlstra return slowfn(lock, state, timeout, detect_deadlock); 11321696a8beSPeter Zijlstra } 11331696a8beSPeter Zijlstra 11341696a8beSPeter Zijlstra static inline int 11351696a8beSPeter Zijlstra rt_mutex_fasttrylock(struct rt_mutex *lock, 11361696a8beSPeter Zijlstra int (*slowfn)(struct rt_mutex *lock)) 11371696a8beSPeter Zijlstra { 11381696a8beSPeter Zijlstra if (likely(rt_mutex_cmpxchg(lock, NULL, current))) { 11391696a8beSPeter Zijlstra rt_mutex_deadlock_account_lock(lock, current); 11401696a8beSPeter Zijlstra return 1; 11411696a8beSPeter Zijlstra } 11421696a8beSPeter Zijlstra return slowfn(lock); 11431696a8beSPeter Zijlstra } 11441696a8beSPeter Zijlstra 11451696a8beSPeter Zijlstra static inline void 11461696a8beSPeter Zijlstra rt_mutex_fastunlock(struct rt_mutex *lock, 11471696a8beSPeter Zijlstra void (*slowfn)(struct rt_mutex *lock)) 11481696a8beSPeter Zijlstra { 11491696a8beSPeter Zijlstra if (likely(rt_mutex_cmpxchg(lock, current, NULL))) 11501696a8beSPeter Zijlstra rt_mutex_deadlock_account_unlock(current); 11511696a8beSPeter Zijlstra else 11521696a8beSPeter Zijlstra slowfn(lock); 11531696a8beSPeter Zijlstra } 11541696a8beSPeter Zijlstra 11551696a8beSPeter Zijlstra /** 11561696a8beSPeter Zijlstra * rt_mutex_lock - lock a rt_mutex 11571696a8beSPeter Zijlstra * 11581696a8beSPeter Zijlstra * @lock: the rt_mutex to be locked 11591696a8beSPeter Zijlstra */ 11601696a8beSPeter Zijlstra void __sched rt_mutex_lock(struct rt_mutex *lock) 11611696a8beSPeter Zijlstra { 11621696a8beSPeter Zijlstra might_sleep(); 11631696a8beSPeter Zijlstra 11641696a8beSPeter Zijlstra rt_mutex_fastlock(lock, TASK_UNINTERRUPTIBLE, 0, rt_mutex_slowlock); 11651696a8beSPeter Zijlstra } 11661696a8beSPeter Zijlstra EXPORT_SYMBOL_GPL(rt_mutex_lock); 11671696a8beSPeter Zijlstra 11681696a8beSPeter Zijlstra /** 11691696a8beSPeter Zijlstra * rt_mutex_lock_interruptible - lock a rt_mutex interruptible 11701696a8beSPeter Zijlstra * 11711696a8beSPeter Zijlstra * @lock: the rt_mutex to be locked 11721696a8beSPeter Zijlstra * @detect_deadlock: deadlock detection on/off 11731696a8beSPeter Zijlstra * 11741696a8beSPeter Zijlstra * Returns: 11751696a8beSPeter Zijlstra * 0 on success 11761696a8beSPeter Zijlstra * -EINTR when interrupted by a signal 11771696a8beSPeter Zijlstra * -EDEADLK when the lock would deadlock (when deadlock detection is on) 11781696a8beSPeter Zijlstra */ 11791696a8beSPeter Zijlstra int __sched rt_mutex_lock_interruptible(struct rt_mutex *lock, 11801696a8beSPeter Zijlstra int detect_deadlock) 11811696a8beSPeter Zijlstra { 11821696a8beSPeter Zijlstra might_sleep(); 11831696a8beSPeter Zijlstra 11841696a8beSPeter Zijlstra return rt_mutex_fastlock(lock, TASK_INTERRUPTIBLE, 11851696a8beSPeter Zijlstra detect_deadlock, rt_mutex_slowlock); 11861696a8beSPeter Zijlstra } 11871696a8beSPeter Zijlstra EXPORT_SYMBOL_GPL(rt_mutex_lock_interruptible); 11881696a8beSPeter Zijlstra 11891696a8beSPeter Zijlstra /** 11901696a8beSPeter Zijlstra * rt_mutex_timed_lock - lock a rt_mutex interruptible 11911696a8beSPeter Zijlstra * the timeout structure is provided 11921696a8beSPeter Zijlstra * by the caller 11931696a8beSPeter Zijlstra * 11941696a8beSPeter Zijlstra * @lock: the rt_mutex to be locked 11951696a8beSPeter Zijlstra * @timeout: timeout structure or NULL (no timeout) 11961696a8beSPeter Zijlstra * @detect_deadlock: deadlock detection on/off 11971696a8beSPeter Zijlstra * 11981696a8beSPeter Zijlstra * Returns: 11991696a8beSPeter Zijlstra * 0 on success 12001696a8beSPeter Zijlstra * -EINTR when interrupted by a signal 12011696a8beSPeter Zijlstra * -ETIMEDOUT when the timeout expired 12021696a8beSPeter Zijlstra * -EDEADLK when the lock would deadlock (when deadlock detection is on) 12031696a8beSPeter Zijlstra */ 12041696a8beSPeter Zijlstra int 12051696a8beSPeter Zijlstra rt_mutex_timed_lock(struct rt_mutex *lock, struct hrtimer_sleeper *timeout, 12061696a8beSPeter Zijlstra int detect_deadlock) 12071696a8beSPeter Zijlstra { 12081696a8beSPeter Zijlstra might_sleep(); 12091696a8beSPeter Zijlstra 12101696a8beSPeter Zijlstra return rt_mutex_timed_fastlock(lock, TASK_INTERRUPTIBLE, timeout, 12111696a8beSPeter Zijlstra detect_deadlock, rt_mutex_slowlock); 12121696a8beSPeter Zijlstra } 12131696a8beSPeter Zijlstra EXPORT_SYMBOL_GPL(rt_mutex_timed_lock); 12141696a8beSPeter Zijlstra 12151696a8beSPeter Zijlstra /** 12161696a8beSPeter Zijlstra * rt_mutex_trylock - try to lock a rt_mutex 12171696a8beSPeter Zijlstra * 12181696a8beSPeter Zijlstra * @lock: the rt_mutex to be locked 12191696a8beSPeter Zijlstra * 12201696a8beSPeter Zijlstra * Returns 1 on success and 0 on contention 12211696a8beSPeter Zijlstra */ 12221696a8beSPeter Zijlstra int __sched rt_mutex_trylock(struct rt_mutex *lock) 12231696a8beSPeter Zijlstra { 12241696a8beSPeter Zijlstra return rt_mutex_fasttrylock(lock, rt_mutex_slowtrylock); 12251696a8beSPeter Zijlstra } 12261696a8beSPeter Zijlstra EXPORT_SYMBOL_GPL(rt_mutex_trylock); 12271696a8beSPeter Zijlstra 12281696a8beSPeter Zijlstra /** 12291696a8beSPeter Zijlstra * rt_mutex_unlock - unlock a rt_mutex 12301696a8beSPeter Zijlstra * 12311696a8beSPeter Zijlstra * @lock: the rt_mutex to be unlocked 12321696a8beSPeter Zijlstra */ 12331696a8beSPeter Zijlstra void __sched rt_mutex_unlock(struct rt_mutex *lock) 12341696a8beSPeter Zijlstra { 12351696a8beSPeter Zijlstra rt_mutex_fastunlock(lock, rt_mutex_slowunlock); 12361696a8beSPeter Zijlstra } 12371696a8beSPeter Zijlstra EXPORT_SYMBOL_GPL(rt_mutex_unlock); 12381696a8beSPeter Zijlstra 12391696a8beSPeter Zijlstra /** 12401696a8beSPeter Zijlstra * rt_mutex_destroy - mark a mutex unusable 12411696a8beSPeter Zijlstra * @lock: the mutex to be destroyed 12421696a8beSPeter Zijlstra * 12431696a8beSPeter Zijlstra * This function marks the mutex uninitialized, and any subsequent 12441696a8beSPeter Zijlstra * use of the mutex is forbidden. The mutex must not be locked when 12451696a8beSPeter Zijlstra * this function is called. 12461696a8beSPeter Zijlstra */ 12471696a8beSPeter Zijlstra void rt_mutex_destroy(struct rt_mutex *lock) 12481696a8beSPeter Zijlstra { 12491696a8beSPeter Zijlstra WARN_ON(rt_mutex_is_locked(lock)); 12501696a8beSPeter Zijlstra #ifdef CONFIG_DEBUG_RT_MUTEXES 12511696a8beSPeter Zijlstra lock->magic = NULL; 12521696a8beSPeter Zijlstra #endif 12531696a8beSPeter Zijlstra } 12541696a8beSPeter Zijlstra 12551696a8beSPeter Zijlstra EXPORT_SYMBOL_GPL(rt_mutex_destroy); 12561696a8beSPeter Zijlstra 12571696a8beSPeter Zijlstra /** 12581696a8beSPeter Zijlstra * __rt_mutex_init - initialize the rt lock 12591696a8beSPeter Zijlstra * 12601696a8beSPeter Zijlstra * @lock: the rt lock to be initialized 12611696a8beSPeter Zijlstra * 12621696a8beSPeter Zijlstra * Initialize the rt lock to unlocked state. 12631696a8beSPeter Zijlstra * 12641696a8beSPeter Zijlstra * Initializing of a locked rt lock is not allowed 12651696a8beSPeter Zijlstra */ 12661696a8beSPeter Zijlstra void __rt_mutex_init(struct rt_mutex *lock, const char *name) 12671696a8beSPeter Zijlstra { 12681696a8beSPeter Zijlstra lock->owner = NULL; 12691696a8beSPeter Zijlstra raw_spin_lock_init(&lock->wait_lock); 1270fb00aca4SPeter Zijlstra lock->waiters = RB_ROOT; 1271fb00aca4SPeter Zijlstra lock->waiters_leftmost = NULL; 12721696a8beSPeter Zijlstra 12731696a8beSPeter Zijlstra debug_rt_mutex_init(lock, name); 12741696a8beSPeter Zijlstra } 12751696a8beSPeter Zijlstra EXPORT_SYMBOL_GPL(__rt_mutex_init); 12761696a8beSPeter Zijlstra 12771696a8beSPeter Zijlstra /** 12781696a8beSPeter Zijlstra * rt_mutex_init_proxy_locked - initialize and lock a rt_mutex on behalf of a 12791696a8beSPeter Zijlstra * proxy owner 12801696a8beSPeter Zijlstra * 12811696a8beSPeter Zijlstra * @lock: the rt_mutex to be locked 12821696a8beSPeter Zijlstra * @proxy_owner:the task to set as owner 12831696a8beSPeter Zijlstra * 12841696a8beSPeter Zijlstra * No locking. Caller has to do serializing itself 12851696a8beSPeter Zijlstra * Special API call for PI-futex support 12861696a8beSPeter Zijlstra */ 12871696a8beSPeter Zijlstra void rt_mutex_init_proxy_locked(struct rt_mutex *lock, 12881696a8beSPeter Zijlstra struct task_struct *proxy_owner) 12891696a8beSPeter Zijlstra { 12901696a8beSPeter Zijlstra __rt_mutex_init(lock, NULL); 12911696a8beSPeter Zijlstra debug_rt_mutex_proxy_lock(lock, proxy_owner); 12921696a8beSPeter Zijlstra rt_mutex_set_owner(lock, proxy_owner); 12931696a8beSPeter Zijlstra rt_mutex_deadlock_account_lock(lock, proxy_owner); 12941696a8beSPeter Zijlstra } 12951696a8beSPeter Zijlstra 12961696a8beSPeter Zijlstra /** 12971696a8beSPeter Zijlstra * rt_mutex_proxy_unlock - release a lock on behalf of owner 12981696a8beSPeter Zijlstra * 12991696a8beSPeter Zijlstra * @lock: the rt_mutex to be locked 13001696a8beSPeter Zijlstra * 13011696a8beSPeter Zijlstra * No locking. Caller has to do serializing itself 13021696a8beSPeter Zijlstra * Special API call for PI-futex support 13031696a8beSPeter Zijlstra */ 13041696a8beSPeter Zijlstra void rt_mutex_proxy_unlock(struct rt_mutex *lock, 13051696a8beSPeter Zijlstra struct task_struct *proxy_owner) 13061696a8beSPeter Zijlstra { 13071696a8beSPeter Zijlstra debug_rt_mutex_proxy_unlock(lock); 13081696a8beSPeter Zijlstra rt_mutex_set_owner(lock, NULL); 13091696a8beSPeter Zijlstra rt_mutex_deadlock_account_unlock(proxy_owner); 13101696a8beSPeter Zijlstra } 13111696a8beSPeter Zijlstra 13121696a8beSPeter Zijlstra /** 13131696a8beSPeter Zijlstra * rt_mutex_start_proxy_lock() - Start lock acquisition for another task 13141696a8beSPeter Zijlstra * @lock: the rt_mutex to take 13151696a8beSPeter Zijlstra * @waiter: the pre-initialized rt_mutex_waiter 13161696a8beSPeter Zijlstra * @task: the task to prepare 13171696a8beSPeter Zijlstra * @detect_deadlock: perform deadlock detection (1) or not (0) 13181696a8beSPeter Zijlstra * 13191696a8beSPeter Zijlstra * Returns: 13201696a8beSPeter Zijlstra * 0 - task blocked on lock 13211696a8beSPeter Zijlstra * 1 - acquired the lock for task, caller should wake it up 13221696a8beSPeter Zijlstra * <0 - error 13231696a8beSPeter Zijlstra * 13241696a8beSPeter Zijlstra * Special API call for FUTEX_REQUEUE_PI support. 13251696a8beSPeter Zijlstra */ 13261696a8beSPeter Zijlstra int rt_mutex_start_proxy_lock(struct rt_mutex *lock, 13271696a8beSPeter Zijlstra struct rt_mutex_waiter *waiter, 13281696a8beSPeter Zijlstra struct task_struct *task, int detect_deadlock) 13291696a8beSPeter Zijlstra { 13301696a8beSPeter Zijlstra int ret; 13311696a8beSPeter Zijlstra 13321696a8beSPeter Zijlstra raw_spin_lock(&lock->wait_lock); 13331696a8beSPeter Zijlstra 13341696a8beSPeter Zijlstra if (try_to_take_rt_mutex(lock, task, NULL)) { 13351696a8beSPeter Zijlstra raw_spin_unlock(&lock->wait_lock); 13361696a8beSPeter Zijlstra return 1; 13371696a8beSPeter Zijlstra } 13381696a8beSPeter Zijlstra 13393d5c9340SThomas Gleixner /* We enforce deadlock detection for futexes */ 13403d5c9340SThomas Gleixner ret = task_blocks_on_rt_mutex(lock, waiter, task, 1); 13411696a8beSPeter Zijlstra 13421696a8beSPeter Zijlstra if (ret && !rt_mutex_owner(lock)) { 13431696a8beSPeter Zijlstra /* 13441696a8beSPeter Zijlstra * Reset the return value. We might have 13451696a8beSPeter Zijlstra * returned with -EDEADLK and the owner 13461696a8beSPeter Zijlstra * released the lock while we were walking the 13471696a8beSPeter Zijlstra * pi chain. Let the waiter sort it out. 13481696a8beSPeter Zijlstra */ 13491696a8beSPeter Zijlstra ret = 0; 13501696a8beSPeter Zijlstra } 13511696a8beSPeter Zijlstra 13521696a8beSPeter Zijlstra if (unlikely(ret)) 13531696a8beSPeter Zijlstra remove_waiter(lock, waiter); 13541696a8beSPeter Zijlstra 13551696a8beSPeter Zijlstra raw_spin_unlock(&lock->wait_lock); 13561696a8beSPeter Zijlstra 13571696a8beSPeter Zijlstra debug_rt_mutex_print_deadlock(waiter); 13581696a8beSPeter Zijlstra 13591696a8beSPeter Zijlstra return ret; 13601696a8beSPeter Zijlstra } 13611696a8beSPeter Zijlstra 13621696a8beSPeter Zijlstra /** 13631696a8beSPeter Zijlstra * rt_mutex_next_owner - return the next owner of the lock 13641696a8beSPeter Zijlstra * 13651696a8beSPeter Zijlstra * @lock: the rt lock query 13661696a8beSPeter Zijlstra * 13671696a8beSPeter Zijlstra * Returns the next owner of the lock or NULL 13681696a8beSPeter Zijlstra * 13691696a8beSPeter Zijlstra * Caller has to serialize against other accessors to the lock 13701696a8beSPeter Zijlstra * itself. 13711696a8beSPeter Zijlstra * 13721696a8beSPeter Zijlstra * Special API call for PI-futex support 13731696a8beSPeter Zijlstra */ 13741696a8beSPeter Zijlstra struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock) 13751696a8beSPeter Zijlstra { 13761696a8beSPeter Zijlstra if (!rt_mutex_has_waiters(lock)) 13771696a8beSPeter Zijlstra return NULL; 13781696a8beSPeter Zijlstra 13791696a8beSPeter Zijlstra return rt_mutex_top_waiter(lock)->task; 13801696a8beSPeter Zijlstra } 13811696a8beSPeter Zijlstra 13821696a8beSPeter Zijlstra /** 13831696a8beSPeter Zijlstra * rt_mutex_finish_proxy_lock() - Complete lock acquisition 13841696a8beSPeter Zijlstra * @lock: the rt_mutex we were woken on 13851696a8beSPeter Zijlstra * @to: the timeout, null if none. hrtimer should already have 13861696a8beSPeter Zijlstra * been started. 13871696a8beSPeter Zijlstra * @waiter: the pre-initialized rt_mutex_waiter 13881696a8beSPeter Zijlstra * @detect_deadlock: perform deadlock detection (1) or not (0) 13891696a8beSPeter Zijlstra * 13901696a8beSPeter Zijlstra * Complete the lock acquisition started our behalf by another thread. 13911696a8beSPeter Zijlstra * 13921696a8beSPeter Zijlstra * Returns: 13931696a8beSPeter Zijlstra * 0 - success 13941696a8beSPeter Zijlstra * <0 - error, one of -EINTR, -ETIMEDOUT, or -EDEADLK 13951696a8beSPeter Zijlstra * 13961696a8beSPeter Zijlstra * Special API call for PI-futex requeue support 13971696a8beSPeter Zijlstra */ 13981696a8beSPeter Zijlstra int rt_mutex_finish_proxy_lock(struct rt_mutex *lock, 13991696a8beSPeter Zijlstra struct hrtimer_sleeper *to, 14001696a8beSPeter Zijlstra struct rt_mutex_waiter *waiter, 14011696a8beSPeter Zijlstra int detect_deadlock) 14021696a8beSPeter Zijlstra { 14031696a8beSPeter Zijlstra int ret; 14041696a8beSPeter Zijlstra 14051696a8beSPeter Zijlstra raw_spin_lock(&lock->wait_lock); 14061696a8beSPeter Zijlstra 14071696a8beSPeter Zijlstra set_current_state(TASK_INTERRUPTIBLE); 14081696a8beSPeter Zijlstra 14091696a8beSPeter Zijlstra ret = __rt_mutex_slowlock(lock, TASK_INTERRUPTIBLE, to, waiter); 14101696a8beSPeter Zijlstra 14111696a8beSPeter Zijlstra set_current_state(TASK_RUNNING); 14121696a8beSPeter Zijlstra 14131696a8beSPeter Zijlstra if (unlikely(ret)) 14141696a8beSPeter Zijlstra remove_waiter(lock, waiter); 14151696a8beSPeter Zijlstra 14161696a8beSPeter Zijlstra /* 14171696a8beSPeter Zijlstra * try_to_take_rt_mutex() sets the waiter bit unconditionally. We might 14181696a8beSPeter Zijlstra * have to fix that up. 14191696a8beSPeter Zijlstra */ 14201696a8beSPeter Zijlstra fixup_rt_mutex_waiters(lock); 14211696a8beSPeter Zijlstra 14221696a8beSPeter Zijlstra raw_spin_unlock(&lock->wait_lock); 14231696a8beSPeter Zijlstra 14241696a8beSPeter Zijlstra return ret; 14251696a8beSPeter Zijlstra } 1426