Re: [PATCH 03/20] x86/ticketlock: Use C for __ticket_spin_unlock

2010-11-15 Thread Paolo Bonzini
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

2010-11-15 Thread Américo Wang
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

2010-11-15 Thread Jeremy Fitzhardinge
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

2010-11-03 Thread Jeremy Fitzhardinge
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

2010-11-03 Thread Jeremy Fitzhardinge
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