Patch "powerpc/eeh: Fix stale cached primary bus" has been added to the 4.4-stable tree
This is a note to let you know that I've just added the patch titled
powerpc/eeh: Fix stale cached primary bus
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
powerpc-eeh-fix-stale-cached-primary-bus.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
05ba75f848647135f063199dc0e9f40fee769724Mon Sep 17 00:00:00 2001
From: Gavin Shan <[email protected]>
Date: Tue, 9 Feb 2016 15:50:21 +1100
Subject: powerpc/eeh: Fix stale cached primary bus
From: Gavin Shan <[email protected]>
commit 05ba75f848647135f063199dc0e9f40fee769724 upstream.
When PE is created, its primary bus is cached to pe->bus. At later point, the cached primary bus is returned from eeh_pe_bus_get(). However, we could get stale cached primary bus and run into kernel crash in one case: full hotplug as part of fenced PHB error recovery releases all PCI busses under the PHB at unplugging time and recreate them at plugging time. pe->bus is still dereferencing the PCI bus that was released.
This adds another PE flag (EEH_PE_PRI_BUS) to represent the validity of pe->bus. pe->bus is updated when its first child EEH device is online and the flag is set. Before unplugging in full hotplug for error recovery, the flag is cleared.
--- arch/powerpc/include/asm/eeh.h | 1 + arch/powerpc/kernel/eeh_driver.c | 3 +++ arch/powerpc/kernel/eeh_pe.c | 2 +- arch/powerpc/platforms/powernv/eeh-powernv.c | 5 ++++- 4 files changed, 9 insertions(+), 2 deletions(-)
arch/powerpc/include/asm/eeh.h +1 -0
@@ -81,6 +81,7 @@ struct pci_dn;#define EEH_PE_KEEP (1 << 8)/* Keep PE on hotplug */ #define EEH_PE_CFG_RESTRICTED (1 << 9)/* Block config on error */ #define EEH_PE_REMOVED (1 << 10)/* Removed permanently */ +#define EEH_PE_PRI_BUS (1 << 11)/* Cached primary bus */ struct eeh_pe {int type;/* PE type: PHB/Bus/Device */
arch/powerpc/kernel/eeh_driver.c +3 -0
@@ -564,6 +564,7 @@ static int eeh_reset_device(struct eeh_p*/ eeh_pe_state_mark (pe,EEH_PE_KEEP );if (bus) { +eeh_pe_state_clear (pe,EEH_PE_PRI_BUS );pci_lock_rescan_remove ();pcibios_remove_pci_devices (bus);pci_unlock_rescan_remove ();
@@ -803,6 +804,7 @@ perm_error:* the their PCI config any more. */ if (frozen_bus) { +eeh_pe_state_clear (pe,EEH_PE_PRI_BUS );eeh_pe_dev_mode_mark (pe,EEH_DEV_REMOVED );pci_lock_rescan_remove ();
@@ -886,6 +888,7 @@ static void eeh_handle_special_event(voicontinue ;/* Notify all devices to be down */ +eeh_pe_state_clear (pe,EEH_PE_PRI_BUS ); bus =eeh_pe_bus_get (phb_pe);eeh_pe_dev_traverse (pe, eeh_report_failure,NULL );
arch/powerpc/kernel/eeh_pe.c +1 -1
@@ -928,7 +928,7 @@ struct pci_bus *eeh_pe_bus_get(struct ee bus = pe->phb->bus; }else if (pe->type &EEH_PE_BUS || pe->type &EEH_PE_DEVICE ) { -if (pe->bus) { +if (pe->state &EEH_PE_PRI_BUS ) { bus = pe->bus; goto out; }
arch/powerpc/platforms/powernv/eeh-powernv.c +4 -1
@@ -444,9 +444,12 @@ static void *pnv_eeh_probe(struct pci_dn* PCI devices of the PE are expected to be removed prior * to PE reset. */ -if (!edev->pe->bus) +if (!(edev->pe->state &EEH_PE_PRI_BUS )) { edev->pe->bus =pci_find_bus (hose->global_number, pdn->busno); +if (edev->pe->bus) + edev->pe->state |=EEH_PE_PRI_BUS ; + }/* * Enable EEH explicitly so that we will do EEH check
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/powerpc-eeh-fix-pe-location-code.patch queue-4.4/powerpc-eeh-fix-stale-cached-primary-bus.patch queue-4.4/powerpc-powernv-fix-stale-pe-primary-bus.patch