Re: [RFC PATCH 1/3] locking/mutex: Try to acquire mutex only if it is unlocked

From: Waiman Long
Date: Wed Jun 04 2014 - 23:24:38 EST


On 06/04/2014 05:26 PM, Jason Low wrote:
On Wed, 2014-06-04 at 21:43 +0200, Peter Zijlstra wrote:
On Wed, Jun 04, 2014 at 12:08:29PM -0700, Jason Low wrote:
Upon entering the slowpath in __mutex_lock_common(), we try once more
to acquire the mutex. We only try to acquire it if MUTEX_SHOW_NO_WAITER
(lock->count>= 0) is true in order to avoid using the atomic xchg()
operation whenever it is not necessary. However, we really only need
to try to acquire if the mutex is free (lock->count == 1).

This patch changes it so that we only try-acquire the mutex upon
entering the slowpath if it is unlocked, rather than if there are
no waiters. This helps further reduce unncessary atomic xchg()
operations. Furthermore, this patch introduces and uses a new
MUTEX_IS_UNLOCKED() macro to improve readbability.

Signed-off-by: Jason Low<jason.low2@xxxxxx>
---
kernel/locking/mutex.c | 10 ++++++----
1 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/kernel/locking/mutex.c b/kernel/locking/mutex.c
index bc73d33..0925968 100644
--- a/kernel/locking/mutex.c
+++ b/kernel/locking/mutex.c
@@ -48,9 +48,10 @@

/*
* A negative mutex count indicates that waiters are sleeping waiting for the
- * mutex.
+ * mutex, and a count of one indicates the mutex is unlocked.
*/
#define MUTEX_SHOW_NO_WAITER(mutex) (atomic_read(&(mutex)->count)>= 0)
+#define MUTEX_IS_UNLOCKED(mutex) (atomic_read(&(mutex)->count) == 1)
So I recently saw that MUTEX_SHOW_NO_WAITER thing and cried a little;
and now you're adding more of that same nonsense.

Please make them inline functions, also can we rename the SHOW_NO_WAITER
thing, because its not at all clear to me wtf it does; should it be
called: mutex_no_waiters() or somesuch?
Okay, I can make them inline functions. I mainly added the macro to keep
it consistent with the MUTEX_SHOW_NO_WAITER() check, but we can surely
make this more clear. mutex_no_waiters() sounds fine, or perhaps
something like mutex_has_no_waiters()?


You can remove the MUTEX_SHOW_NO_WAITER macro as all the call sites are to be replaced. I didn't check directly for unlocked count because of fairness concern in my original patch, but I think checking directly for unlocked count should be fine too.

-Longman
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/