The conditions that one specific PE's frozen count exceeds the maximal
allowed times (EEH_MAX_ALLOWED_FREEZES) and it's in isolated or recovery
state indicate the PE was removed permanently implicitly. The patch
introduces flag EEH_PE_REMOVED to indicate that explicitly so that we
don't depend on the fixed maximal allowed times, which can be varied as
we do in subsequent patch.

Flag EEH_PE_REMOVED is expected to be marked for the PE whose frozen
count exceeds the maximal allowed times, or just failed from recovery.

Requested-by: Ryan Grimm <[email protected]>
Signed-off-by: Gavin Shan <[email protected]>
---
 arch/powerpc/include/asm/eeh.h   | 1 +
 arch/powerpc/kernel/eeh_driver.c | 2 +-
 arch/powerpc/kernel/eeh_pe.c     | 6 ++----
 3 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/arch/powerpc/include/asm/eeh.h b/arch/powerpc/include/asm/eeh.h
index 9c11d1e..3e4dd34 100644
--- a/arch/powerpc/include/asm/eeh.h
+++ b/arch/powerpc/include/asm/eeh.h
@@ -78,6 +78,7 @@ struct device_node;
 
 #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  */
 
 struct eeh_pe {
        int type;                       /* PE type: PHB/Bus/Device      */
diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c
index b17e793..ac00672 100644
--- a/arch/powerpc/kernel/eeh_driver.c
+++ b/arch/powerpc/kernel/eeh_driver.c
@@ -806,7 +806,7 @@ perm_error:
        eeh_pe_dev_traverse(pe, eeh_report_failure, NULL);
 
        /* Mark the PE to be removed permanently */
-       pe->freeze_count = EEH_MAX_ALLOWED_FREEZES + 1;
+       eeh_pe_state_mark(pe, EEH_PE_REMOVED);
 
        /*
         * Shut down the device drivers for good. We mark
diff --git a/arch/powerpc/kernel/eeh_pe.c b/arch/powerpc/kernel/eeh_pe.c
index fa950fb..1e4946c 100644
--- a/arch/powerpc/kernel/eeh_pe.c
+++ b/arch/powerpc/kernel/eeh_pe.c
@@ -526,8 +526,7 @@ static void *__eeh_pe_state_mark(void *data, void *flag)
        struct pci_dev *pdev;
 
        /* Keep the state of permanently removed PE intact */
-       if ((pe->freeze_count > EEH_MAX_ALLOWED_FREEZES) &&
-           (state & (EEH_PE_ISOLATED | EEH_PE_RECOVERING)))
+       if (pe->state & EEH_PE_REMOVED)
                return NULL;
 
        pe->state |= state;
@@ -600,8 +599,7 @@ static void *__eeh_pe_state_clear(void *data, void *flag)
        struct pci_dev *pdev;
 
        /* Keep the state of permanently removed PE intact */
-       if ((pe->freeze_count > EEH_MAX_ALLOWED_FREEZES) &&
-           (state & EEH_PE_ISOLATED))
+       if (pe->state & EEH_PE_REMOVED)
                return NULL;
 
        pe->state &= ~state;
-- 
1.8.3.2

_______________________________________________
Linuxppc-dev mailing list
[email protected]
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to