From: Ravikiran G Thirumalai Implement interrupt enabling while spinning for lock for spin_lock_irq Signed-off by: Pravin B. Shelar Signed-off by: Ravikiran Thirumalai Signed-off by: Shai Fultheim Cc: Ingo Molnar Acked-by: Andi Kleen Cc: Michael Davidson Signed-off-by: Andrew Morton --- include/asm-x86_64/spinlock.h | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff -puN include/asm-x86_64/spinlock.h~spin_lock_irq-enable-interrupts-while-spinning-x86_64-implementation include/asm-x86_64/spinlock.h --- a/include/asm-x86_64/spinlock.h~spin_lock_irq-enable-interrupts-while-spinning-x86_64-implementation +++ a/include/asm-x86_64/spinlock.h @@ -63,7 +63,21 @@ static inline void __raw_spin_lock_flags "5:\n\t" : "+m" (lock->slock) : "r" ((unsigned)flags) : "memory"); } -#define __raw_spin_lock_irq(lock) __raw_spin_lock(lock) +static inline void __raw_spin_lock_irq(raw_spinlock_t *lock) +{ + asm volatile( + "\n1:\t" + LOCK_PREFIX " ; decl %0\n\t" + "jns 2f\n" + "sti\n" /* Enable interrupts during spin */ + "3:\n" + "rep;nop\n\t" + "cmpl $0,%0\n\t" + "jle 3b\n\t" + "cli\n" + "jmp 1b\n" + "2:\t" : "+m" (lock->slock) : : "memory"); +} #endif static inline int __raw_spin_trylock(raw_spinlock_t *lock) _