> There are three spinning-state structures (per CPU) here, allowing for
> spinning in process context, in bottom-half (softirq) context, and in
> hard-interrupt context.

There is an interrupt flag (called IRQF_DISABLED in 2.6.26, it was 
SA_NODELAY at some point in the past AFAIR) that controls if irq handler 
is called immediately with interrupts disabled, or a bit later with this 
irq masked and interrupts enabled.

Most interrupt handlers don't set this flag, so they are called with 
interrupts enabled.

If already spinning, softrq context can't be entered other way that from 
after hardirq processing. From this POV, spinlock taken in irq handler and 
spinlock taken in softrq handler are equivalent.

And I've just checked, in_interrupt() actually checks for both.

> Since interrupts are generally enabled during 
> interrupt handlers, there need to be multiple levels of hard-interrupt
> contexts (one per IRQ), if I'm not mistaken.  The code in SLE 11 and XCI
> appears to implement this.

I've just looked into code.

In Xen, hard interrupts are delivered to kernel not by hardware, but by Xen 
hypervisor through Xen event channels. At code level, that corresponds to 
(async) call to evtchn_do_upcall(). But that routine has explicit 
protection against double-entry on the same cpu, see the code for details. 

That means, do_IRQ can't be called on the same CPU before previous 
invocation returns. So multiple levels of "hard-interrupt contexts" just 
can't exist.

Then even 2 spinning-state structures per cpu should be enough. No need to 
have more.

And then my fix looks correct. It still leaves some overkill (3rd 
spinning-state), but it should reliably avoid the original crash.

Nikita

P.S.
Btw, server still works without crashes :)



-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to