diff options
Diffstat (limited to 'arch/x86/include/asm/qspinlock.h')
| -rw-r--r-- | arch/x86/include/asm/qspinlock.h | 13 | 
1 files changed, 8 insertions, 5 deletions
| diff --git a/arch/x86/include/asm/qspinlock.h b/arch/x86/include/asm/qspinlock.h index 87623c6b13db..bd5ac6cc37db 100644 --- a/arch/x86/include/asm/qspinlock.h +++ b/arch/x86/include/asm/qspinlock.h @@ -13,12 +13,15 @@  #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; +	u32 val; +	/* +	 * We can't use GEN_BINARY_RMWcc() inside an if() stmt because asm goto +	 * and CONFIG_PROFILE_ALL_BRANCHES=y results in a label inside a +	 * statement expression, which GCC doesn't like. +	 */ +	val = GEN_BINARY_RMWcc(LOCK_PREFIX "btsl", lock->val.counter, c, +			       "I", _Q_PENDING_OFFSET) * _Q_PENDING_VAL;  	val |= atomic_read(&lock->val) & ~_Q_PENDING_MASK;  	return val; |