Re: [PATCH -v4 1/8] locking/drm: Kill mutex trickery

From: Peter Zijlstra
Date: Fri Oct 07 2016 - 11:44:31 EST


On Fri, Oct 07, 2016 at 04:52:44PM +0200, Peter Zijlstra wrote:
> Poking at lock internals is not cool. Since I'm going to change the
> implementation this will break, take it out.


So something like the below would serve as a replacement for your
previous hacks. Is this API something acceptable to people? Ingo,
Thomas?

---
include/linux/mutex.h | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)

diff --git a/include/linux/mutex.h b/include/linux/mutex.h
index 4d3bccabbea5..afcff2c85957 100644
--- a/include/linux/mutex.h
+++ b/include/linux/mutex.h
@@ -189,4 +189,29 @@ extern void mutex_unlock(struct mutex *lock);

extern int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock);

+enum mutex_trylock_recursive_enum {
+ mutex_trylock_failed = 0,
+ mutex_trylock_success = 1,
+ mutex_trylock_recursive,
+};
+
+/**
+ * mutex_trylock_recursive - trylock variant that allows recursive locking
+ * @lock: mutex to be locked
+ *
+ *
+ * Returns:
+ * mutex_trylock_failed - trylock failed,
+ * mutex_trylock_success - lock acquired,
+ * mutex_trylock_recursive - we already owned the lock.
+ */
+static inline enum mutex_trylock_recursive_enum
+mutex_trylock_recursive(struct mutex *lock)
+{
+ if (unlikely(__mutex_owner(lock) == current))
+ return mutex_trylock_recursive;
+
+ return mutex_trylock(lock);
+}
+
#endif /* __LINUX_MUTEX_H */