On 06/12/2018 07:17 PM, Michael Ellerman wrote:
Mahesh J Salgaonkar <mah...@linux.vnet.ibm.com> writes:
diff --git a/arch/powerpc/platforms/pseries/ras.c
b/arch/powerpc/platforms/pseries/ras.c
index 2edc673be137..e56759d92356 100644
--- a/arch/powerpc/platforms/pseries/ras.c
+++ b/arch/powerpc/platforms/pseries/ras.c
@@ -422,6 +422,31 @@ int pSeries_system_reset_exception(struct pt_regs *regs)
return 0; /* need to perform reset */
}
+static int mce_handle_error(struct rtas_error_log *errp)
+{
+ struct pseries_errorlog *pseries_log;
+ struct pseries_mc_errorlog *mce_log;
+ int disposition = rtas_error_disposition(errp);
+ uint8_t error_type;
+
+ pseries_log = get_pseries_errorlog(errp, PSERIES_ELOG_SECT_ID_MCE);
+ if (pseries_log == NULL)
+ goto out;
+
+ mce_log = (struct pseries_mc_errorlog *)pseries_log->data;
+ error_type = rtas_mc_error_type(mce_log);
+
+ if ((disposition == RTAS_DISP_NOT_RECOVERED) &&
+ (error_type == PSERIES_MC_ERROR_TYPE_SLB)) {
+ slb_dump_contents();
+ slb_flush_and_rebolt();
Aren't we back in virtual mode here?
Don't we need to do the flush in real mode before turning the MMU back
on. Otherwise we'll just take another multi-hit?
slb_flush_and_rebolt does slbia, which keeps slb index 0. So kernel code
should not get another slb miss. We also make sure we don't touch stack
in slb_flush_and_rebolt(). So we flush everything and put vmalloc and
stack back. That should be ok with MMU on?
-aneesh