linux.conf.au, January 2003
      PROGRAMMING: kernel/softirq.c

 		pending = softirq_pending(cpu);
 	
 		if (pending) {
 			struct softirq_action *h;
 	
 			mask = ~pending;
 			local_bh_disable();
 	restart:
 			/* Reset the pending bitmask before enabling irqs */
 			softirq_pending(cpu) = 0;
 			local_irq_enable();
 	
 			h = softirq_vec;
 	
 			do {
 				if (pending & 1)
 					h->action(h);
 				h++;
 				pending >>= 1;
 			} while (pending);
 	
 			local_irq_disable();
 	
 			pending = softirq_pending(cpu);
 			if (pending & mask) {
 				mask &= ~pending;
 				goto restart;
 			}
 			__local_bh_enable();
 	
 			if (pending)
 				wakeup_softirqd(cpu);
 		}
 		local_irq_restore(flags);
 	}