mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@elte.hu>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Nick Piggin <npiggin@kernel.dk>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Subject: [PATCH 05/18] x86/ticketlock: make __ticket_spin_lock common
Date: Wed, 24 Aug 2011 10:52:59 -0700	[thread overview]
Message-ID: <fc96a1a856449f774724e35f81594c1ec16c5ca3.1314207974.git.jeremy.fitzhardinge@citrix.com> (raw)
In-Reply-To: <cover.1314207974.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1314207974.git.jeremy.fitzhardinge@citrix.com>

From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

Aside from the particular form of the xadd instruction, they're identical.
So factor out the xadd and use common code for the rest.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/include/asm/spinlock.h |   42 ++++++++++++++++++--------------------
 1 files changed, 20 insertions(+), 22 deletions(-)

diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h
index 894753f..37c3b10 100644
--- a/arch/x86/include/asm/spinlock.h
+++ b/arch/x86/include/asm/spinlock.h
@@ -67,13 +67,27 @@ static __always_inline void __ticket_unlock_release(struct arch_spinlock *lock)
  * save some instructions and make the code more elegant. There really isn't
  * much between them in performance though, especially as locks are out of line.
  */
-#if (NR_CPUS < 256)
-static __always_inline void __ticket_spin_lock(arch_spinlock_t *lock)
+static __always_inline struct __raw_tickets __ticket_spin_claim(struct arch_spinlock *lock)
 {
-	register struct __raw_tickets inc = { .tail = 1 };
+	register struct __raw_tickets tickets = { .tail = 1 };
+
+	if (sizeof(lock->tickets.head) == sizeof(u8))
+		asm volatile (LOCK_PREFIX "xaddw %w0, %1\n"
+			      : "+r" (tickets), "+m" (lock->tickets)
+			      : : "memory", "cc");
+	else
+		asm volatile (LOCK_PREFIX "xaddl %0, %1\n"
+			     : "+r" (tickets), "+m" (lock->tickets)
+			     : : "memory", "cc");
 
-	asm volatile (LOCK_PREFIX "xaddw %w0, %1\n"
-		      : "+r" (inc), "+m" (lock->tickets) : : "memory", "cc");
+	return tickets;
+}
+
+static __always_inline void __ticket_spin_lock(struct arch_spinlock *lock)
+{
+	register struct __raw_tickets inc;
+
+	inc = __ticket_spin_claim(lock);
 
 	for (;;) {
 		if (inc.head == inc.tail)
@@ -84,6 +98,7 @@ static __always_inline void __ticket_spin_lock(arch_spinlock_t *lock)
 out:	barrier();		/* make sure nothing creeps before the lock is taken */
 }
 
+#if (NR_CPUS < 256)
 static __always_inline int __ticket_spin_trylock(arch_spinlock_t *lock)
 {
 	unsigned int tmp, new;
@@ -103,23 +118,6 @@ static __always_inline int __ticket_spin_trylock(arch_spinlock_t *lock)
 	return tmp;
 }
 #else
-static __always_inline void __ticket_spin_lock(arch_spinlock_t *lock)
-{
-	register struct __raw_tickets inc = { .tail = 1 };
-
-	asm volatile(LOCK_PREFIX "xaddl %0, %1\n\t"
-		     : "+r" (inc), "+m" (lock->tickets)
-		     : : "memory", "cc");
-
-	for (;;) {
-		if (inc.head == inc.tail)
-			goto out;
-		cpu_relax();
-		inc.head = ACCESS_ONCE(lock->tickets.head);
-	}
-out:	barrier();		/* make sure nothing creeps before the lock is taken */
-}
-
 static __always_inline int __ticket_spin_trylock(arch_spinlock_t *lock)
 {
 	unsigned tmp;
-- 
1.7.6


  parent reply	other threads:[~2011-08-24 17:56 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-08-24 17:52 [PATCH 00/18] x86: Ticket lock + cmpxchg cleanup Jeremy Fitzhardinge
2011-08-24 17:52 ` [PATCH 01/18] x86/ticketlock: clean up types and accessors Jeremy Fitzhardinge
2011-08-24 17:52 ` [PATCH 02/18] x86/ticketlock: convert spin loop to C Jeremy Fitzhardinge
2011-08-24 20:02   ` Andi Kleen
2011-08-24 17:52 ` [PATCH 03/18] x86/ticketlock: Use C for __ticket_spin_unlock Jeremy Fitzhardinge
2011-08-24 18:01   ` Linus Torvalds
2011-08-24 17:52 ` [PATCH 04/18] x86/ticketlock: make large and small ticket versions of spin_lock the same Jeremy Fitzhardinge
2011-08-24 17:52 ` Jeremy Fitzhardinge [this message]
2011-08-24 17:53 ` [PATCH 06/18] x86/ticketlock: make __ticket_spin_trylock common Jeremy Fitzhardinge
2011-08-24 20:00   ` Andi Kleen
2011-08-24 21:38     ` Linus Torvalds
2011-08-24 21:43       ` Jeremy Fitzhardinge
2011-08-24 21:43       ` Andi Kleen
2011-08-24 21:48         ` Jeremy Fitzhardinge
2011-08-24 21:53           ` Andi Kleen
2011-08-24 17:53 ` [PATCH 07/18] x86: add xadd helper macro Jeremy Fitzhardinge
2011-08-24 17:53 ` [PATCH 08/18] x86/ticketlock: use xadd helper Jeremy Fitzhardinge
2011-08-24 17:53 ` [PATCH 09/18] x86/cmpxchg: linux/alternative.h has LOCK_PREFIX Jeremy Fitzhardinge
2011-08-24 17:53 ` [PATCH 10/18] x86/cmpxchg: move 32-bit __cmpxchg_wrong_size to match 64 bit Jeremy Fitzhardinge
2011-08-24 17:53 ` [PATCH 11/18] x86/cmpxchg: move 64-bit set64_bit() to match 32-bit Jeremy Fitzhardinge
2011-08-24 17:53 ` [PATCH 12/18] x86/cmpxchg: unify cmpxchg into cmpxchg.h Jeremy Fitzhardinge
2011-08-24 17:53 ` [PATCH 13/18] x86: add cmpxchg_flag() variant Jeremy Fitzhardinge
2011-08-24 17:53 ` [PATCH 14/18] x86/ticketlocks: use cmpxchg_flag for trylock Jeremy Fitzhardinge
2011-08-24 17:53 ` [PATCH 15/18] x86: use cmpxchg_flag() where applicable Jeremy Fitzhardinge
2011-08-24 17:53 ` [PATCH 16/18] x86: report xchg/cmpxchg/xadd usage errors consistently Jeremy Fitzhardinge
2011-08-24 17:53 ` [PATCH 17/18] x86: add local and sync variants of xadd Jeremy Fitzhardinge
2011-08-24 17:53 ` [PATCH 18/18] x86: use xadd helper more widely Jeremy Fitzhardinge
2011-08-24 18:03 ` [PATCH 00/18] x86: Ticket lock + cmpxchg cleanup Peter Zijlstra
2011-08-24 18:24   ` Linus Torvalds
2011-08-24 20:10     ` Jeremy Fitzhardinge
2011-08-24 22:53       ` Linus Torvalds
2011-08-24 22:59         ` Jeremy Fitzhardinge
2011-08-24 23:05           ` H. Peter Anvin
2011-08-24 23:09             ` Linus Torvalds
2011-08-24 23:21               ` Linus Torvalds
2011-08-24 23:30                 ` Jeremy Fitzhardinge
2011-08-24 23:10             ` Jeremy Fitzhardinge
2011-08-24 21:36 ` [PATCH 01/12] x86/cmpxchg: linux/alternative.h has LOCK_PREFIX Jeremy Fitzhardinge
2011-08-24 21:36   ` [PATCH 02/12] x86/cmpxchg: move 32-bit __cmpxchg_wrong_size to match 64 bit Jeremy Fitzhardinge
2011-08-24 21:37   ` [PATCH 03/12] x86/cmpxchg: move 64-bit set64_bit() to match 32-bit Jeremy Fitzhardinge
2011-08-24 21:37   ` [PATCH 04/12] x86/cmpxchg: unify cmpxchg into cmpxchg.h Jeremy Fitzhardinge
2011-08-24 21:37   ` [PATCH 05/12] x86: add xadd helper macro Jeremy Fitzhardinge
2011-08-24 21:37   ` [PATCH 06/12] x86: add cmpxchg_flag() variant Jeremy Fitzhardinge
2011-08-24 21:37   ` [PATCH 07/12] x86: use cmpxchg_flag() where applicable Jeremy Fitzhardinge
2011-08-24 21:56     ` Linus Torvalds
2011-08-24 22:01       ` H. Peter Anvin
2011-08-24 22:03         ` Jeremy Fitzhardinge
2011-08-24 22:05           ` H. Peter Anvin
2011-08-24 22:02       ` Jeremy Fitzhardinge
2011-08-24 21:37   ` [PATCH 08/12] x86: use xadd helper more widely Jeremy Fitzhardinge
2011-08-24 21:37   ` [PATCH 09/12] x86/ticketlock: clean up types and accessors Jeremy Fitzhardinge
2011-08-24 21:37   ` [PATCH 10/12] x86/ticketlock: convert spin loop to C Jeremy Fitzhardinge
2011-08-24 21:37   ` [PATCH 11/12] x86/ticketlock: convert __ticket_spin_lock to use xadd() Jeremy Fitzhardinge
2011-08-24 21:37   ` [PATCH 12/12] x86/ticketlock: make __ticket_spin_trylock common Jeremy Fitzhardinge
2011-08-24 21:46 ` [PATCH 00/18] x86: Ticket lock + cmpxchg cleanup Jeremy Fitzhardinge

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=fc96a1a856449f774724e35f81594c1ec16c5ca3.1314207974.git.jeremy.fitzhardinge@citrix.com \
    --to=jeremy@goop.org \
    --cc=hpa@zytor.com \
    --cc=jeremy.fitzhardinge@citrix.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=npiggin@kernel.dk \
    --cc=peterz@infradead.org \
    --cc=torvalds@linux-foundation.org \
    --cc=x86@kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®