diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1999-01-04 16:03:48 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 1999-01-04 16:03:48 +0000 |
commit | 78c388aed2b7184182c08428db1de6c872d815f5 (patch) | |
tree | 4b2003b1b4ceb241a17faa995da8dd1004bb8e45 /include/asm-ppc/hardirq.h | |
parent | eb7a5bf93aaa4be1d7c6181100ab7639e74d67f7 (diff) |
Merge with Linux 2.1.131 and more MIPS goodies.
(Did I mention that CVS is buggy ...)
Diffstat (limited to 'include/asm-ppc/hardirq.h')
-rw-r--r-- | include/asm-ppc/hardirq.h | 72 |
1 files changed, 38 insertions, 34 deletions
diff --git a/include/asm-ppc/hardirq.h b/include/asm-ppc/hardirq.h index 454934f39..cc0db7259 100644 --- a/include/asm-ppc/hardirq.h +++ b/include/asm-ppc/hardirq.h @@ -2,7 +2,13 @@ #define __ASM_HARDIRQ_H extern unsigned int local_irq_count[NR_CPUS]; -#define in_interrupt() (local_irq_count[smp_processor_id()] != 0) + +/* + * 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); }) #ifndef __SMP__ @@ -16,44 +22,42 @@ extern unsigned int local_irq_count[NR_CPUS]; #else /* __SMP__ */ +#include <asm/atomic.h> + extern unsigned char global_irq_holder; -extern spinlock_t global_irq_lock; +extern unsigned volatile int global_irq_lock; extern atomic_t global_irq_count; -#define release_irqlock(cpu) \ -do { \ - if(global_irq_holder == (unsigned char) cpu) { \ - global_irq_holder = NO_PROC_ID; \ - spin_unlock(&global_irq_lock); \ - } \ -} while(0) - -/* Ordering of the counter bumps is _deadly_ important. */ -#define hardirq_enter(cpu) \ - do { ++local_irq_count[cpu]; atomic_inc(&global_irq_count); } while(0) - -#define hardirq_exit(cpu) \ - do { atomic_dec(&global_irq_count); --local_irq_count[cpu]; } while(0) - -#define hardirq_trylock(cpu) \ -({ unsigned long flags; int ret = 1; \ - __save_flags(flags); \ - __cli(); \ - if(atomic_add_return(1, &global_irq_count) != 1 || \ - *(((unsigned char *)(&global_irq_lock)))) { \ - atomic_dec(&global_irq_count); \ - __restore_flags(flags); \ - ret = 0; \ - } else { \ - ++local_irq_count[cpu]; \ - __sti(); \ - } \ - ret; \ -}) - -#define hardirq_endlock(cpu) do { __cli(); hardirq_exit(cpu); __sti(); } while(0) +static inline void release_irqlock(int cpu) +{ + /* if we didn't own the irq lock, just ignore.. */ + if (global_irq_holder == (unsigned char) cpu) { + global_irq_holder = NO_PROC_ID; + clear_bit(0,&global_irq_lock); + } +} + +static inline void hardirq_enter(int cpu) +{ + ++local_irq_count[cpu]; + atomic_inc(&global_irq_count); +} + +static inline void hardirq_exit(int cpu) +{ + atomic_dec(&global_irq_count); + --local_irq_count[cpu]; +} + +static inline int hardirq_trylock(int cpu) +{ + return !atomic_read(&global_irq_count) && !test_bit(0,&global_irq_lock); +} + +#define hardirq_endlock(cpu) do { } while (0) extern void synchronize_irq(void); + #endif /* __SMP__ */ #endif /* __ASM_HARDIRQ_H */ |