All of lore.kernel.org
 help / color / mirror / Atom feed
From: tip-bot for Will Deacon <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, hpa@zytor.com, mingo@kernel.org,
	torvalds@linux-foundation.org, will.deacon@arm.com,
	peterz@infradead.org, tim.c.chen@linux.intel.com,
	paulmck@linux.vnet.ibm.com, akpm@linux-foundation.org,
	tglx@linutronix.de
Subject: [tip:core/locking] locking/mcs: Allow architectures to hook in to contended paths
Date: Tue, 28 Jan 2014 11:23:18 -0800	[thread overview]
Message-ID: <tip-e207552e64ea053a33e856828ad7915484911d06@git.kernel.org> (raw)
In-Reply-To: <1390347370.3138.65.camel@schen9-DESK>

Commit-ID:  e207552e64ea053a33e856828ad7915484911d06
Gitweb:     http://git.kernel.org/tip/e207552e64ea053a33e856828ad7915484911d06
Author:     Will Deacon <will.deacon@arm.com>
AuthorDate: Tue, 21 Jan 2014 15:36:10 -0800
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Tue, 28 Jan 2014 13:13:28 +0100

locking/mcs: Allow architectures to hook in to contended paths

When contended, architectures may be able to reduce the polling overhead
in ways which aren't expressible using a simple relax() primitive.

This patch allows architectures to hook into the mcs_{lock,unlock}
functions for the contended cases only.

Reviewed-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Tim Chen <tim.c.chen@linux.intel.com>
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Link: http://lkml.kernel.org/r/1390347370.3138.65.camel@schen9-DESK
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 include/linux/mcs_spinlock.h | 42 ++++++++++++++++++++++++++++--------------
 1 file changed, 28 insertions(+), 14 deletions(-)

diff --git a/include/linux/mcs_spinlock.h b/include/linux/mcs_spinlock.h
index 143fa42..e9a4d74 100644
--- a/include/linux/mcs_spinlock.h
+++ b/include/linux/mcs_spinlock.h
@@ -17,6 +17,28 @@ struct mcs_spinlock {
 	int locked; /* 1 if lock acquired */
 };
 
