]> git.hungrycats.org Git - linux/commitdiff
[PATCH] Optimized UP preempt fix
authorRobert Love <rml@tech9.net>
Mon, 11 Feb 2002 12:41:33 +0000 (04:41 -0800)
committerLinus Torvalds <torvalds@home.transmeta.com>
Mon, 11 Feb 2002 12:41:33 +0000 (04:41 -0800)
I previously sent a patch by Mikael Pettersson to fix the UP+preempt
problem.  It seems from your BK repository you have not yet merged it;
if so, this patch takes a different approach which is optimal, removing
the unneeded conditional altogether in the UP case.  I have verified UP
and SMP are now correct.  Patch is against 2.5.4, please apply.

Robert Love

include/asm-i386/smplock.h

index e1d592575a19b5b3fb9ee12a8922c9e7c0702b3a..888a7b82f103484f629ef8bc35cc49dca1f3550d 100644 (file)
@@ -12,10 +12,15 @@ extern spinlock_t kernel_flag;
 
 #ifdef CONFIG_SMP
 #define kernel_locked()                spin_is_locked(&kernel_flag)
+#define check_irq_holder(cpu) \
+do { \
+       if (global_irq_holder == (cpu)) \
+               BUG(); \
+} while(0)
 #else
 #ifdef CONFIG_PREEMPT
 #define kernel_locked()                preempt_get_count()
-#define global_irq_holder      0
+#define check_irq_holder(cpu)  do { } while(0)
 #else
 #define kernel_locked()                1
 #endif
@@ -28,8 +33,7 @@ extern spinlock_t kernel_flag;
 do {                                           \
        if (unlikely(task->lock_depth >= 0)) {  \
                spin_unlock(&kernel_flag);      \
-               if (global_irq_holder == (cpu)) \
-                       BUG();                  \
+               check_irq_holder(cpu);          \
        }                                       \
 } while (0)