 
	
| [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 08/45] xen: arm64: spinlocks
 Comparing the existing arm32 locks:
At 15:56 +0000 on 23 Jan (1358956574), Ian Campbell wrote:
> +static always_inline void _raw_spin_unlock(raw_spinlock_t *lock)
> +{
> +    ASSERT(_raw_spin_is_locked(lock));
> +
> +    smp_mb();
> +
> +    __asm__ __volatile__(
> +"   str     %1, [%0]\n"
> +    :
> +    : "r" (&lock->lock), "r" (0)
> +    : "cc");
> +
> +    dsb_sev();
> +}
> +
> +static always_inline int _raw_spin_trylock(raw_spinlock_t *lock)
> +{
> +    unsigned long tmp;
> +
> +    __asm__ __volatile__(
> +"   ldrex   %0, [%1]\n"
> +"   teq     %0, #0\n"
> +"   strexeq %0, %2, [%1]"
> +    : "=&r" (tmp)
> +    : "r" (&lock->lock), "r" (1)
> +    : "cc");
> +
> +    if (tmp == 0) {
> +        smp_mb();
> +        return 1;
> +    } else {
> +        return 0;
> +    }
> +}
with the new arm64 ones:
> +static always_inline void _raw_spin_unlock(raw_spinlock_t *lock)
> +{
> +    ASSERT(_raw_spin_is_locked(lock));
> +
> +    asm volatile(
> +        "       stlr    %w1, [%0]\n"
> +        : : "r" (&lock->lock), "r" (0) : "memory");
> +}
> +
> +static always_inline int _raw_spin_trylock(raw_spinlock_t *lock)
> +{
> +    unsigned int tmp;
> +
> +    asm volatile(
> +        "       ldaxr   %w0, [%1]\n"
> +        "       cbnz    %w0, 1f\n"
> +        "       stxr    %w0, %w2, [%1]\n"
> +        "1:\n"
> +        : "=&r" (tmp)
> +        : "r" (&lock->lock), "r" (1)
> +        : "memory");
> +
> +    return !tmp;
> +}
The 32-bit ones have a scattering of DSBs and SEVs that aren't there in
64-bit.  The DSBs at least seem useful.  Not sure about SEV - presumably
that's useful if the slow path has a WFE in it?
Tim.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
 
 | 
|  | Lists.xenproject.org is hosted with RackSpace, monitoring our |