]> git.baikalelectronics.ru Git - kernel.git/commit
Revert "parisc: Re-enable interrupts early"
authorJohn David Anglin <dave.anglin@bell.net>
Tue, 14 Nov 2017 00:35:33 +0000 (19:35 -0500)
committerHelge Deller <deller@gmx.de>
Sun, 17 Dec 2017 20:06:25 +0000 (21:06 +0100)
commit880d6088445ee14fbcf2f3f1126789468fea2954
tree4465193071484ab6ca37f447812f5b488a084309
parent2c7dc9df6476eb0b845e153a4e21c265f0ce4c3f
Revert "parisc: Re-enable interrupts early"

This reverts commit 97c6de49a991d4e0f412fd3e8c1ffe42a6c8fb3b.

Interrupts can't be enabled early because the register saves are done on
the thread stack prior to switching to the IRQ stack.  This caused stack
overflows and the thread stack needed increasing to 32k.  Even then,
stack overflows still occasionally occurred.

Background:
Even with a 32 kB thread stack, I have seen instances where the thread
stack overflowed on the mx3210 buildd.  Detection of stack overflow only
occurs when we have an external interrupt.  When an external interrupt
occurs, we switch to the thread stack if we are not already on a kernel
stack.  Then, registers and specials are saved to the kernel stack.

The bug occurs in intr_return where interrupts are reenabled prior to
returning from the interrupt.  This was done incase we need to schedule
or deliver signals.  However, it introduces the possibility that
multiple external interrupts may occur on the thread stack and cause a
stack overflow.  These might not be detected and cause the kernel to
misbehave in random ways.

This patch changes the code back to only reenable interrupts when we are
going to schedule or deliver signals.  As a result, we generally return
from an interrupt before reenabling interrupts.  This minimizes the
growth of the thread stack.

Fixes: 97c6de49a991 ("parisc: Re-enable interrupts early")
Signed-off-by: John David Anglin <dave.anglin@bell.net>
Cc: <stable@vger.kernel.org> # v4.10+
Signed-off-by: Helge Deller <deller@gmx.de>
arch/parisc/kernel/entry.S