diff options
Diffstat (limited to 'include/asm-i386/hardirq.h')
-rw-r--r-- | include/asm-i386/hardirq.h | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/include/asm-i386/hardirq.h b/include/asm-i386/hardirq.h index 610db5633..6b8e92620 100644 --- a/include/asm-i386/hardirq.h +++ b/include/asm-i386/hardirq.h @@ -2,25 +2,24 @@ #define __ASM_HARDIRQ_H #include <linux/threads.h> - -extern unsigned int local_irq_count[NR_CPUS]; +#include <linux/irq.h> /* * Are we in an interrupt context? Either doing bottom half * or hardware interrupt processing? */ #define in_interrupt() ({ int __cpu = smp_processor_id(); \ - (local_irq_count[__cpu] + local_bh_count[__cpu] != 0); }) + (local_irq_count(__cpu) + local_bh_count(__cpu) != 0); }) -#define in_irq() (local_irq_count[smp_processor_id()] != 0) +#define in_irq() (local_irq_count(smp_processor_id()) != 0) #ifndef __SMP__ -#define hardirq_trylock(cpu) (local_irq_count[cpu] == 0) +#define hardirq_trylock(cpu) (local_irq_count(cpu) == 0) #define hardirq_endlock(cpu) do { } while (0) -#define irq_enter(cpu, irq) (local_irq_count[cpu]++) -#define irq_exit(cpu, irq) (local_irq_count[cpu]--) +#define irq_enter(cpu, irq) (local_irq_count(cpu)++) +#define irq_exit(cpu, irq) (local_irq_count(cpu)--) #define synchronize_irq() barrier() @@ -31,7 +30,16 @@ extern unsigned int local_irq_count[NR_CPUS]; extern unsigned char global_irq_holder; extern unsigned volatile int global_irq_lock; -extern atomic_t global_irq_count; + +static inline int irqs_running (void) +{ + int i; + + for (i = 0; i < smp_num_cpus; i++) + if (local_irq_count(i)) + return 1; + return 0; +} static inline void release_irqlock(int cpu) { @@ -44,8 +52,7 @@ static inline void release_irqlock(int cpu) static inline void irq_enter(int cpu, int irq) { - ++local_irq_count[cpu]; - atomic_inc(&global_irq_count); + ++local_irq_count(cpu); while (test_bit(0,&global_irq_lock)) { /* nothing */; @@ -54,13 +61,12 @@ static inline void irq_enter(int cpu, int irq) static inline void irq_exit(int cpu, int irq) { - atomic_dec(&global_irq_count); - --local_irq_count[cpu]; + --local_irq_count(cpu); } static inline int hardirq_trylock(int cpu) { - return !local_irq_count[cpu] && !test_bit(0,&global_irq_lock); + return !local_irq_count(cpu) && !test_bit(0,&global_irq_lock); } #define hardirq_endlock(cpu) do { } while (0) |