|
|
@@ -1726,12 +1726,33 @@ void rt_mutex_proxy_unlock(struct rt_mutex *lock,
|
|
|
rt_mutex_set_owner(lock, NULL);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * __rt_mutex_start_proxy_lock() - Start lock acquisition for another task
|
|
|
+ * @lock: the rt_mutex to take
|
|
|
+ * @waiter: the pre-initialized rt_mutex_waiter
|
|
|
+ * @task: the task to prepare
|
|
|
+ *
|
|
|
+ * Starts the rt_mutex acquire; it enqueues the @waiter and does deadlock
|
|
|
+ * detection. It does not wait, see rt_mutex_wait_proxy_lock() for that.
|
|
|
+ *
|
|
|
+ * NOTE: does _NOT_ remove the @waiter on failure; must either call
|
|
|
+ * rt_mutex_wait_proxy_lock() or rt_mutex_cleanup_proxy_lock() after this.
|
|
|
+ *
|
|
|
+ * Returns:
|
|
|
+ * 0 - task blocked on lock
|
|
|
+ * 1 - acquired the lock for task, caller should wake it up
|
|
|
+ * <0 - error
|
|
|
+ *
|
|
|
+ * Special API call for PI-futex support.
|
|
|
+ */
|
|
|
int __rt_mutex_start_proxy_lock(struct rt_mutex *lock,
|
|
|
struct rt_mutex_waiter *waiter,
|
|
|
struct task_struct *task)
|
|
|
{
|
|
|
int ret;
|
|
|
|
|
|
+ lockdep_assert_held(&lock->wait_lock);
|
|
|
+
|
|
|
if (try_to_take_rt_mutex(lock, task, NULL))
|
|
|
return 1;
|
|
|
|
|
|
@@ -1749,9 +1770,6 @@ int __rt_mutex_start_proxy_lock(struct rt_mutex *lock,
|
|
|
ret = 0;
|
|
|
}
|
|
|
|
|
|
- if (unlikely(ret))
|
|
|
- remove_waiter(lock, waiter);
|
|
|
-
|
|
|
debug_rt_mutex_print_deadlock(waiter);
|
|
|
|
|
|
return ret;
|
|
|
@@ -1763,12 +1781,18 @@ int __rt_mutex_start_proxy_lock(struct rt_mutex *lock,
|
|
|
* @waiter: the pre-initialized rt_mutex_waiter
|
|
|
* @task: the task to prepare
|
|
|
*
|
|
|
+ * Starts the rt_mutex acquire; it enqueues the @waiter and does deadlock
|
|
|
+ * detection. It does not wait, see rt_mutex_wait_proxy_lock() for that.
|
|
|
+ *
|
|
|
+ * NOTE: unlike __rt_mutex_start_proxy_lock this _DOES_ remove the @waiter
|
|
|
+ * on failure.
|
|
|
+ *
|
|
|
* Returns:
|
|
|
* 0 - task blocked on lock
|
|
|
* 1 - acquired the lock for task, caller should wake it up
|
|
|
* <0 - error
|
|
|
*
|
|
|
- * Special API call for FUTEX_REQUEUE_PI support.
|
|
|
+ * Special API call for PI-futex support.
|
|
|
*/
|
|
|
int rt_mutex_start_proxy_lock(struct rt_mutex *lock,
|
|
|
struct rt_mutex_waiter *waiter,
|
|
|
@@ -1778,6 +1802,8 @@ int rt_mutex_start_proxy_lock(struct rt_mutex *lock,
|
|
|
|
|
|
raw_spin_lock_irq(&lock->wait_lock);
|
|
|
ret = __rt_mutex_start_proxy_lock(lock, waiter, task);
|
|
|
+ if (unlikely(ret))
|
|
|
+ remove_waiter(lock, waiter);
|
|
|
raw_spin_unlock_irq(&lock->wait_lock);
|
|
|
|
|
|
return ret;
|
|
|
@@ -1845,7 +1871,8 @@ int rt_mutex_wait_proxy_lock(struct rt_mutex *lock,
|
|
|
* @lock: the rt_mutex we were woken on
|
|
|
* @waiter: the pre-initialized rt_mutex_waiter
|
|
|
*
|
|
|
- * Attempt to clean up after a failed rt_mutex_wait_proxy_lock().
|
|
|
+ * Attempt to clean up after a failed __rt_mutex_start_proxy_lock() or
|
|
|
+ * rt_mutex_wait_proxy_lock().
|
|
|
*
|
|
|
* Unless we acquired the lock; we're still enqueued on the wait-list and can
|
|
|
* in fact still be granted ownership until we're removed. Therefore we can
|