Messages in this thread | | | Date | Thu, 5 Sep 2013 15:29:15 +0200 | From | Frederic Weisbecker <> | Subject | Re: do_softirq() vs __do_softirq() in irq_exit() and stack overflow |
| |
On Thu, Sep 05, 2013 at 07:39:56AM +1000, Benjamin Herrenschmidt wrote: > Hi Folks ! > > It appears that the current version of irq_exit() calls __do_softirq() > directly rather than do_softirq(). > > That means we are going to call the softirq's in the current interrupt > frame rather than on the separate softirq stack. > > The current frame is also still the normal kernel stack, because > do_IRQ() itself only switches to the interrupt stack for processing > the handlers (it's back to the original stack by the time it calls > irq_exit). > > That means that we end up stacking the normal stack, the actually HW > interrupt stack frame (which can be pretty big on ppc) + do_IRQ's own, > then the softirq (networks stack can create HUGE stack frames) and ... > we are in softirq, so HW irqs are enable, we can thus can another irq > stack frame piled up on top of that (or a perf stack). > > We are observing actual overflows, here's an example blowing up our 16k > stack on ppc64, you notice that it's all on the normal kernel stack:
I see, __do_softirq() is sometimes called to avoid irqsafe and softirq_pending check they are not necessary but OTOH this bypass the arch overriden handler.
I'm going to try something and post soon.
Thanks.
| |