alpha: irq: run all handlers with interrupts disabled
Linux has expected that interrupt handlers are executed with local interrupts disabled for a while now, so ensure that this is the case on Alpha even for non-device interrupts such as IPIs. Without this patch, secondary boot results in the following backtrace: warning: at kernel/softirq.c:139 __local_bh_enable+0xb8/0xd0() trace: __local_bh_enable+0xb8/0xd0 irq_enter+0x74/0xa0 scheduler_ipi+0x50/0x100 handle_ipi+0x84/0x260 do_entint+0x1ac/0x2e0 irq_exit+0x60/0xa0 handle_irq+0x98/0x100 do_entint+0x2c8/0x2e0 ret_from_sys_call+0x0/0x10 load_balance+0x3e4/0x870 cpu_idle+0x24/0x80 rcu_eqs_enter_common.isra.38+0x0/0x120 cpu_idle+0x40/0x80 rest_init+0xc0/0xe0 _stext+0x1c/0x20 A similar dump occurs if you try to reboot using magic-sysrq. Cc: Richard Henderson <rth@twiddle.net> Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru> Cc: Matt Turner <mattst88@gmail.com> Reviewed-by: Matt Turner <mattst88@gmail.com> Signed-off-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Michael Cree <mcree@orcon.net.nz> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
cd8d233175
commit
e20800fd5c
|
@ -117,13 +117,6 @@ handle_irq(int irq)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* From here we must proceed with IPL_MAX. Note that we do not
|
|
||||||
* explicitly enable interrupts afterwards - some MILO PALcode
|
|
||||||
* (namely LX164 one) seems to have severe problems with RTI
|
|
||||||
* at IPL 0.
|
|
||||||
*/
|
|
||||||
local_irq_disable();
|
|
||||||
irq_enter();
|
irq_enter();
|
||||||
generic_handle_irq_desc(irq, desc);
|
generic_handle_irq_desc(irq, desc);
|
||||||
irq_exit();
|
irq_exit();
|
||||||
|
|
|
@ -45,6 +45,14 @@ do_entInt(unsigned long type, unsigned long vector,
|
||||||
unsigned long la_ptr, struct pt_regs *regs)
|
unsigned long la_ptr, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct pt_regs *old_regs;
|
struct pt_regs *old_regs;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Disable interrupts during IRQ handling.
|
||||||
|
* Note that there is no matching local_irq_enable() due to
|
||||||
|
* severe problems with RTI at IPL0 and some MILO PALcode
|
||||||
|
* (namely LX164).
|
||||||
|
*/
|
||||||
|
local_irq_disable();
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 0:
|
case 0:
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
|
@ -62,7 +70,6 @@ do_entInt(unsigned long type, unsigned long vector,
|
||||||
{
|
{
|
||||||
long cpu;
|
long cpu;
|
||||||
|
|
||||||
local_irq_disable();
|
|
||||||
smp_percpu_timer_interrupt(regs);
|
smp_percpu_timer_interrupt(regs);
|
||||||
cpu = smp_processor_id();
|
cpu = smp_processor_id();
|
||||||
if (cpu != boot_cpuid) {
|
if (cpu != boot_cpuid) {
|
||||||
|
|
Loading…
Reference in New Issue