X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=kernel%2Fspinlock.c;h=0375fcd5921df5fe390ec6a3f1c1ce402d240f80;hb=987b0145d94eecf292d8b301228356f44611ab7c;hp=d1b810782bc4e1b643faac72733074e2dc492fa4;hpb=f7ed79d23a47594e7834d66a8f14449796d4f3e6;p=linux-2.6.git diff --git a/kernel/spinlock.c b/kernel/spinlock.c index d1b810782..0375fcd59 100644 --- a/kernel/spinlock.c +++ b/kernel/spinlock.c @@ -179,16 +179,16 @@ EXPORT_SYMBOL(_write_lock); #define BUILD_LOCK_OPS(op, locktype) \ void __lockfunc _##op##_lock(locktype##_t *lock) \ { \ + preempt_disable(); \ for (;;) { \ - preempt_disable(); \ if (likely(_raw_##op##_trylock(lock))) \ break; \ preempt_enable(); \ - \ if (!(lock)->break_lock) \ (lock)->break_lock = 1; \ while (!op##_can_lock(lock) && (lock)->break_lock) \ cpu_relax(); \ + preempt_disable(); \ } \ (lock)->break_lock = 0; \ } \ @@ -199,18 +199,19 @@ unsigned long __lockfunc _##op##_lock_irqsave(locktype##_t *lock) \ { \ unsigned long flags; \ \ + preempt_disable(); \ for (;;) { \ - preempt_disable(); \ local_irq_save(flags); \ if (likely(_raw_##op##_trylock(lock))) \ break; \ local_irq_restore(flags); \ - preempt_enable(); \ \ + preempt_enable(); \ if (!(lock)->break_lock) \ (lock)->break_lock = 1; \ while (!op##_can_lock(lock) && (lock)->break_lock) \ cpu_relax(); \ + preempt_disable(); \ } \ (lock)->break_lock = 0; \ return flags; \