powerpc/eeh: Introduce flag EEH_PE_REMOVED
authorGavin Shan <gwshan@linux.vnet.ibm.com>
Thu, 11 Dec 2014 03:28:55 +0000 (14:28 +1100)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 23 Jan 2015 03:02:53 +0000 (14:02 +1100)
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 <grimm@linux.vnet.ibm.com>
Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/include/asm/eeh.h
arch/powerpc/kernel/eeh_driver.c
arch/powerpc/kernel/eeh_pe.c

index 9c11d1ed6a368f64ae0a2eb62da7b94ee6ff357e..3e4dd34f2bd2fcd52569a84f8e07cb2a9cf9658f 100644 (file)
@@ -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      */
index b17e793ba67ed668bb271d269823e8e88c9e000e..ac00672af7d1999a1d1537bfa2f3729bb69216ef 100644 (file)
@@ -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
index fa950fbc2d970b5670f49a0996d280ce95b1ba72..1e4946c36f9ecf62e775064607f11fbda5c7bae2 100644 (file)
@@ -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;