+#ifndef arch_mcs_spin_lock_contended
+/*
+ * Using smp_load_acquire() provides a memory barrier that ensures
+ * subsequent operations happen after the lock is acquired.
+ */
+#define arch_mcs_spin_lock_contended(l)					\
+do {									\
+	while (!(smp_load_acquire(l)))					\
+		arch_mutex_cpu_relax();					\
+} while (0)
+#endif
+
+#ifndef arch_mcs_spin_unlock_contended
+/*
+ * smp_store_release() provides a memory barrier to ensure all
+ * operations in the critical section has been completed before
+ * unlocking.
+ */
+#define arch_mcs_spin_unlock_contended(l)				\
+	smp_store_release((l), 1)
+#endif
+
 /*
  * Note: the smp_load_acquire/smp_store_release pair is not
  * sufficient to form a full memory barrier across
@@ -58,13 +80,9 @@ void mcs_spin_lock(struct mcs_spinlock **lock, struct mcs_spinlock *node)
 		return;
 	}
 	ACCESS_ONCE(prev->next) = node;
-	/*
-	 * Wait until the lock holder passes the lock down.
-	 * Using smp_load_acquire() provides a memory barrier that
-	 * ensures subsequent operations happen after the lock is acquired.
-	 */
-	while (!(smp_load_acquire(&node->locked)))
-		arch_mutex_cpu_relax();
+
+	/* Wait until the lock holder passes the lock down. */
+	arch_mcs_spin_lock_contended(&node->locked);
 }
 
 /*
@@ -86,13 +104,9 @@ void mcs_spin_unlock(struct mcs_spinlock **lock, struct mcs_spinlock *node)
 		while (!(next = ACCESS_ONCE(node->next)))
 			arch_mutex_cpu_relax();
 	}
-	/*
-	 * Pass lock to next waiter.
-	 * smp_store_release() provides a memory barrier to ensure
-	 * all operations in the critical section has been completed
-	 * before unlocking.
-	 */
-	smp_store_release(&next->locked, 1);
+
+	/* Pass lock to next waiter. */
+	arch_mcs_spin_unlock_contended(&next->locked);
 }
 
 #endif /* __LINUX_MCS_SPINLOCK_H */

  reply	other threads:[~2014-01-28 19:24 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <cover.1390320729.git.tim.c.chen@linux.intel.com>
2014-01-21 23:35 ` [PATCH v9 0/6] MCS Lock: MCS lock code cleanup and optimizations Tim Chen
2014-01-21 23:35   ` Tim Chen
2014-01-21 23:35 ` [PATCH v9 1/6] MCS Lock: Barrier corrections Tim Chen
2014-01-21 23:35   ` Tim Chen
2014-01-22 10:13   ` Will Deacon
2014-01-22 10:13     ` Will Deacon
2014-01-28 19:22   ` [tip:core/locking] locking/mutexes/mcs: Correct barrier usage tip-bot for Waiman Long
2014-01-21 23:36 ` [PATCH v9 2/6] MCS Lock: Restructure the MCS lock defines and locking code into its own file Tim Chen
2014-01-21 23:36   ` Tim Chen
2014-01-28 19:22   ` [tip:core/locking] locking/mutexes/mcs: " tip-bot for Tim Chen
2014-01-21 23:36 ` [PATCH v9 3/6] MCS Lock: Optimizations and extra comments Tim Chen
2014-01-21 23:36   ` Tim Chen
2014-01-28 19:23   ` [tip:core/locking] locking/mcs: Micro-optimize the MCS code, add " tip-bot for Jason Low
2014-01-21 23:36 ` [PATCH v9 4/6] MCS Lock: Allow architectures to hook in to contended paths Tim Chen
2014-01-21 23:36   ` Tim Chen
2014-01-28 19:23   ` tip-bot for Will Deacon [this message]
2014-01-21 23:36 ` [PATCH v9 5/6] MCS Lock: Order the header files in Kbuild of each architecture in alphabetical order Tim Chen
2014-01-21 23:36   ` Tim Chen
2014-01-22 13:08   ` Peter Zijlstra
2014-01-22 13:08     ` Peter Zijlstra
2014-01-22 17:41     ` Tim Chen
2014-01-22 17:41       ` Tim Chen
2014-01-22 17:51       ` Peter Zijlstra
2014-01-22 17:51         ` Peter Zijlstra
2014-01-22 18:18     ` Peter Zijlstra
2014-01-22 18:18       ` Peter Zijlstra
2014-01-22 18:25     ` Peter Zijlstra
2014-01-22 18:25       ` Peter Zijlstra
2014-01-22 18:41       ` Tim Chen
2014-01-22 18:41         ` Tim Chen
2014-01-21 23:36 ` [PATCH v9 6/6] MCS Lock: Allow architecture specific asm files to be used for contended case Tim Chen
2014-01-21 23:36   ` Tim Chen
2014-01-22 18:35   ` Peter Zijlstra
2014-01-22 18:35     ` Peter Zijlstra
2014-01-22 18:35     ` Peter Zijlstra
2014-01-24 17:03     ` Tim Chen
2014-01-24 17:03       ` Tim Chen
2014-01-24 17:03       ` Tim Chen
2014-01-24 17:07       ` Peter Zijlstra
2014-01-24 17:07         ` Peter Zijlstra
2014-01-24 17:07         ` Peter Zijlstra
2014-01-24 17:33         ` Linus Torvalds
2014-01-24 17:33           ` Linus Torvalds
2014-01-24 17:37           ` Will Deacon
2014-01-24 17:37             ` Will Deacon
2014-02-10 13:32   ` [tip:core/locking] locking/mcs: " tip-bot for Tim Chen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=tip-e207552e64ea053a33e856828ad7915484911d06@git.kernel.org \
    --to=tipbot@zytor.com \
    --cc=akpm@linux-foundation.org \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=paulmck@linux.vnet.ibm.com \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    --cc=tim.c.chen@linux.intel.com \
    --cc=torvalds@linux-foundation.org \
    --cc=will.deacon@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.