pci_get_device call from interrupt in reboot fixups
PATCH 1/1 pci_get_device call from interrupt in reboot fixups
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.
---
arch/i386/kernel/reboot_fixups.c renamed from arch/i386/kernel/reboot_fixups.c.fixup2 +6 -0
@@ -11,6 +11,7 @@#include <asm/delay.h> #include <linux/pci.h> #include <linux/reboot_fixups.h> +#include <linux/interrupt.h> static void cs5530a_warm_reset (struct pci_dev *dev) {
@@ -43,6 +44,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 );