linux/arch/powerpc/platforms
Gavin Shan 1e38b71401 powerpc/eeh: Fix crash on converting OF node to edev
The kernel crash was reported by Alexy. He was testing some feature
with private kernel, in which Alexy added some code in pci_pm_reset()
to read the CSR after writting it. The bug could be reproduced on
Fiber Channel card (Fibre Channel: Emulex Corporation Saturn-X:
LightPulse Fibre Channel Host Adapter (rev 03)) by the following
commands.

	# echo 1 > /sys/devices/pci0004:01/0004:01:00.0/reset
	# rmmod lpfc
	# modprobe lpfc

The history behind the test case is that those additional config
space reading operations in pci_pm_reset() would cause EEH error,
but we didn't detect EEH error until "modprobe lpfc". For the case,
all the PCI devices on PCI bus (0004:01) were removed and added after
PE reset. Then the EEH devices would be figured out again based on
the OF nodes. Unfortunately, there were some child OF nodes under
PCI device (0004:01:00.0), but they didn't have attached PCI_DN since
they're invisible from PCI domain. However, we were still trying to
convert OF node to EEH device without checking on the attached PCI_DN.
Eventually, it caused the kernel crash as follows:

Unable to handle kernel paging request for data at address 0x00000030
Faulting instruction address: 0xc00000000004d888
cpu 0x0: Vector: 300 (Data Access) at [c000000fc797b950]
    pc: c00000000004d888: .eeh_add_device_tree_early+0x78/0x140
    lr: c00000000004d880: .eeh_add_device_tree_early+0x70/0x140
    sp: c000000fc797bbd0
   msr: 8000000000009032
   dar: 30
 dsisr: 40000000
  current = 0xc000000fc78d9f70
  paca    = 0xc00000000edb0000   softe: 0        irq_happened: 0x00
    pid   = 2951, comm = eehd
enter ? for help
[c000000fc797bc50] c00000000004d848 .eeh_add_device_tree_early+0x38/0x140
[c000000fc797bcd0] c00000000004d848 .eeh_add_device_tree_early+0x38/0x140
[c000000fc797bd50] c000000000051b54 .pcibios_add_pci_devices+0x34/0x190
[c000000fc797bde0] c00000000004fb10 .eeh_reset_device+0x100/0x160
[c000000fc797be70] c0000000000502dc .eeh_handle_event+0x19c/0x300
[c000000fc797bf00] c000000000050570 .eeh_event_handler+0x130/0x1a0
[c000000fc797bf90] c000000000020138 .kernel_thread+0x54/0x70

The patch changes of_node_to_eeh_dev() and just returns NULL if the
passed OF node doesn't have attached PCI_DN.

Cc: stable@vger.kernel.org
Reported-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: Gavin Shan <shangw@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
2012-09-18 15:32:51 +10:00
..
8xx Disintegrate asm/system.h for PowerPC 2012-03-28 18:30:02 +01:00
40x Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2012-01-08 13:21:22 -08:00
44x powerpc: Fix assmption of end_of_DRAM() returns end address 2012-07-03 14:14:49 +10:00
52xx powerpc: Mark const init data with __initconst instead of __initdata 2012-04-02 14:00:03 +10:00
82xx powerpc/82xx: add SPI support for mgcoge 2012-07-10 07:07:20 -05:00
83xx powerpc/83xx: fix RGMII AC values workaround for km83xx 2012-07-10 07:07:20 -05:00
85xx Merge remote-tracking branch 'kumar/merge' into merge 2012-07-31 15:18:31 +10:00
86xx PCI changes for the 3.6 merge window: 2012-07-24 16:17:07 -07:00
512x irq_domain/powerpc: constify irq_domain_ops 2012-02-16 06:11:24 -07:00
amigaone pcspkr: Cleanup Kconfig dependencies 2011-06-09 15:01:41 +02:00
cell powerpc/mm: Convert virtual address to vpn 2012-09-17 16:31:49 +10:00
chrp powerpc/mpic: Remove duplicate MPIC_WANTS_RESET flag 2012-02-23 10:50:00 +11:00
embedded6xx Disintegrate asm/system.h for PowerPC 2012-03-28 18:30:02 +01:00
maple Disintegrate and delete asm/system.h 2012-03-28 15:58:21 -07:00
pasemi powerpc: Remove all includes of <asm/abs_addr.h> 2012-09-05 15:19:33 +10:00
powermac Merge branch 'merge' into next 2012-05-09 10:57:57 +10:00
powernv powerpc/powernv: Remove unused functions 2012-09-17 16:35:16 +10:00
prep powerpc: drop unused Kconfig symbols 2011-10-31 23:39:52 +01:00
ps3 powerpc/mm: Convert virtual address to vpn 2012-09-17 16:31:49 +10:00
pseries powerpc/eeh: Fix crash on converting OF node to edev 2012-09-18 15:32:51 +10:00
wsp Disintegrate and delete asm/system.h 2012-03-28 15:58:21 -07:00
fsl_uli1575.c Disintegrate asm/system.h for PowerPC 2012-03-28 18:30:02 +01:00
Kconfig KVM: PPC: Factor out guest epapr initialization 2012-05-30 11:43:10 +02:00
Kconfig.cputype powerpc/e500: add paravirt QEMU platform 2012-07-11 07:49:36 -05:00
Makefile powerpc: Remove the main legacy iSerie platform code 2012-03-09 10:35:11 +11:00