do_bottom_half() vs. interrupt flag

Jan-Simon Pendry (jsp@ms.com)
Thu, 01 Jul 1999 14:58:37 +0100


the top of linux/kernel/softirq.c has the following comment:

* do_bottom_half() runs at normal kernel priority: all interrupts
* enabled. do_bottom_half() is atomic with respect to itself: a
* bottom_half handler need not be re-entrant.

to me, this seems to imply that do_bottom_half() should only
be called when interrupts are enabled (and indeed that seems
to be the case). however, do_bottom_half looks like this:

asmlinkage void do_bottom_half(void)
{
int cpu = smp_processor_id();

if (softirq_trylock(cpu)) {
if (hardirq_trylock(cpu)) {
__sti();
run_bottom_halves();
__cli();
hardirq_endlock(cpu);
}
softirq_endlock(cpu);
}
}

just prior to run_bottom_halves(), interrupts get explicitly
enabled (__sti()). why is that?

also, on exit, interrupts are explicity disabled (__cli()).
this step appears to be incorrect.

any comments?

jan-simon.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/