Excerpts from Ganesh Goudar's message of November 24, 2021 7:55 pm: > Now that we are no longer switching on the mmu in realmode > mce handler, Revert the commit 4ff753feab02("powerpc/pseries: > Avoid using addr_to_pfn in real mode") partially, which > introduced functions mce_handle_err_virtmode/realmode() to > separate mce handler code which needed translation to enabled. > > Signed-off-by: Ganesh Goudar <ganes...@linux.ibm.com> > --- > arch/powerpc/platforms/pseries/ras.c | 122 +++++++++++---------------- > 1 file changed, 49 insertions(+), 73 deletions(-) > > diff --git a/arch/powerpc/platforms/pseries/ras.c > b/arch/powerpc/platforms/pseries/ras.c > index 8613f9cc5798..62e1519b8355 100644 > --- a/arch/powerpc/platforms/pseries/ras.c > +++ b/arch/powerpc/platforms/pseries/ras.c > @@ -511,58 +511,17 @@ int pSeries_system_reset_exception(struct pt_regs *regs) > return 0; /* need to perform reset */ > } > > -static int mce_handle_err_realmode(int disposition, u8 error_type) > -{ > -#ifdef CONFIG_PPC_BOOK3S_64 > - if (disposition == RTAS_DISP_NOT_RECOVERED) { > - switch (error_type) { > - case MC_ERROR_TYPE_ERAT: > - flush_erat(); > - disposition = RTAS_DISP_FULLY_RECOVERED; > - break; > - case MC_ERROR_TYPE_SLB: > - /* > - * Store the old slb content in paca before flushing. > - * Print this when we go to virtual mode. > - * There are chances that we may hit MCE again if there > - * is a parity error on the SLB entry we trying to read > - * for saving. Hence limit the slb saving to single > - * level of recursion. > - */ > - if (local_paca->in_mce == 1) > - slb_save_contents(local_paca->mce_faulty_slbs); > - flush_and_reload_slb(); > - disposition = RTAS_DISP_FULLY_RECOVERED; > - break; > - default: > - break; > - } > - } else if (disposition == RTAS_DISP_LIMITED_RECOVERY) { > - /* Platform corrected itself but could be degraded */ > - pr_err("MCE: limited recovery, system may be degraded\n"); > - disposition = RTAS_DISP_FULLY_RECOVERED; > - } > -#endif > - return disposition; > -} > - > -static int mce_handle_err_virtmode(struct pt_regs *regs, > - struct rtas_error_log *errp, > - struct pseries_mc_errorlog *mce_log, > - int disposition) > +static int mce_handle_error(struct pt_regs *regs, struct rtas_error_log > *errp) > { > struct mce_error_info mce_err = { 0 }; > + unsigned long eaddr = 0, paddr = 0; > + struct pseries_errorlog *pseries_log; > + struct pseries_mc_errorlog *mce_log; > + int disposition = rtas_error_disposition(errp); > int initiator = rtas_error_initiator(errp); > int severity = rtas_error_severity(errp); > - unsigned long eaddr = 0, paddr = 0; > u8 error_type, err_sub_type; > > - if (!mce_log) > - goto out; > - > - error_type = mce_log->error_type; > - err_sub_type = rtas_mc_error_sub_type(mce_log); > - > if (initiator == RTAS_INITIATOR_UNKNOWN) > mce_err.initiator = MCE_INITIATOR_UNKNOWN; > else if (initiator == RTAS_INITIATOR_CPU) > @@ -588,6 +547,8 @@ static int mce_handle_err_virtmode(struct pt_regs *regs, > mce_err.severity = MCE_SEV_SEVERE; > else if (severity == RTAS_SEVERITY_ERROR) > mce_err.severity = MCE_SEV_SEVERE; > + else if (severity == RTAS_SEVERITY_FATAL) > + mce_err.severity = MCE_SEV_FATAL; > else > mce_err.severity = MCE_SEV_FATAL; >
What's this hunk for? > @@ -599,7 +560,18 @@ static int mce_handle_err_virtmode(struct pt_regs *regs, > mce_err.error_type = MCE_ERROR_TYPE_UNKNOWN; > mce_err.error_class = MCE_ECLASS_UNKNOWN; > > - switch (error_type) { > + if (!rtas_error_extended(errp)) > + goto out; > + > + pseries_log = get_pseries_errorlog(errp, PSERIES_ELOG_SECT_ID_MCE); > + if (!pseries_log) > + goto out; > + > + mce_log = (struct pseries_mc_errorlog *)pseries_log->data; > + error_type = mce_log->error_type; > + err_sub_type = rtas_mc_error_sub_type(mce_log); > + > + switch (mce_log->error_type) { > case MC_ERROR_TYPE_UE: > mce_err.error_type = MCE_ERROR_TYPE_UE; > mce_common_process_ue(regs, &mce_err); > @@ -692,41 +664,45 @@ static int mce_handle_err_virtmode(struct pt_regs *regs, > mce_err.error_type = MCE_ERROR_TYPE_DCACHE; > break; > case MC_ERROR_TYPE_I_CACHE: > - mce_err.error_type = MCE_ERROR_TYPE_ICACHE; > + mce_err.error_type = MCE_ERROR_TYPE_DCACHE; > break; And this one. Doesn't look right. > case MC_ERROR_TYPE_UNKNOWN: > default: > mce_err.error_type = MCE_ERROR_TYPE_UNKNOWN; > break; > } > + > +#ifdef CONFIG_PPC_BOOK3S_64 > + if (disposition == RTAS_DISP_NOT_RECOVERED) { > + switch (error_type) { > + case MC_ERROR_TYPE_SLB: > + case MC_ERROR_TYPE_ERAT: > + /* > + * Store the old slb content in paca before flushing. > + * Print this when we go to virtual mode. > + * There are chances that we may hit MCE again if there > + * is a parity error on the SLB entry we trying to read > + * for saving. Hence limit the slb saving to single > + * level of recursion. > + */ > + if (local_paca->in_mce == 1) > + slb_save_contents(local_paca->mce_faulty_slbs); > + flush_and_reload_slb(); > + disposition = RTAS_DISP_FULLY_RECOVERED; > + break; > + default: > + break; > + } > + } else if (disposition == RTAS_DISP_LIMITED_RECOVERY) { > + /* Platform corrected itself but could be degraded */ > + pr_err("MCE: limited recovery, system may be degraded\n"); > + disposition = RTAS_DISP_FULLY_RECOVERED; > + } I would prefer if you just keep the mce_handle_err_realmode function (can rename it if you want). It's actually changed a bit since the patch being reverted so we don't want to undo that. Thanks, Nick