| Date | Sat, 13 Nov 2010 18:05:27 +0800 | From | Américo Wang <> | Subject | 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.
|