]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
x86, ticketlock: Make large and small ticket versions of spin_lock the same
authorJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Fri, 24 Jun 2011 01:19:16 +0000 (18:19 -0700)
committerH. Peter Anvin <hpa@linux.intel.com>
Fri, 22 Jul 2011 18:18:37 +0000 (11:18 -0700)
Make the bulk of __ticket_spin_lock look identical for large and small
number of cpus.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Link: http://lkml.kernel.org/r/9eea42d16aabc7624488eb62213a763dbbacef38.1308878118.git.jeremy.fitzhardinge@citrix.com
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
arch/x86/include/asm/spinlock.h

index f8d51dc36366bed7c6143d6c978a89dc1dfe9750..078319e3d0c0caca65c5934752b9da46acb78ee0 100644 (file)
@@ -70,19 +70,16 @@ static __always_inline void __ticket_unlock_release(struct arch_spinlock *lock)
 #if (NR_CPUS < 256)
 static __always_inline void __ticket_spin_lock(arch_spinlock_t *lock)
 {
-       register union {
-               struct __raw_tickets tickets;
-               unsigned short slock;
-       } inc = { .slock = 1 << TICKET_SHIFT };
+       register struct __raw_tickets inc = { .tail = 1 };
 
        asm volatile (LOCK_PREFIX "xaddw %w0, %1\n"
-                     : "+Q" (inc), "+m" (lock->slock) : : "memory", "cc");
+                     : "+r" (inc), "+m" (lock->tickets) : : "memory", "cc");
 
        for (;;) {
-               if (inc.tickets.head == inc.tickets.tail)
+               if (inc.head == inc.tail)
                        goto out;
                cpu_relax();
-               inc.tickets.head = ACCESS_ONCE(lock->tickets.head);
+               inc.head = ACCESS_ONCE(lock->tickets.head);
        }
 out:   barrier();              /* make sure nothing creeps before the lock is taken */
 }
@@ -108,21 +105,17 @@ static __always_inline int __ticket_spin_trylock(arch_spinlock_t *lock)
 #else
 static __always_inline void __ticket_spin_lock(arch_spinlock_t *lock)
 {
-       unsigned inc = 1 << TICKET_SHIFT;
-       __ticket_t tmp;
+       register struct __raw_tickets inc = { .tail = 1 };
 
        asm volatile(LOCK_PREFIX "xaddl %0, %1\n\t"
-                    : "+r" (inc), "+m" (lock->slock)
+                    : "+r" (inc), "+m" (lock->tickets)
                     : : "memory", "cc");
 
-       tmp = inc;
-       inc >>= TICKET_SHIFT;
-
        for (;;) {
-               if ((__ticket_t)inc == tmp)
+               if (inc.head == inc.tail)
                        goto out;
                cpu_relax();
-               tmp = ACCESS_ONCE(lock->tickets.head);
+               inc.head = ACCESS_ONCE(lock->tickets.head);
        }
 out:   barrier();              /* make sure nothing creeps before the lock is taken */
 }