Messages in this thread | | | Date | Fri, 22 Feb 2013 13:08:17 -0800 | Subject | Re: [PATCH 2/2] irq: Cleanup context state transitions in irq_exit() | From | Linus Torvalds <> |
| |
On Fri, Feb 22, 2013 at 7:06 AM, Thomas Gleixner <tglx@linutronix.de> wrote: >> >> I prefer to let you guys have the final word on this patch. Whether you >> apply it or not, I fear I'll never be entirely happy either way :) >> That's the sad fate of dealing with circular dependencies... > > plus the butt ugly softirq semantics or the lack thereof ...
The softirq semantics are perfectly fine. Don't blame softirq for the fact that irq_exit() has had shit-for-brains for a long time.
Just move the whole "invoke_softirq()" thing down to *after* the tick_nohz_irq_exit() stuff. And that "wakeup_softirqd()" is garbage too, since the whole thing should only be used for the "force_irqthreads" case (which invoke_softirq()" got right.
And get rid of that final
#ifndef __ARCH_IRQ_EXIT_IRQS_DISABLED local_irq_restore(flags); #endif
because even if the architecture enters irq_exit() with interrupts enabled, we should damn well exit with them disabled so that there are no races with new recursive interrupts (other than the ones that wakeup_softirqd already handled).
In other words, I think all those special cases are indeed indicative of something being wrong, but that "something" is not the softirq code. Don't blame that. Blame the fact that irq_exit() is simply written wrong. The softirq code should be done last (it used to be done from the asm code), and the whole comment about tick_nohz_irq_exit() perhaps changing something looks like pure and utter garbage.
Don't blame the wrong code here.
Linus
| |