PCI: pci_get_device call from interrupt in reboot fixups
authorDenis V. Lunev <den@openvz.org>
Tue, 7 Aug 2007 09:13:18 +0000 (13:13 +0400)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 12 Oct 2007 22:03:15 +0000 (15:03 -0700)
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 <den@openvz.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
arch/x86/kernel/reboot_fixups_32.c

index 03e1cce..139eb03 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <asm/delay.h>
 #include <linux/pci.h>
+#include <linux/interrupt.h>
 #include <asm/reboot_fixups.h>
 #include <asm/msr.h>
 
@@ -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);