Commit cb5b242c authored by Gavin Shan's avatar Gavin Shan Committed by Benjamin Herrenschmidt

powerpc/eeh: Escalate error on non-existing PE

Sometimes, especially in sinario of loading another kernel with kdump,
we got EEH error on non-existing PE. That means the PEEV / PEST in
the corresponding PHB would be messy and we can't handle that case.
The patch escalates the error to fenced PHB so that the PHB could be
rested in order to revoer the errors on non-existing PEs.
Reported-by: default avatarMahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: default avatarGavin Shan <shangw@linux.vnet.ibm.com>
Tested-by: default avatarMahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent 7e4e7867
...@@ -713,11 +713,7 @@ static int ioda_eeh_get_pe(struct pci_controller *hose, ...@@ -713,11 +713,7 @@ static int ioda_eeh_get_pe(struct pci_controller *hose,
dev.phb = hose; dev.phb = hose;
dev.pe_config_addr = pe_no; dev.pe_config_addr = pe_no;
dev_pe = eeh_pe_get(&dev); dev_pe = eeh_pe_get(&dev);
if (!dev_pe) { if (!dev_pe) return -EEXIST;
pr_warning("%s: Can't find PE for PHB#%x - PE#%x\n",
__func__, hose->global_number, pe_no);
return -EEXIST;
}
*pe = dev_pe; *pe = dev_pe;
return 0; return 0;
...@@ -831,12 +827,27 @@ static int ioda_eeh_next_error(struct eeh_pe **pe) ...@@ -831,12 +827,27 @@ static int ioda_eeh_next_error(struct eeh_pe **pe)
break; break;
case OPAL_EEH_PE_ERROR: case OPAL_EEH_PE_ERROR:
if (ioda_eeh_get_pe(hose, frozen_pe_no, pe)) /*
break; * If we can't find the corresponding PE, the
* PEEV / PEST would be messy. So we force an
* fenced PHB so that it can be recovered.
*/
if (ioda_eeh_get_pe(hose, frozen_pe_no, pe)) {
if (!ioda_eeh_get_phb_pe(hose, pe)) {
pr_err("EEH: Escalated fenced PHB#%x "
"detected for PE#%llx\n",
hose->global_number,
frozen_pe_no);
ret = EEH_NEXT_ERR_FENCED_PHB;
} else {
ret = EEH_NEXT_ERR_NONE;
}
} else {
pr_err("EEH: Frozen PE#%x on PHB#%x detected\n", pr_err("EEH: Frozen PE#%x on PHB#%x detected\n",
(*pe)->addr, (*pe)->phb->global_number); (*pe)->addr, (*pe)->phb->global_number);
ret = EEH_NEXT_ERR_FROZEN_PE; ret = EEH_NEXT_ERR_FROZEN_PE;
}
break; break;
default: default:
pr_warn("%s: Unexpected error type %d\n", pr_warn("%s: Unexpected error type %d\n",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment