From: "Denis V. Lunev" The following calltrace is possible now: handle_sysrq machine_emergency_restart mach_reboot_fixups pci_get_device pci_get_subsys down_read The patch skips reboot fixup if called from sysrq-B code. Signed-off-by: Denis V. Lunev Cc: Andi Kleen Cc: Greg KH Signed-off-by: Andrew Morton --- arch/i386/kernel/reboot_fixups.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletion(-) diff -puN arch/i386/kernel/reboot_fixups.c~i386-pci_get_device-called-from-interrupt-in-reboot-fixups arch/i386/kernel/reboot_fixups.c --- a/arch/i386/kernel/reboot_fixups.c~i386-pci_get_device-called-from-interrupt-in-reboot-fixups +++ a/arch/i386/kernel/reboot_fixups.c @@ -11,6 +11,7 @@ #include #include +#include #include #include @@ -56,6 +57,11 @@ void mach_reboot_fixups(void) struct pci_dev *dev; int i; + /* we can be called from sysrq-B code. In such a case it is + * prohibited to dig PCI */ + if (in_interrupt()) + return; + for (i=0; i < ARRAY_SIZE(fixups_table); i++) { cur = &(fixups_table[i]); dev = pci_get_device(cur->vendor, cur->device, NULL); @@ -65,4 +71,3 @@ void mach_reboot_fixups(void) cur->reboot_fixup(dev); } } - _