diff options
Diffstat (limited to 'arch/x86/include/asm/qspinlock.h')
| -rw-r--r-- | arch/x86/include/asm/qspinlock.h | 15 | 
1 files changed, 15 insertions, 0 deletions
| diff --git a/arch/x86/include/asm/qspinlock.h b/arch/x86/include/asm/qspinlock.h index 3e70bed8a978..87623c6b13db 100644 --- a/arch/x86/include/asm/qspinlock.h +++ b/arch/x86/include/asm/qspinlock.h @@ -6,9 +6,24 @@  #include <asm/cpufeature.h>  #include <asm-generic/qspinlock_types.h>  #include <asm/paravirt.h> +#include <asm/rmwcc.h>  #define _Q_PENDING_LOOPS	(1 << 9) +#define queued_fetch_set_pending_acquire queued_fetch_set_pending_acquire +static __always_inline u32 queued_fetch_set_pending_acquire(struct qspinlock *lock) +{ +	u32 val = 0; + +	if (GEN_BINARY_RMWcc(LOCK_PREFIX "btsl", lock->val.counter, c, +			     "I", _Q_PENDING_OFFSET)) +		val |= _Q_PENDING_VAL; + +	val |= atomic_read(&lock->val) & ~_Q_PENDING_MASK; + +	return val; +} +  #ifdef CONFIG_PARAVIRT_SPINLOCKS  extern void native_queued_spin_lock_slowpath(struct qspinlock *lock, u32 val);  extern void __pv_init_lock_hash(void); |