linux.conf.au, January 2003 PROGRAMMING: kernel/softirq.c /* * we cannot loop indefinitely here to avoid userspace starvation, * but we also don't want to introduce a worst case 1/HZ latency * to the pending events, so lets the scheduler to balance * the softirq load for us. */ static inline void wakeup_softirqd(unsigned cpu) { struct task_struct * tsk = ksoftirqd_task(cpu); if (tsk && tsk->state != TASK_RUNNING) wake_up_process(tsk); } asmlinkage void do_softirq() { __u32 pending; long flags; __u32 mask; int cpu; if (in_interrupt()) return; local_irq_save(flags); cpu = smp_processor_id();