|
@@ -1753,21 +1753,23 @@ struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * rt_mutex_finish_proxy_lock() - Complete lock acquisition
|
|
|
+ * rt_mutex_wait_proxy_lock() - Wait for lock acquisition
|
|
|
* @lock: the rt_mutex we were woken on
|
|
|
* @to: the timeout, null if none. hrtimer should already have
|
|
|
* been started.
|
|
|
* @waiter: the pre-initialized rt_mutex_waiter
|
|
|
*
|
|
|
- * Complete the lock acquisition started our behalf by another thread.
|
|
|
+ * Wait for the the lock acquisition started on our behalf by
|
|
|
+ * rt_mutex_start_proxy_lock(). Upon failure, the caller must call
|
|
|
+ * rt_mutex_cleanup_proxy_lock().
|
|
|
*
|
|
|
* Returns:
|
|
|
* 0 - success
|
|
|
* <0 - error, one of -EINTR, -ETIMEDOUT
|
|
|
*
|
|
|
- * Special API call for PI-futex requeue support
|
|
|
+ * Special API call for PI-futex support
|
|
|
*/
|
|
|
-int rt_mutex_finish_proxy_lock(struct rt_mutex *lock,
|
|
|
+int rt_mutex_wait_proxy_lock(struct rt_mutex *lock,
|
|
|
struct hrtimer_sleeper *to,
|
|
|
struct rt_mutex_waiter *waiter)
|
|
|
{
|
|
@@ -1780,9 +1782,6 @@ int rt_mutex_finish_proxy_lock(struct rt_mutex *lock,
|
|
|
/* sleep on the mutex */
|
|
|
ret = __rt_mutex_slowlock(lock, TASK_INTERRUPTIBLE, to, waiter);
|
|
|
|
|
|
- if (unlikely(ret))
|
|
|
- remove_waiter(lock, waiter);
|
|
|
-
|
|
|
/*
|
|
|
* try_to_take_rt_mutex() sets the waiter bit unconditionally. We might
|
|
|
* have to fix that up.
|
|
@@ -1793,3 +1792,42 @@ int rt_mutex_finish_proxy_lock(struct rt_mutex *lock,
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
+
|
|
|
+/**
|
|
|
+ * rt_mutex_cleanup_proxy_lock() - Cleanup failed lock acquisition
|
|
|
+ * @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().
|
|
|
+ *
|
|
|
+ * 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
|
|
|
+ * find we are in fact the owner and must disregard the
|
|
|
+ * rt_mutex_wait_proxy_lock() failure.
|
|
|
+ *
|
|
|
+ * Returns:
|
|
|
+ * true - did the cleanup, we done.
|
|
|
+ * false - we acquired the lock after rt_mutex_wait_proxy_lock() returned,
|
|
|
+ * caller should disregards its return value.
|
|
|
+ *
|
|
|
+ * Special API call for PI-futex support
|
|
|
+ */
|
|
|
+bool rt_mutex_cleanup_proxy_lock(struct rt_mutex *lock,
|
|
|
+ struct rt_mutex_waiter *waiter)
|
|
|
+{
|
|
|
+ bool cleanup = false;
|
|
|
+
|
|
|
+ raw_spin_lock_irq(&lock->wait_lock);
|
|
|
+ /*
|
|
|
+ * Unless we're the owner; we're still enqueued on the wait_list.
|
|
|
+ * So check if we became owner, if not, take us off the wait_list.
|
|
|
+ */
|
|
|
+ if (rt_mutex_owner(lock) != current) {
|
|
|
+ remove_waiter(lock, waiter);
|
|
|
+ fixup_rt_mutex_waiters(lock);
|
|
|
+ cleanup = true;
|
|
|
+ }
|
|
|
+ raw_spin_unlock_irq(&lock->wait_lock);
|
|
|
+
|
|
|
+ return cleanup;
|
|
|
+}
|