I am confused by preempt_disable/preempt_enable in the following code from ksoftirqd. It is a kernel thread, but why preempt must been disabled during do_softirq()?
for(;;) { set_current_state(TASK_INTERRUPTIBLE ); schedule( ); /* now in TASK_RUNNING state */ while (local_softirq_pending( )) { preempt_disable(); do_softirq( ); preempt_enable(); cond_resched( ); }}