diff options
author | Denis V. Lunev <den@openvz.org> | 2007-08-07 05:13:18 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-10-12 18:03:15 -0400 |
commit | 3d034aecd8b70d34388a4e40ca50af0d014223e1 (patch) | |
tree | 952a767bbd21fa9ed208619b31e5c5ff46ab4430 /arch/x86/kernel | |
parent | aa24886e379d2b641c5117e178b15ce1d5d366ba (diff) |
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')
-rw-r--r-- | arch/x86/kernel/reboot_fixups_32.c | 6 |
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 @@ | |||
11 | 11 | ||
12 | #include <asm/delay.h> | 12 | #include <asm/delay.h> |
13 | #include <linux/pci.h> | 13 | #include <linux/pci.h> |
14 | #include <linux/interrupt.h> | ||
14 | #include <asm/reboot_fixups.h> | 15 | #include <asm/reboot_fixups.h> |
15 | #include <asm/msr.h> | 16 | #include <asm/msr.h> |
16 | 17 | ||
@@ -56,6 +57,11 @@ void mach_reboot_fixups(void) | |||
56 | struct pci_dev *dev; | 57 | struct pci_dev *dev; |
57 | int i; | 58 | int i; |
58 | 59 | ||
60 | /* we can be called from sysrq-B code. In such a case it is | ||
61 | * prohibited to dig PCI */ | ||
62 | if (in_interrupt()) | ||
63 | return; | ||
64 | |||
59 | for (i=0; i < ARRAY_SIZE(fixups_table); i++) { | 65 | for (i=0; i < ARRAY_SIZE(fixups_table); i++) { |
60 | cur = &(fixups_table[i]); | 66 | cur = &(fixups_table[i]); |
61 | dev = pci_get_device(cur->vendor, cur->device, NULL); | 67 | dev = pci_get_device(cur->vendor, cur->device, NULL); |