From: Ravikiran G Thirumalai Right now we have on mainline (non PREEMPT case); i386 x86_64 ----------------------------------------------------------------------------- spin_lock_irq cli when spin cli when spin spin_lock_irqsave spin with intr enabled spin with intr enabled The posted patchset changed this to: i386 x86_64 ----------------------------------------------------------------------------- spin_lock_irq cli when spin spin with intr enabled spin_lock_irqsave spin with intr enabled spin with intr enabled Here goes the i386 part as well for spin_lock_irq. Signed-off-by: Ravikiran Thirumalai Cc: Ingo Molnar Acked-by: Andi Kleen Cc: Michael Davidson Cc: Pravin B. Shelar Cc: Shai Fultheim Signed-off-by: Andrew Morton --- include/asm-i386/paravirt.h | 4 ++-- include/asm-i386/spinlock.h | 20 +++++++++++++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff -puN include/asm-i386/paravirt.h~spin_lock_irq-enable-interrupts-while-spinning-i386-implementation include/asm-i386/paravirt.h --- a/include/asm-i386/paravirt.h~spin_lock_irq-enable-interrupts-while-spinning-i386-implementation +++ a/include/asm-i386/paravirt.h @@ -517,10 +517,10 @@ static inline unsigned long __raw_local_ "popl %%edx; popl %%ecx", \ PARAVIRT_IRQ_ENABLE, CLBR_EAX) #define CLI_STI_CLOBBERS , "%eax" -#define CLI_STI_INPUT_ARGS \ - , \ +#define __CLI_STI_INPUT_ARGS \ [irq_disable] "i" (offsetof(struct paravirt_ops, irq_disable)), \ [irq_enable] "i" (offsetof(struct paravirt_ops, irq_enable)) +#define CLI_STI_INPUT_ARGS , __CLI_STI_INPUT_ARGS #else /* __ASSEMBLY__ */ diff -puN include/asm-i386/spinlock.h~spin_lock_irq-enable-interrupts-while-spinning-i386-implementation include/asm-i386/spinlock.h --- a/include/asm-i386/spinlock.h~spin_lock_irq-enable-interrupts-while-spinning-i386-implementation +++ a/include/asm-i386/spinlock.h @@ -14,6 +14,7 @@ #define STI_STRING "sti" #define CLI_STI_CLOBBERS #define CLI_STI_INPUT_ARGS +#define __CLI_STI_INPUT_ARGS #endif /* CONFIG_PARAVIRT */ /* @@ -82,7 +83,24 @@ static inline void __raw_spin_lock_flags CLI_STI_INPUT_ARGS : "memory" CLI_STI_CLOBBERS); } -# 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 " ; decb %[slock]\n\t" + "jns 3f\n" + STI_STRING "\n" + "2:\t" + "rep;nop\n\t" + "cmpb $0,%[slock]\n\t" + "jle 2b\n\t" + CLI_STRING "\n" + "jmp 1b\n" + "3:\n\t" + : [slock] "+m" (lock->slock) + : __CLI_STI_INPUT_ARGS + : "memory" CLI_STI_CLOBBERS); +} #endif static inline int __raw_spin_trylock(raw_spinlock_t *lock) _