lkml.org 
[lkml]   [2011]   [Jun]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4/8] x86/ticketlock: make large and small ticket versions of spin_lock the same
    Date
    From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

    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>
    ---
    arch/x86/include/asm/spinlock.h | 23 ++++++++---------------
    1 files changed, 8 insertions(+), 15 deletions(-)

    diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h
    index 704b0c3..694b8a0 100644
    --- a/arch/x86/include/asm/spinlock.h
    +++ b/arch/x86/include/asm/spinlock.h
    @@ -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 */
    }
    --
    1.7.5.4


    \
     
     \ /
      Last update: 2011-06-24 03:23    [W:4.296 / U:0.208 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site