further updates, the patch is still against vanilla 2.4.6-pre1:

 - didnt include the necessery entry.S changes. (David S. Miller)

 - moved raise_softirq() to the arch headers as well. (David S. Miller)

        Ingo
--- linux/kernel/ksyms.c.orig   Tue Jun  5 09:59:44 2001
+++ linux/kernel/ksyms.c        Tue Jun  5 10:00:18 2001
@@ -535,6 +535,9 @@
 EXPORT_SYMBOL(tasklet_init);
 EXPORT_SYMBOL(tasklet_kill);
 EXPORT_SYMBOL(__run_task_queue);
+EXPORT_SYMBOL(do_softirq);
+EXPORT_SYMBOL(tasklet_schedule);
+EXPORT_SYMBOL(tasklet_hi_schedule);
 
 /* init task, for moving kthread roots - ought to export a function ?? */
 
--- linux/kernel/softirq.c.orig Tue Jun  5 10:09:02 2001
+++ linux/kernel/softirq.c      Tue Jun  5 10:31:59 2001
@@ -50,7 +50,7 @@
 asmlinkage void do_softirq()
 {
        int cpu = smp_processor_id();
-       __u32 active, mask;
+       __u32 pending;
 
        local_irq_disable();
        if (in_interrupt())
@@ -58,31 +58,30 @@
 
        local_bh_disable();
 
-       mask = softirq_mask(cpu);
-       active = softirq_active(cpu) & mask;
+       pending = softirq_pending(cpu);
 
-       if (active) {
+       if (pending) {
                struct softirq_action *h;
 
 restart:
-               /* Reset active bitmask before enabling irqs */
-               softirq_active(cpu) &= ~active;
+               /* Reset the pending bitmask before enabling irqs */
+               softirq_pending(cpu) = 0;
 
                local_irq_enable();
 
                h = softirq_vec;
 
                do {
-                       if (active & 1)
+                       if (pending & 1)
                                h->action(h);
                        h++;
-                       active >>= 1;
-               } while (active);
+                       pending >>= 1;
+               } while (pending);
 
                local_irq_disable();
 
-               active = softirq_active(cpu) & mask;
-               if (active)
+               pending = softirq_pending(cpu);
+               if (pending)
                        goto retry;
        }
 
@@ -100,20 +99,10 @@
 }
 
 
-static spinlock_t softirq_mask_lock = SPIN_LOCK_UNLOCKED;
-
 void open_softirq(int nr, void (*action)(struct softirq_action*), void *data)
 {
-       unsigned long flags;
-       int i;
-
-       spin_lock_irqsave(&softirq_mask_lock, flags);
        softirq_vec[nr].data = data;
        softirq_vec[nr].action = action;
-
-       for (i=0; i<NR_CPUS; i++)
-               softirq_mask(i) |= (1<<nr);
-       spin_unlock_irqrestore(&softirq_mask_lock, flags);
 }
 
 
--- linux/include/linux/irq_cpustat.h.orig      Tue Jun  5 10:09:31 2001
+++ linux/include/linux/irq_cpustat.h   Tue Jun  5 10:21:16 2001
@@ -26,15 +26,11 @@
 #endif 
 
   /* arch independent irq_stat fields */
-#define softirq_active(cpu)    __IRQ_STAT((cpu), __softirq_active)
-#define softirq_mask(cpu)      __IRQ_STAT((cpu), __softirq_mask)
+#define softirq_pending(cpu)   __IRQ_STAT((cpu), __softirq_pending)
 #define local_irq_count(cpu)   __IRQ_STAT((cpu), __local_irq_count)
 #define local_bh_count(cpu)    __IRQ_STAT((cpu), __local_bh_count)
 #define syscall_count(cpu)     __IRQ_STAT((cpu), __syscall_count)
   /* arch dependent irq_stat fields */
 #define nmi_count(cpu)         __IRQ_STAT((cpu), __nmi_count)          /* i386, ia64 
*/
-
-#define softirq_pending(cpu) \
-       ((softirq_active(cpu) & softirq_mask(cpu)))
 
 #endif /* __irq_cpustat_h */
--- linux/include/linux/interrupt.h.orig        Tue Jun  5 10:11:02 2001
+++ linux/include/linux/interrupt.h     Tue Jun  5 10:41:53 2001
@@ -74,12 +74,6 @@
 asmlinkage void do_softirq(void);
 extern void open_softirq(int nr, void (*action)(struct softirq_action*), void *data);
 
-/* Locally cached atomic variables are cheaper than cli/sti */
-static inline void __cpu_raise_softirq(int cpu, int nr)
-{
-       set_bit(nr, &softirq_active(cpu));
-}
-
 static inline void raise_softirq(int nr)
 {
        __cpu_raise_softirq(smp_processor_id(), nr);
--- linux/include/asm-i386/hardirq.h.orig       Tue Jun  5 10:10:35 2001
+++ linux/include/asm-i386/hardirq.h    Tue Jun  5 10:21:17 2001
@@ -7,8 +7,7 @@
 
 /* entry.S is sensitive to the offsets of these fields */
 typedef struct {
-       unsigned int __softirq_active;
-       unsigned int __softirq_mask;
+       unsigned int __softirq_pending;
        unsigned int __local_irq_count;
        unsigned int __local_bh_count;
        unsigned int __syscall_count;
--- linux/include/asm-i386/softirq.h.orig       Tue Jun  5 10:16:53 2001
+++ linux/include/asm-i386/softirq.h    Tue Jun  5 10:33:19 2001
@@ -11,8 +11,8 @@
 
 #define local_bh_disable()     cpu_bh_disable(smp_processor_id())
 #define __local_bh_enable()    __cpu_bh_enable(smp_processor_id())
-#define local_bh_enable()      do { if (!--local_bh_count(smp_processor_id()) && 
softirq_pending(smp_processor_id())) { do_softirq(); __sti(); } } while (0)
-
+#define local_bh_enable()      do { int __cpu = smp_processor_id(); if 
+(!--local_bh_count(__cpu) && softirq_pending(__cpu)) { do_softirq(); __sti(); } } 
+while (0)
+#define __cpu_raise_softirq(cpu,nr) set_bit((nr), &softirq_pending(cpu));
 #define in_softirq() (local_bh_count(smp_processor_id()) != 0)
 
 #endif /* __ASM_SOFTIRQ_H */
--- linux/arch/i386/kernel/entry.S.orig Tue Jun  5 11:55:38 2001
+++ linux/arch/i386/kernel/entry.S      Tue Jun  5 11:57:48 2001
@@ -137,11 +137,11 @@
 #define CHECK_SOFTIRQ \
        movl processor(%ebx),%eax; \
        shll $CONFIG_X86_L1_CACHE_SHIFT,%eax; \
-       movl SYMBOL_NAME(irq_stat)(,%eax),%ecx; \
+       xorl %ecx,%ecx; \
        testl SYMBOL_NAME(irq_stat)+4(,%eax),%ecx
 #else
 #define CHECK_SOFTIRQ \
-       movl SYMBOL_NAME(irq_stat),%ecx; \
+       xorl %ecx,%ecx; \
        testl SYMBOL_NAME(irq_stat)+4,%ecx
 #endif
 

Reply via email to