summary refs log tree commit diff
path: root/arch/x86/kernel/reboot_fixups_32.c
diff options
context:
space:
mode:
authorDenis V. Lunev <den@openvz.org>2007-08-07 13:13:18 +0400
committerGreg Kroah-Hartman <gregkh@suse.de>2007-10-12 15:03:15 -0700
commit3d034aecd8b70d34388a4e40ca50af0d014223e1 (patch)
tree952a767bbd21fa9ed208619b31e5c5ff46ab4430 /arch/x86/kernel/reboot_fixups_32.c
parentaa24886e379d2b641c5117e178b15ce1d5d366ba (diff)
downloadlinux-3d034aecd8b70d34388a4e40ca50af0d014223e1.tar.gz
PCI: 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.

Signed-off-by: Denis V. Lunev <den@openvz.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

Diffstat (limited to 'arch/x86/kernel/reboot_fixups_32.c')
-rw-r--r--arch/x86/kernel/reboot_fixups_32.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/arch/x86/kernel/reboot_fixups_32.c b/arch/x86/kernel/reboot_fixups_32.c
index 03e1cce58f49..139eb03490f5 100644
--- a/arch/x86/kernel/reboot_fixups_32.c
+++ b/arch/x86/kernel/reboot_fixups_32.c
@@ -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);