Re: [PATCH 03/20] x86/ticketlock: Use C for __ticket_spin_unlock
On 11/13/2010 11:05 AM, Américo Wang wrote: On Wed, Nov 03, 2010 at 10:59:44AM -0400, Jeremy Fitzhardinge wrote: * On PPro SMP or if we are using OOSTORE, we use a locked operation to unlock * (PPro errata 66, 92) */ -# define UNLOCK_LOCK_PREFIX LOCK_PREFIX +static __always_inline void __ticket_unlock_release(struct arch_spinlock *lock) +{ +if (sizeof(lock-tickets.head) == sizeof(u8)) +asm (LOCK_PREFIX incb %0 + : +m (lock-tickets.head) : : memory); +else +asm (LOCK_PREFIX incw %0 + : +m (lock-tickets.head) : : memory); This 'if/else' really should be done with #ifdef, even though the compiler may be smart enough to remove it. That's a sure path to bitrot. Paolo ___ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/virtualization
Re: [PATCH 03/20] x86/ticketlock: Use C for __ticket_spin_unlock
On Wed, Nov 03, 2010 at 10:59:44AM -0400, Jeremy Fitzhardinge wrote: * On PPro SMP or if we are using OOSTORE, we use a locked operation to unlock * (PPro errata 66, 92) */ -# define UNLOCK_LOCK_PREFIX LOCK_PREFIX +static __always_inline void __ticket_unlock_release(struct arch_spinlock *lock) +{ + if (sizeof(lock-tickets.head) == sizeof(u8)) + asm (LOCK_PREFIX incb %0 + : +m (lock-tickets.head) : : memory); + else + asm (LOCK_PREFIX incw %0 + : +m (lock-tickets.head) : : memory); This 'if/else' really should be done with #ifdef, even though the compiler may be smart enough to remove it. + +} #else -# define UNLOCK_LOCK_PREFIX +static __always_inline void __ticket_unlock_release(struct arch_spinlock *lock) +{ + barrier(); + lock-tickets.head++; + barrier(); The second barrier() is not needed. Thanks. ___ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/virtualization
Re: [PATCH 03/20] x86/ticketlock: Use C for __ticket_spin_unlock
On 11/13/2010 02:05 AM, Américo Wang wrote: On Wed, Nov 03, 2010 at 10:59:44AM -0400, Jeremy Fitzhardinge wrote: * On PPro SMP or if we are using OOSTORE, we use a locked operation to unlock * (PPro errata 66, 92) */ -# define UNLOCK_LOCK_PREFIX LOCK_PREFIX +static __always_inline void __ticket_unlock_release(struct arch_spinlock *lock) +{ +if (sizeof(lock-tickets.head) == sizeof(u8)) +asm (LOCK_PREFIX incb %0 + : +m (lock-tickets.head) : : memory); +else +asm (LOCK_PREFIX incw %0 + : +m (lock-tickets.head) : : memory); This 'if/else' really should be done with #ifdef, even though the compiler may be smart enough to remove it. No, we depend on if/else with constant arguments doing the right thing all over the kernel. It is always preferable to use it instead of #ifdef where possible, so that the two branches of code are always subjected to compiler checking, even if they're not being used. + +} #else -# define UNLOCK_LOCK_PREFIX +static __always_inline void __ticket_unlock_release(struct arch_spinlock *lock) +{ +barrier(); +lock-tickets.head++; +barrier(); The second barrier() is not needed. Agreed. It gets removed in a later patch. J ___ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/virtualization
[PATCH 03/20] x86/ticketlock: Use C for __ticket_spin_unlock
From: Jeremy Fitzhardinge jeremy.fitzhardi...@citrix.com If we don't need to use a locked inc for unlock, then implement it in C. Signed-off-by: Jeremy Fitzhardinge jeremy.fitzhardi...@citrix.com --- arch/x86/include/asm/spinlock.h | 33 ++--- 1 files changed, 18 insertions(+), 15 deletions(-) diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h index 6711d36..082990a 100644 --- a/arch/x86/include/asm/spinlock.h +++ b/arch/x86/include/asm/spinlock.h @@ -33,9 +33,23 @@ * On PPro SMP or if we are using OOSTORE, we use a locked operation to unlock * (PPro errata 66, 92) */ -# define UNLOCK_LOCK_PREFIX LOCK_PREFIX +static __always_inline void __ticket_unlock_release(struct arch_spinlock *lock) +{ + if (sizeof(lock-tickets.head) == sizeof(u8)) + asm (LOCK_PREFIX incb %0 +: +m (lock-tickets.head) : : memory); + else + asm (LOCK_PREFIX incw %0 +: +m (lock-tickets.head) : : memory); + +} #else -# define UNLOCK_LOCK_PREFIX +static __always_inline void __ticket_unlock_release(struct arch_spinlock *lock) +{ + barrier(); + lock-tickets.head++; + barrier(); +} #endif /* @@ -93,14 +107,6 @@ static __always_inline int __ticket_spin_trylock(arch_spinlock_t *lock) return tmp; } - -static __always_inline void __ticket_spin_unlock(arch_spinlock_t *lock) -{ - asm volatile(UNLOCK_LOCK_PREFIX incb %0 -: +m (lock-slock) -: -: memory, cc); -} #else static __always_inline void __ticket_spin_lock(arch_spinlock_t *lock) { @@ -144,15 +150,12 @@ static __always_inline int __ticket_spin_trylock(arch_spinlock_t *lock) return tmp; } +#endif static __always_inline void __ticket_spin_unlock(arch_spinlock_t *lock) { - asm volatile(UNLOCK_LOCK_PREFIX incw %0 -: +m (lock-slock) -: -: memory, cc); + __ticket_unlock_release(lock); } -#endif static inline int __ticket_spin_is_locked(arch_spinlock_t *lock) { -- 1.7.2.3 ___ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/virtualization
Re: [PATCH 03/20] x86/ticketlock: Use C for __ticket_spin_unlock
On 11/03/2010 11:13 AM, Eric Dumazet wrote: Le mercredi 03 novembre 2010 à 10:59 -0400, Jeremy Fitzhardinge a écrit : From: Jeremy Fitzhardinge jeremy.fitzhardi...@citrix.com If we don't need to use a locked inc for unlock, then implement it in C. Signed-off-by: Jeremy Fitzhardinge jeremy.fitzhardi...@citrix.com --- arch/x86/include/asm/spinlock.h | 33 ++--- 1 files changed, 18 insertions(+), 15 deletions(-) diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h index 6711d36..082990a 100644 --- a/arch/x86/include/asm/spinlock.h +++ b/arch/x86/include/asm/spinlock.h @@ -33,9 +33,23 @@ * On PPro SMP or if we are using OOSTORE, we use a locked operation to unlock * (PPro errata 66, 92) */ -# define UNLOCK_LOCK_PREFIX LOCK_PREFIX +static __always_inline void __ticket_unlock_release(struct arch_spinlock *lock) +{ +if (sizeof(lock-tickets.head) == sizeof(u8)) +asm (LOCK_PREFIX incb %0 + : +m (lock-tickets.head) : : memory); +else +asm (LOCK_PREFIX incw %0 + : +m (lock-tickets.head) : : memory); + +} #else -# define UNLOCK_LOCK_PREFIX +static __always_inline void __ticket_unlock_release(struct arch_spinlock *lock) +{ +barrier(); technically speaking, it should be : smp_wmb() Perhaps. In practise it won't make a difference because it is defined as barrier() unless OOSTORE is defined, in which case we need to do a locked increment anyway. Thanks, J ___ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/virtualization