patch-2.1.121 linux/include/asm-alpha/hardirq.h

Next file: linux/include/asm-alpha/hwrpb.h
Previous file: linux/include/asm-alpha/floppy.h
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.1.120/linux/include/asm-alpha/hardirq.h linux/include/asm-alpha/hardirq.h
@@ -1,51 +1,58 @@
 #ifndef _ALPHA_HARDIRQ_H
 #define _ALPHA_HARDIRQ_H
 
+/* Initially just a straight copy of the i386 code.  */
+
 #include <linux/tasks.h>
 
 extern unsigned int local_irq_count[NR_CPUS];
-#define in_interrupt() (local_irq_count[smp_processor_id()] + local_bh_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__
 
 #define hardirq_trylock(cpu)	(local_irq_count[cpu] == 0)
-#define hardirq_endlock(cpu)	do { } while (0)
+#define hardirq_endlock(cpu)	((void) 0)
 
-#define hardirq_enter(cpu)	(local_irq_count[cpu]++)
-#define hardirq_exit(cpu)	(local_irq_count[cpu]--)
+#define hardirq_enter(cpu, irq)	(local_irq_count[cpu]++)
+#define hardirq_exit(cpu, irq)	(local_irq_count[cpu]--)
 
-#define synchronize_irq()	do { } while (0)
+#define synchronize_irq()	barrier()
 
 #else
 
-/* initially just a straight copy if the i386 code */
-
 #include <asm/atomic.h>
 #include <asm/spinlock.h>
-#include <asm/system.h>
-#include <asm/smp.h>
 
-extern unsigned char global_irq_holder;
+extern int global_irq_holder;
 extern spinlock_t global_irq_lock;
 extern atomic_t global_irq_count;
 
 static inline void release_irqlock(int cpu)
 {
 	/* if we didn't own the irq lock, just ignore.. */
-	if (global_irq_holder == (unsigned char) cpu) {
+	if (global_irq_holder == cpu) {
 		global_irq_holder = NO_PROC_ID;
 		spin_unlock(&global_irq_lock);
         }
 }
 
-/* Ordering of the counter bumps is _deadly_ important. */
-static inline void hardirq_enter(int cpu)
+static inline void hardirq_enter(int cpu, int irq)
 {
 	++local_irq_count[cpu];
         atomic_inc(&global_irq_count);
 }
 
-static inline void hardirq_exit(int cpu)
+static inline void hardirq_exit(int cpu, int irq)
 {
 	atomic_dec(&global_irq_count);
         --local_irq_count[cpu];
@@ -53,28 +60,10 @@
 
 static inline int hardirq_trylock(int cpu)
 {
-	unsigned long flags;
-	int ret = 1;
-
-        __save_and_cli(flags);
-        if ((atomic_add_return(1, &global_irq_count) != 1) ||
-	    (global_irq_lock.lock != 0)) {
-		atomic_dec(&global_irq_count);
-                __restore_flags(flags);
-                ret = 0;
-        } else {
-		++local_irq_count[cpu];
-                __sti();
-        }
-        return ret;
+	return !atomic_read(&global_irq_count) && !global_irq_lock.lock;
 }
 
-#define hardirq_endlock(cpu) \
-	do { \
-	       __cli(); \
-		hardirq_exit(cpu); \
-		__sti(); \
-	} while (0)
+#define hardirq_endlock(cpu)  ((void)0)
 
 extern void synchronize_irq(void);
 

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov