Skip to content

Commit

Permalink
[PATCH] powerpc: Disable and EOI interrupts in machine_crash_shutdown()
Browse files Browse the repository at this point in the history
We've seen several bugs caused by interrupt weirdness in the kdump kernel.
Panicking from an interrupt handler means we fail to EOI the interrupt, and
so the second kernel never gets that interrupt ever again. We also see hangs
on JS20 where we take interrupts in the second kernel early during boot.

This patch fixes both those problems, and although it adds more code to the
crash path I think it is the best solution.

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Paul Mackerras <paulus@samba.org>
  • Loading branch information
Michael Ellerman authored and Paul Mackerras committed Apr 22, 2006
1 parent 4d6c588 commit d6c1a90
Showing 1 changed file with 13 additions and 0 deletions.
13 changes: 13 additions & 0 deletions arch/powerpc/kernel/crash.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include <linux/elf.h>
#include <linux/elfcore.h>
#include <linux/init.h>
#include <linux/irq.h>
#include <linux/types.h>

#include <asm/processor.h>
Expand Down Expand Up @@ -174,6 +175,8 @@ static void crash_kexec_prepare_cpus(void)

void default_machine_crash_shutdown(struct pt_regs *regs)
{
unsigned int irq;

/*
* This function is only called after the system
* has paniced or is otherwise in a critical state.
Expand All @@ -186,6 +189,16 @@ void default_machine_crash_shutdown(struct pt_regs *regs)
*/
local_irq_disable();

for_each_irq(irq) {
struct irq_desc *desc = irq_descp(irq);

if (desc->status & IRQ_INPROGRESS)
desc->handler->end(irq);

if (!(desc->status & IRQ_DISABLED))
desc->handler->disable(irq);
}

if (ppc_md.kexec_cpu_down)
ppc_md.kexec_cpu_down(1, 0);

Expand Down

0 comments on commit d6c1a90

Please sign in to comment.