* [PATCH v3 1/2] powerpc/mce: Avoid using irq_work_queue() in realmode
@ 2021-11-24 9:54 Ganesh Goudar
2021-11-24 9:55 ` [PATCH v3 2/2] pseries/mce: Refactor the pseries mce handling code Ganesh Goudar
2021-11-24 13:03 ` [PATCH v3 1/2] powerpc/mce: Avoid using irq_work_queue() in realmode Nicholas Piggin
0 siblings, 2 replies; 7+ messages in thread
From: Ganesh Goudar @ 2021-11-24 9:54 UTC (permalink / raw)
To: linuxppc-dev, mpe; +Cc: Ganesh Goudar, mahesh, npiggin, dja
In realmode mce handler we use irq_work_queue() to defer
the processing of mce events, irq_work_queue() can only
be called when translation is enabled because it touches
memory outside RMA, hence we enable translation before
calling irq_work_queue and disable on return, though it
is not safe to do in realmode.
To avoid this, program the decrementer and call the event
processing functions from timer handler.
Signed-off-by: Ganesh Goudar <ganeshgr@linux.ibm.com>
---
V2:
* Use arch_irq_work_raise to raise decrementer interrupt.
* Avoid having atomic variable.
V3:
* Fix build error.
Reported by kernel test bot.
---
arch/powerpc/include/asm/machdep.h | 2 +
arch/powerpc/include/asm/mce.h | 2 +
arch/powerpc/include/asm/paca.h | 1 +
arch/powerpc/kernel/mce.c | 51 +++++++++++-------------
arch/powerpc/kernel/time.c | 3 ++
arch/powerpc/platforms/pseries/pseries.h | 1 +
arch/powerpc/platforms/pseries/ras.c | 31 +-------------
arch/powerpc/platforms/pseries/setup.c | 1 +
8 files changed, 34 insertions(+), 58 deletions(-)
diff --git a/arch/powerpc/include/asm/machdep.h b/arch/powerpc/include/asm/machdep.h
index 9c3c9f04129f..d22b222ba471 100644
--- a/arch/powerpc/include/asm/machdep.h
+++ b/arch/powerpc/include/asm/machdep.h
@@ -99,6 +99,8 @@ struct machdep_calls {
/* Called during machine check exception to retrive fixup address. */
bool (*mce_check_early_recovery)(struct pt_regs *regs);
+ void (*machine_check_log_err)(void);
+
/* Motherboard/chipset features. This is a kind of general purpose
* hook used to control some machine specific features (like reset
* lines, chip power control, etc...).
diff --git a/arch/powerpc/include/asm/mce.h b/arch/powerpc/include/asm/mce.h
index 331d944280b8..6e306aaf58aa 100644
--- a/arch/powerpc/include/asm/mce.h
+++ b/arch/powerpc/include/asm/mce.h
@@ -235,8 +235,10 @@ extern void machine_check_print_event_info(struct machine_check_event *evt,
unsigned long addr_to_pfn(struct pt_regs *regs, unsigned long addr);
extern void mce_common_process_ue(struct pt_regs *regs,
struct mce_error_info *mce_err);
+void machine_check_raise_dec_intr(void);
int mce_register_notifier(struct notifier_block *nb);
int mce_unregister_notifier(struct notifier_block *nb);
+void mce_run_late_handlers(void);
#ifdef CONFIG_PPC_BOOK3S_64
void flush_and_reload_slb(void);
void flush_erat(void);
diff --git a/arch/powerpc/include/asm/paca.h b/arch/powerpc/include/asm/paca.h
index dc05a862e72a..d463c796f7fa 100644
--- a/arch/powerpc/include/asm/paca.h
+++ b/arch/powerpc/include/asm/paca.h
@@ -280,6 +280,7 @@ struct paca_struct {
#endif
#ifdef CONFIG_PPC_BOOK3S_64
struct mce_info *mce_info;
+ u32 mces_to_process;
#endif /* CONFIG_PPC_BOOK3S_64 */
} ____cacheline_aligned;
diff --git a/arch/powerpc/kernel/mce.c b/arch/powerpc/kernel/mce.c
index fd829f7f25a4..8e17f29472a0 100644
--- a/arch/powerpc/kernel/mce.c
+++ b/arch/powerpc/kernel/mce.c
@@ -28,19 +28,9 @@
#include "setup.h"
-static void machine_check_process_queued_event(struct irq_work *work);
-static void machine_check_ue_irq_work(struct irq_work *work);
static void machine_check_ue_event(struct machine_check_event *evt);
static void machine_process_ue_event(struct work_struct *work);
-static struct irq_work mce_event_process_work = {
- .func = machine_check_process_queued_event,
-};
-
-static struct irq_work mce_ue_event_irq_work = {
- .func = machine_check_ue_irq_work,
-};
-
static DECLARE_WORK(mce_ue_event_work, machine_process_ue_event);
static BLOCKING_NOTIFIER_HEAD(mce_notifier_list);
@@ -89,6 +79,12 @@ static void mce_set_error_info(struct machine_check_event *mce,
}
}
+/* Raise decrementer interrupt */
+void machine_check_raise_dec_intr(void)
+{
+ arch_irq_work_raise();
+}
+
/*
* Decode and save high level MCE information into per cpu buffer which
* is an array of machine_check_event structure.
@@ -135,6 +131,8 @@ void save_mce_event(struct pt_regs *regs, long handled,
if (mce->error_type == MCE_ERROR_TYPE_UE)
mce->u.ue_error.ignore_event = mce_err->ignore_event;
+ local_paca->mces_to_process++;
+
if (!addr)
return;
@@ -217,7 +215,7 @@ void release_mce_event(void)
get_mce_event(NULL, true);
}
-static void machine_check_ue_irq_work(struct irq_work *work)
+static void machine_check_ue_work(void)
{
schedule_work(&mce_ue_event_work);
}
@@ -239,7 +237,7 @@ static void machine_check_ue_event(struct machine_check_event *evt)
evt, sizeof(*evt));
/* Queue work to process this event later. */
- irq_work_queue(&mce_ue_event_irq_work);
+ machine_check_raise_dec_intr();
}
/*
@@ -249,7 +247,6 @@ void machine_check_queue_event(void)
{
int index;
struct machine_check_event evt;
- unsigned long msr;
if (!get_mce_event(&evt, MCE_EVENT_RELEASE))
return;
@@ -263,20 +260,7 @@ void machine_check_queue_event(void)
memcpy(&local_paca->mce_info->mce_event_queue[index],
&evt, sizeof(evt));
- /*
- * Queue irq work to process this event later. Before
- * queuing the work enable translation for non radix LPAR,
- * as irq_work_queue may try to access memory outside RMO
- * region.
- */
- if (!radix_enabled() && firmware_has_feature(FW_FEATURE_LPAR)) {
- msr = mfmsr();
- mtmsr(msr | MSR_IR | MSR_DR);
- irq_work_queue(&mce_event_process_work);
- mtmsr(msr);
- } else {
- irq_work_queue(&mce_event_process_work);
- }
+ machine_check_raise_dec_intr();
}
void mce_common_process_ue(struct pt_regs *regs,
@@ -338,7 +322,7 @@ static void machine_process_ue_event(struct work_struct *work)
* process pending MCE event from the mce event queue. This function will be
* called during syscall exit.
*/
-static void machine_check_process_queued_event(struct irq_work *work)
+static void machine_check_process_queued_event(void)
{
int index;
struct machine_check_event *evt;
@@ -363,6 +347,17 @@ static void machine_check_process_queued_event(struct irq_work *work)
}
}
+void mce_run_late_handlers(void)
+{
+ if (unlikely(local_paca->mces_to_process)) {
+ if (ppc_md.machine_check_log_err)
+ ppc_md.machine_check_log_err();
+ machine_check_process_queued_event();
+ machine_check_ue_work();
+ local_paca->mces_to_process--;
+ }
+}
+
void machine_check_print_event_info(struct machine_check_event *evt,
bool user_mode, bool in_guest)
{
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
index cae8f03a44fe..94c591b6f9d2 100644
--- a/arch/powerpc/kernel/time.c
+++ b/arch/powerpc/kernel/time.c
@@ -594,6 +594,9 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(timer_interrupt)
if (test_irq_work_pending()) {
clear_irq_work_pending();
+#ifdef CONFIG_PPC_BOOK3S_64
+ mce_run_late_handlers();
+#endif
irq_work_run();
}
diff --git a/arch/powerpc/platforms/pseries/pseries.h b/arch/powerpc/platforms/pseries/pseries.h
index 3544778e06d0..9cf0d33dfbf5 100644
--- a/arch/powerpc/platforms/pseries/pseries.h
+++ b/arch/powerpc/platforms/pseries/pseries.h
@@ -21,6 +21,7 @@ struct pt_regs;
extern int pSeries_system_reset_exception(struct pt_regs *regs);
extern int pSeries_machine_check_exception(struct pt_regs *regs);
extern long pseries_machine_check_realmode(struct pt_regs *regs);
+void pSeries_machine_check_log_err(void);
#ifdef CONFIG_SMP
extern void smp_init_pseries(void);
diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c
index 56092dccfdb8..8613f9cc5798 100644
--- a/arch/powerpc/platforms/pseries/ras.c
+++ b/arch/powerpc/platforms/pseries/ras.c
@@ -23,11 +23,6 @@ static DEFINE_SPINLOCK(ras_log_buf_lock);
static int ras_check_exception_token;
-static void mce_process_errlog_event(struct irq_work *work);
-static struct irq_work mce_errlog_process_work = {
- .func = mce_process_errlog_event,
-};
-
#define EPOW_SENSOR_TOKEN 9
#define EPOW_SENSOR_INDEX 0
@@ -729,40 +724,16 @@ static int mce_handle_error(struct pt_regs *regs, struct rtas_error_log *errp)
error_type = mce_log->error_type;
disposition = mce_handle_err_realmode(disposition, error_type);
-
- /*
- * Enable translation as we will be accessing per-cpu variables
- * in save_mce_event() which may fall outside RMO region, also
- * leave it enabled because subsequently we will be queuing work
- * to workqueues where again per-cpu variables accessed, besides
- * fwnmi_release_errinfo() crashes when called in realmode on
- * pseries.
- * Note: All the realmode handling like flushing SLB entries for
- * SLB multihit is done by now.
- */
out:
- msr = mfmsr();
- mtmsr(msr | MSR_IR | MSR_DR);
-
disposition = mce_handle_err_virtmode(regs, errp, mce_log,
disposition);
-
- /*
- * Queue irq work to log this rtas event later.
- * irq_work_queue uses per-cpu variables, so do this in virt
- * mode as well.
- */
- irq_work_queue(&mce_errlog_process_work);
-
- mtmsr(msr);
-
return disposition;
}
/*
* Process MCE rtas errlog event.
*/
-static void mce_process_errlog_event(struct irq_work *work)
+void pSeries_machine_check_log_err(void)
{
struct rtas_error_log *err;
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c
index 8a62af5b9c24..9bdc487b8e35 100644
--- a/arch/powerpc/platforms/pseries/setup.c
+++ b/arch/powerpc/platforms/pseries/setup.c
@@ -1084,6 +1084,7 @@ define_machine(pseries) {
.system_reset_exception = pSeries_system_reset_exception,
.machine_check_early = pseries_machine_check_realmode,
.machine_check_exception = pSeries_machine_check_exception,
+ .machine_check_log_err = pSeries_machine_check_log_err,
#ifdef CONFIG_KEXEC_CORE
.machine_kexec = pSeries_machine_kexec,
.kexec_cpu_down = pseries_kexec_cpu_down,
--
2.31.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v3 2/2] pseries/mce: Refactor the pseries mce handling code
2021-11-24 9:54 [PATCH v3 1/2] powerpc/mce: Avoid using irq_work_queue() in realmode Ganesh Goudar
@ 2021-11-24 9:55 ` Ganesh Goudar
2021-11-24 13:10 ` Nicholas Piggin
2021-11-24 13:03 ` [PATCH v3 1/2] powerpc/mce: Avoid using irq_work_queue() in realmode Nicholas Piggin
1 sibling, 1 reply; 7+ messages in thread
From: Ganesh Goudar @ 2021-11-24 9:55 UTC (permalink / raw)
To: linuxppc-dev, mpe; +Cc: Ganesh Goudar, mahesh, npiggin, dja
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 <ganeshgr@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;
@@ -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;
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;
+ }
+#endif
out:
save_mce_event(regs, disposition == RTAS_DISP_FULLY_RECOVERED,
- &mce_err, regs->nip, eaddr, paddr);
- return disposition;
-}
+ &mce_err, regs->nip, eaddr, paddr);
-static int mce_handle_error(struct pt_regs *regs, struct rtas_error_log *errp)
-{
- struct pseries_errorlog *pseries_log;
- struct pseries_mc_errorlog *mce_log = NULL;
- int disposition = rtas_error_disposition(errp);
- unsigned long msr;
- u8 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;
-
- disposition = mce_handle_err_realmode(disposition, error_type);
-out:
- disposition = mce_handle_err_virtmode(regs, errp, mce_log,
- disposition);
return disposition;
}
--
2.31.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH v3 2/2] pseries/mce: Refactor the pseries mce handling code
2021-11-24 9:55 ` [PATCH v3 2/2] pseries/mce: Refactor the pseries mce handling code Ganesh Goudar
@ 2021-11-24 13:10 ` Nicholas Piggin
2022-01-17 8:11 ` Ganesh
0 siblings, 1 reply; 7+ messages in thread
From: Nicholas Piggin @ 2021-11-24 13:10 UTC (permalink / raw)
To: Ganesh Goudar, linuxppc-dev, mpe; +Cc: mahesh, dja
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 <ganeshgr@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
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATCH v3 2/2] pseries/mce: Refactor the pseries mce handling code
2021-11-24 13:10 ` Nicholas Piggin
@ 2022-01-17 8:11 ` Ganesh
0 siblings, 0 replies; 7+ messages in thread
From: Ganesh @ 2022-01-17 8:11 UTC (permalink / raw)
To: Nicholas Piggin, linuxppc-dev, mpe; +Cc: mahesh, dja
[-- Attachment #1: Type: text/plain, Size: 5937 bytes --]
On 11/24/21 18:40, Nicholas Piggin wrote:
> 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<ganeshgr@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.
Ok, I will leave it as is for now, we can change it later.
>
> Thanks,
> Nick
[-- Attachment #2: Type: text/html, Size: 6507 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 1/2] powerpc/mce: Avoid using irq_work_queue() in realmode
2021-11-24 9:54 [PATCH v3 1/2] powerpc/mce: Avoid using irq_work_queue() in realmode Ganesh Goudar
2021-11-24 9:55 ` [PATCH v3 2/2] pseries/mce: Refactor the pseries mce handling code Ganesh Goudar
@ 2021-11-24 13:03 ` Nicholas Piggin
2022-01-17 8:09 ` Ganesh
1 sibling, 1 reply; 7+ messages in thread
From: Nicholas Piggin @ 2021-11-24 13:03 UTC (permalink / raw)
To: Ganesh Goudar, linuxppc-dev, mpe; +Cc: mahesh, dja
Excerpts from Ganesh Goudar's message of November 24, 2021 7:54 pm:
> In realmode mce handler we use irq_work_queue() to defer
> the processing of mce events, irq_work_queue() can only
> be called when translation is enabled because it touches
> memory outside RMA, hence we enable translation before
> calling irq_work_queue and disable on return, though it
> is not safe to do in realmode.
>
> To avoid this, program the decrementer and call the event
> processing functions from timer handler.
>
> Signed-off-by: Ganesh Goudar <ganeshgr@linux.ibm.com>
> ---
> V2:
> * Use arch_irq_work_raise to raise decrementer interrupt.
> * Avoid having atomic variable.
>
> V3:
> * Fix build error.
> Reported by kernel test bot.
> ---
> arch/powerpc/include/asm/machdep.h | 2 +
> arch/powerpc/include/asm/mce.h | 2 +
> arch/powerpc/include/asm/paca.h | 1 +
> arch/powerpc/kernel/mce.c | 51 +++++++++++-------------
> arch/powerpc/kernel/time.c | 3 ++
> arch/powerpc/platforms/pseries/pseries.h | 1 +
> arch/powerpc/platforms/pseries/ras.c | 31 +-------------
> arch/powerpc/platforms/pseries/setup.c | 1 +
> 8 files changed, 34 insertions(+), 58 deletions(-)
>
> diff --git a/arch/powerpc/include/asm/machdep.h b/arch/powerpc/include/asm/machdep.h
> index 9c3c9f04129f..d22b222ba471 100644
> --- a/arch/powerpc/include/asm/machdep.h
> +++ b/arch/powerpc/include/asm/machdep.h
> @@ -99,6 +99,8 @@ struct machdep_calls {
> /* Called during machine check exception to retrive fixup address. */
> bool (*mce_check_early_recovery)(struct pt_regs *regs);
>
> + void (*machine_check_log_err)(void);
> +
> /* Motherboard/chipset features. This is a kind of general purpose
> * hook used to control some machine specific features (like reset
> * lines, chip power control, etc...).
> diff --git a/arch/powerpc/include/asm/mce.h b/arch/powerpc/include/asm/mce.h
> index 331d944280b8..6e306aaf58aa 100644
> --- a/arch/powerpc/include/asm/mce.h
> +++ b/arch/powerpc/include/asm/mce.h
> @@ -235,8 +235,10 @@ extern void machine_check_print_event_info(struct machine_check_event *evt,
> unsigned long addr_to_pfn(struct pt_regs *regs, unsigned long addr);
> extern void mce_common_process_ue(struct pt_regs *regs,
> struct mce_error_info *mce_err);
> +void machine_check_raise_dec_intr(void);
> int mce_register_notifier(struct notifier_block *nb);
> int mce_unregister_notifier(struct notifier_block *nb);
> +void mce_run_late_handlers(void);
> #ifdef CONFIG_PPC_BOOK3S_64
> void flush_and_reload_slb(void);
> void flush_erat(void);
> diff --git a/arch/powerpc/include/asm/paca.h b/arch/powerpc/include/asm/paca.h
> index dc05a862e72a..d463c796f7fa 100644
> --- a/arch/powerpc/include/asm/paca.h
> +++ b/arch/powerpc/include/asm/paca.h
> @@ -280,6 +280,7 @@ struct paca_struct {
> #endif
> #ifdef CONFIG_PPC_BOOK3S_64
> struct mce_info *mce_info;
> + u32 mces_to_process;
> #endif /* CONFIG_PPC_BOOK3S_64 */
> } ____cacheline_aligned;
>
> diff --git a/arch/powerpc/kernel/mce.c b/arch/powerpc/kernel/mce.c
> index fd829f7f25a4..8e17f29472a0 100644
> --- a/arch/powerpc/kernel/mce.c
> +++ b/arch/powerpc/kernel/mce.c
> @@ -28,19 +28,9 @@
>
> #include "setup.h"
>
> -static void machine_check_process_queued_event(struct irq_work *work);
> -static void machine_check_ue_irq_work(struct irq_work *work);
> static void machine_check_ue_event(struct machine_check_event *evt);
> static void machine_process_ue_event(struct work_struct *work);
>
> -static struct irq_work mce_event_process_work = {
> - .func = machine_check_process_queued_event,
> -};
> -
> -static struct irq_work mce_ue_event_irq_work = {
> - .func = machine_check_ue_irq_work,
> -};
> -
> static DECLARE_WORK(mce_ue_event_work, machine_process_ue_event);
>
> static BLOCKING_NOTIFIER_HEAD(mce_notifier_list);
> @@ -89,6 +79,12 @@ static void mce_set_error_info(struct machine_check_event *mce,
> }
> }
>
> +/* Raise decrementer interrupt */
> +void machine_check_raise_dec_intr(void)
> +{
> + arch_irq_work_raise();
> +}
It would be better if the name specifically related to irq work, which
is more than just dec interrupt. It might be good to set mces_to_process
here as well.
I would name it something like mce_irq_work_queue, and the paca variable
to mce_pending_irq_work...
> +void mce_run_late_handlers(void)
> +{
> + if (unlikely(local_paca->mces_to_process)) {
> + if (ppc_md.machine_check_log_err)
> + ppc_md.machine_check_log_err();
> + machine_check_process_queued_event();
> + machine_check_ue_work();
> + local_paca->mces_to_process--;
> + }
> +}
The problem with a counter is that you're clearing the irq work pending
in the timer interrupt, so you'll never call in here again to clear that
(until something else sets irq work).
But as far as I can see it does not need to be a counter, just a flag.
The machine check calls will process multiple events, right? (and the
current irq_work queue does not queue the same work multiple times).
Oh. That's actually bad, isn't it? Our irq work should be per-CPU
because the callbacks are mainly only operating on the local paca
queued events, so we have a longstanding bug there AFAIKS. Your patch
will solve it if everything is converted over.
> +
> void machine_check_print_event_info(struct machine_check_event *evt,
> bool user_mode, bool in_guest)
> {
> diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
> index cae8f03a44fe..94c591b6f9d2 100644
> --- a/arch/powerpc/kernel/time.c
> +++ b/arch/powerpc/kernel/time.c
> @@ -594,6 +594,9 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(timer_interrupt)
>
> if (test_irq_work_pending()) {
> clear_irq_work_pending();
> +#ifdef CONFIG_PPC_BOOK3S_64
> + mce_run_late_handlers();
> +#endif
Maybe create a no-op inline function for others and call unconditionally
here. I wonder if the name could be better, we have lots of handlers, of
varying earliness. real-mode, then virt mode NMI context, then IRQ
context, then workqueue context.
mce_run_irq_context_handlers() might not be much better though.
> irq_work_run();
> }
>
> diff --git a/arch/powerpc/platforms/pseries/pseries.h b/arch/powerpc/platforms/pseries/pseries.h
> index 3544778e06d0..9cf0d33dfbf5 100644
> --- a/arch/powerpc/platforms/pseries/pseries.h
> +++ b/arch/powerpc/platforms/pseries/pseries.h
> @@ -21,6 +21,7 @@ struct pt_regs;
> extern int pSeries_system_reset_exception(struct pt_regs *regs);
> extern int pSeries_machine_check_exception(struct pt_regs *regs);
> extern long pseries_machine_check_realmode(struct pt_regs *regs);
> +void pSeries_machine_check_log_err(void);
>
> #ifdef CONFIG_SMP
> extern void smp_init_pseries(void);
> diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c
> index 56092dccfdb8..8613f9cc5798 100644
> --- a/arch/powerpc/platforms/pseries/ras.c
> +++ b/arch/powerpc/platforms/pseries/ras.c
> @@ -23,11 +23,6 @@ static DEFINE_SPINLOCK(ras_log_buf_lock);
>
> static int ras_check_exception_token;
>
> -static void mce_process_errlog_event(struct irq_work *work);
> -static struct irq_work mce_errlog_process_work = {
> - .func = mce_process_errlog_event,
> -};
> -
> #define EPOW_SENSOR_TOKEN 9
> #define EPOW_SENSOR_INDEX 0
>
> @@ -729,40 +724,16 @@ static int mce_handle_error(struct pt_regs *regs, struct rtas_error_log *errp)
> error_type = mce_log->error_type;
>
> disposition = mce_handle_err_realmode(disposition, error_type);
> -
> - /*
> - * Enable translation as we will be accessing per-cpu variables
> - * in save_mce_event() which may fall outside RMO region, also
> - * leave it enabled because subsequently we will be queuing work
> - * to workqueues where again per-cpu variables accessed, besides
> - * fwnmi_release_errinfo() crashes when called in realmode on
> - * pseries.
> - * Note: All the realmode handling like flushing SLB entries for
> - * SLB multihit is done by now.
> - */
> out:
> - msr = mfmsr();
> - mtmsr(msr | MSR_IR | MSR_DR);
> -
> disposition = mce_handle_err_virtmode(regs, errp, mce_log,
> disposition);
> -
> - /*
> - * Queue irq work to log this rtas event later.
> - * irq_work_queue uses per-cpu variables, so do this in virt
> - * mode as well.
> - */
> - irq_work_queue(&mce_errlog_process_work);
> -
> - mtmsr(msr);
> -
> return disposition;
> }
>
> /*
> * Process MCE rtas errlog event.
> */
> -static void mce_process_errlog_event(struct irq_work *work)
> +void pSeries_machine_check_log_err(void)
> {
> struct rtas_error_log *err;
>
> diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c
> index 8a62af5b9c24..9bdc487b8e35 100644
> --- a/arch/powerpc/platforms/pseries/setup.c
> +++ b/arch/powerpc/platforms/pseries/setup.c
> @@ -1084,6 +1084,7 @@ define_machine(pseries) {
> .system_reset_exception = pSeries_system_reset_exception,
> .machine_check_early = pseries_machine_check_realmode,
> .machine_check_exception = pSeries_machine_check_exception,
> + .machine_check_log_err = pSeries_machine_check_log_err,
> #ifdef CONFIG_KEXEC_CORE
> .machine_kexec = pSeries_machine_kexec,
> .kexec_cpu_down = pseries_kexec_cpu_down,
> --
> 2.31.1
>
>
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATCH v3 1/2] powerpc/mce: Avoid using irq_work_queue() in realmode
2021-11-24 13:03 ` [PATCH v3 1/2] powerpc/mce: Avoid using irq_work_queue() in realmode Nicholas Piggin
@ 2022-01-17 8:09 ` Ganesh
0 siblings, 0 replies; 7+ messages in thread
From: Ganesh @ 2022-01-17 8:09 UTC (permalink / raw)
To: Nicholas Piggin, linuxppc-dev, mpe; +Cc: mahesh, dja
[-- Attachment #1: Type: text/plain, Size: 9761 bytes --]
On 11/24/21 18:33, Nicholas Piggin wrote:
> Excerpts from Ganesh Goudar's message of November 24, 2021 7:54 pm:
>> In realmode mce handler we use irq_work_queue() to defer
>> the processing of mce events, irq_work_queue() can only
>> be called when translation is enabled because it touches
>> memory outside RMA, hence we enable translation before
>> calling irq_work_queue and disable on return, though it
>> is not safe to do in realmode.
>>
>> To avoid this, program the decrementer and call the event
>> processing functions from timer handler.
>>
>> Signed-off-by: Ganesh Goudar<ganeshgr@linux.ibm.com>
>> ---
>> V2:
>> * Use arch_irq_work_raise to raise decrementer interrupt.
>> * Avoid having atomic variable.
>>
>> V3:
>> * Fix build error.
>> Reported by kernel test bot.
>> ---
>> arch/powerpc/include/asm/machdep.h | 2 +
>> arch/powerpc/include/asm/mce.h | 2 +
>> arch/powerpc/include/asm/paca.h | 1 +
>> arch/powerpc/kernel/mce.c | 51 +++++++++++-------------
>> arch/powerpc/kernel/time.c | 3 ++
>> arch/powerpc/platforms/pseries/pseries.h | 1 +
>> arch/powerpc/platforms/pseries/ras.c | 31 +-------------
>> arch/powerpc/platforms/pseries/setup.c | 1 +
>> 8 files changed, 34 insertions(+), 58 deletions(-)
>>
>> diff --git a/arch/powerpc/include/asm/machdep.h b/arch/powerpc/include/asm/machdep.h
>> index 9c3c9f04129f..d22b222ba471 100644
>> --- a/arch/powerpc/include/asm/machdep.h
>> +++ b/arch/powerpc/include/asm/machdep.h
>> @@ -99,6 +99,8 @@ struct machdep_calls {
>> /* Called during machine check exception to retrive fixup address. */
>> bool (*mce_check_early_recovery)(struct pt_regs *regs);
>>
>> + void (*machine_check_log_err)(void);
>> +
>> /* Motherboard/chipset features. This is a kind of general purpose
>> * hook used to control some machine specific features (like reset
>> * lines, chip power control, etc...).
>> diff --git a/arch/powerpc/include/asm/mce.h b/arch/powerpc/include/asm/mce.h
>> index 331d944280b8..6e306aaf58aa 100644
>> --- a/arch/powerpc/include/asm/mce.h
>> +++ b/arch/powerpc/include/asm/mce.h
>> @@ -235,8 +235,10 @@ extern void machine_check_print_event_info(struct machine_check_event *evt,
>> unsigned long addr_to_pfn(struct pt_regs *regs, unsigned long addr);
>> extern void mce_common_process_ue(struct pt_regs *regs,
>> struct mce_error_info *mce_err);
>> +void machine_check_raise_dec_intr(void);
>> int mce_register_notifier(struct notifier_block *nb);
>> int mce_unregister_notifier(struct notifier_block *nb);
>> +void mce_run_late_handlers(void);
>> #ifdef CONFIG_PPC_BOOK3S_64
>> void flush_and_reload_slb(void);
>> void flush_erat(void);
>> diff --git a/arch/powerpc/include/asm/paca.h b/arch/powerpc/include/asm/paca.h
>> index dc05a862e72a..d463c796f7fa 100644
>> --- a/arch/powerpc/include/asm/paca.h
>> +++ b/arch/powerpc/include/asm/paca.h
>> @@ -280,6 +280,7 @@ struct paca_struct {
>> #endif
>> #ifdef CONFIG_PPC_BOOK3S_64
>> struct mce_info *mce_info;
>> + u32 mces_to_process;
>> #endif /* CONFIG_PPC_BOOK3S_64 */
>> } ____cacheline_aligned;
>>
>> diff --git a/arch/powerpc/kernel/mce.c b/arch/powerpc/kernel/mce.c
>> index fd829f7f25a4..8e17f29472a0 100644
>> --- a/arch/powerpc/kernel/mce.c
>> +++ b/arch/powerpc/kernel/mce.c
>> @@ -28,19 +28,9 @@
>>
>> #include "setup.h"
>>
>> -static void machine_check_process_queued_event(struct irq_work *work);
>> -static void machine_check_ue_irq_work(struct irq_work *work);
>> static void machine_check_ue_event(struct machine_check_event *evt);
>> static void machine_process_ue_event(struct work_struct *work);
>>
>> -static struct irq_work mce_event_process_work = {
>> - .func = machine_check_process_queued_event,
>> -};
>> -
>> -static struct irq_work mce_ue_event_irq_work = {
>> - .func = machine_check_ue_irq_work,
>> -};
>> -
>> static DECLARE_WORK(mce_ue_event_work, machine_process_ue_event);
>>
>> static BLOCKING_NOTIFIER_HEAD(mce_notifier_list);
>> @@ -89,6 +79,12 @@ static void mce_set_error_info(struct machine_check_event *mce,
>> }
>> }
>>
>> +/* Raise decrementer interrupt */
>> +void machine_check_raise_dec_intr(void)
>> +{
>> + arch_irq_work_raise();
>> +}
> It would be better if the name specifically related to irq work, which
> is more than just dec interrupt. It might be good to set mces_to_process
> here as well.
Sure
>
> I would name it something like mce_irq_work_queue, and the paca variable
> to mce_pending_irq_work...
Ok
>
>
>> +void mce_run_late_handlers(void)
>> +{
>> + if (unlikely(local_paca->mces_to_process)) {
>> + if (ppc_md.machine_check_log_err)
>> + ppc_md.machine_check_log_err();
>> + machine_check_process_queued_event();
>> + machine_check_ue_work();
>> + local_paca->mces_to_process--;
>> + }
>> +}
> The problem with a counter is that you're clearing the irq work pending
> in the timer interrupt, so you'll never call in here again to clear that
> (until something else sets irq work).
>
> But as far as I can see it does not need to be a counter, just a flag.
> The machine check calls will process multiple events, right? (and the
> current irq_work queue does not queue the same work multiple times).
You are right, It can just be a flag.
>
> Oh. That's actually bad, isn't it? Our irq work should be per-CPU
> because the callbacks are mainly only operating on the local paca
> queued events, so we have a longstanding bug there AFAIKS. Your patch
> will solve it if everything is converted over.
>
>> +
>> void machine_check_print_event_info(struct machine_check_event *evt,
>> bool user_mode, bool in_guest)
>> {
>> diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
>> index cae8f03a44fe..94c591b6f9d2 100644
>> --- a/arch/powerpc/kernel/time.c
>> +++ b/arch/powerpc/kernel/time.c
>> @@ -594,6 +594,9 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(timer_interrupt)
>>
>> if (test_irq_work_pending()) {
>> clear_irq_work_pending();
>> +#ifdef CONFIG_PPC_BOOK3S_64
>> + mce_run_late_handlers();
>> +#endif
> Maybe create a no-op inline function for others and call unconditionally
> here. I wonder if the name could be better, we have lots of handlers, of
> varying earliness. real-mode, then virt mode NMI context, then IRQ
> context, then workqueue context.
>
> mce_run_irq_context_handlers() might not be much better though.
>
>> irq_work_run();
>> }
>>
>> diff --git a/arch/powerpc/platforms/pseries/pseries.h b/arch/powerpc/platforms/pseries/pseries.h
>> index 3544778e06d0..9cf0d33dfbf5 100644
>> --- a/arch/powerpc/platforms/pseries/pseries.h
>> +++ b/arch/powerpc/platforms/pseries/pseries.h
>> @@ -21,6 +21,7 @@ struct pt_regs;
>> extern int pSeries_system_reset_exception(struct pt_regs *regs);
>> extern int pSeries_machine_check_exception(struct pt_regs *regs);
>> extern long pseries_machine_check_realmode(struct pt_regs *regs);
>> +void pSeries_machine_check_log_err(void);
>>
>> #ifdef CONFIG_SMP
>> extern void smp_init_pseries(void);
>> diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c
>> index 56092dccfdb8..8613f9cc5798 100644
>> --- a/arch/powerpc/platforms/pseries/ras.c
>> +++ b/arch/powerpc/platforms/pseries/ras.c
>> @@ -23,11 +23,6 @@ static DEFINE_SPINLOCK(ras_log_buf_lock);
>>
>> static int ras_check_exception_token;
>>
>> -static void mce_process_errlog_event(struct irq_work *work);
>> -static struct irq_work mce_errlog_process_work = {
>> - .func = mce_process_errlog_event,
>> -};
>> -
>> #define EPOW_SENSOR_TOKEN 9
>> #define EPOW_SENSOR_INDEX 0
>>
>> @@ -729,40 +724,16 @@ static int mce_handle_error(struct pt_regs *regs, struct rtas_error_log *errp)
>> error_type = mce_log->error_type;
>>
>> disposition = mce_handle_err_realmode(disposition, error_type);
>> -
>> - /*
>> - * Enable translation as we will be accessing per-cpu variables
>> - * in save_mce_event() which may fall outside RMO region, also
>> - * leave it enabled because subsequently we will be queuing work
>> - * to workqueues where again per-cpu variables accessed, besides
>> - * fwnmi_release_errinfo() crashes when called in realmode on
>> - * pseries.
>> - * Note: All the realmode handling like flushing SLB entries for
>> - * SLB multihit is done by now.
>> - */
>> out:
>> - msr = mfmsr();
>> - mtmsr(msr | MSR_IR | MSR_DR);
>> -
>> disposition = mce_handle_err_virtmode(regs, errp, mce_log,
>> disposition);
>> -
>> - /*
>> - * Queue irq work to log this rtas event later.
>> - * irq_work_queue uses per-cpu variables, so do this in virt
>> - * mode as well.
>> - */
>> - irq_work_queue(&mce_errlog_process_work);
>> -
>> - mtmsr(msr);
>> -
>> return disposition;
>> }
>>
>> /*
>> * Process MCE rtas errlog event.
>> */
>> -static void mce_process_errlog_event(struct irq_work *work)
>> +void pSeries_machine_check_log_err(void)
>> {
>> struct rtas_error_log *err;
>>
>> diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c
>> index 8a62af5b9c24..9bdc487b8e35 100644
>> --- a/arch/powerpc/platforms/pseries/setup.c
>> +++ b/arch/powerpc/platforms/pseries/setup.c
>> @@ -1084,6 +1084,7 @@ define_machine(pseries) {
>> .system_reset_exception = pSeries_system_reset_exception,
>> .machine_check_early = pseries_machine_check_realmode,
>> .machine_check_exception = pSeries_machine_check_exception,
>> + .machine_check_log_err = pSeries_machine_check_log_err,
>> #ifdef CONFIG_KEXEC_CORE
>> .machine_kexec = pSeries_machine_kexec,
>> .kexec_cpu_down = pseries_kexec_cpu_down,
>> --
>> 2.31.1
>>
>>
[-- Attachment #2: Type: text/html, Size: 10463 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 2/2] pseries/mce: Refactor the pseries mce handling code
@ 2021-11-25 22:03 kernel test robot
0 siblings, 0 replies; 7+ messages in thread
From: kernel test robot @ 2021-11-25 22:03 UTC (permalink / raw)
To: kbuild
[-- Attachment #1: Type: text/plain, Size: 20898 bytes --]
CC: kbuild-all(a)lists.01.org
In-Reply-To: <20211124095500.98656-2-ganeshgr@linux.ibm.com>
References: <20211124095500.98656-2-ganeshgr@linux.ibm.com>
TO: Ganesh Goudar <ganeshgr@linux.ibm.com>
TO: linuxppc-dev(a)lists.ozlabs.org
TO: mpe(a)ellerman.id.au
CC: Ganesh Goudar <ganeshgr@linux.ibm.com>
CC: mahesh(a)linux.ibm.com
CC: npiggin(a)gmail.com
CC: dja(a)axtens.net
Hi Ganesh,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on powerpc/next]
[also build test WARNING on v5.16-rc2 next-20211125]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Ganesh-Goudar/powerpc-mce-Avoid-using-irq_work_queue-in-realmode/20211124-175800
base: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next
:::::: branch date: 2 days ago
:::::: commit date: 2 days ago
config: powerpc64-randconfig-c024-20211124 (https://download.01.org/0day-ci/archive/20211126/202111260536.m57xOEqc-lkp(a)intel.com/config)
compiler: powerpc64-linux-gcc (GCC) 11.2.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Julia Lawall <julia.lawall@lip6.fr>
cocci warnings: (new ones prefixed by >>)
>> arch/powerpc/platforms/pseries/ras.c:550:6-8: WARNING: possible condition with no effect (if == else)
vim +550 arch/powerpc/platforms/pseries/ras.c
^1da177e4c3f41 arch/ppc64/kernel/ras.c Linus Torvalds 2005-04-16 513
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 514 static int mce_handle_error(struct pt_regs *regs, struct rtas_error_log *errp)
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 515 {
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 516 struct mce_error_info mce_err = { 0 };
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 517 unsigned long eaddr = 0, paddr = 0;
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 518 struct pseries_errorlog *pseries_log;
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 519 struct pseries_mc_errorlog *mce_log;
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 520 int disposition = rtas_error_disposition(errp);
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 521 int initiator = rtas_error_initiator(errp);
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 522 int severity = rtas_error_severity(errp);
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 523 u8 error_type, err_sub_type;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 524
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 525 if (initiator == RTAS_INITIATOR_UNKNOWN)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 526 mce_err.initiator = MCE_INITIATOR_UNKNOWN;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 527 else if (initiator == RTAS_INITIATOR_CPU)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 528 mce_err.initiator = MCE_INITIATOR_CPU;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 529 else if (initiator == RTAS_INITIATOR_PCI)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 530 mce_err.initiator = MCE_INITIATOR_PCI;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 531 else if (initiator == RTAS_INITIATOR_ISA)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 532 mce_err.initiator = MCE_INITIATOR_ISA;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 533 else if (initiator == RTAS_INITIATOR_MEMORY)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 534 mce_err.initiator = MCE_INITIATOR_MEMORY;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 535 else if (initiator == RTAS_INITIATOR_POWERMGM)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 536 mce_err.initiator = MCE_INITIATOR_POWERMGM;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 537 else
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 538 mce_err.initiator = MCE_INITIATOR_UNKNOWN;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 539
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 540 if (severity == RTAS_SEVERITY_NO_ERROR)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 541 mce_err.severity = MCE_SEV_NO_ERROR;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 542 else if (severity == RTAS_SEVERITY_EVENT)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 543 mce_err.severity = MCE_SEV_WARNING;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 544 else if (severity == RTAS_SEVERITY_WARNING)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 545 mce_err.severity = MCE_SEV_WARNING;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 546 else if (severity == RTAS_SEVERITY_ERROR_SYNC)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 547 mce_err.severity = MCE_SEV_SEVERE;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 548 else if (severity == RTAS_SEVERITY_ERROR)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 549 mce_err.severity = MCE_SEV_SEVERE;
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 @550 else if (severity == RTAS_SEVERITY_FATAL)
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 551 mce_err.severity = MCE_SEV_FATAL;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 552 else
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 553 mce_err.severity = MCE_SEV_FATAL;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 554
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 555 if (severity <= RTAS_SEVERITY_ERROR_SYNC)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 556 mce_err.sync_error = true;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 557 else
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 558 mce_err.sync_error = false;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 559
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 560 mce_err.error_type = MCE_ERROR_TYPE_UNKNOWN;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 561 mce_err.error_class = MCE_ECLASS_UNKNOWN;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 562
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 563 if (!rtas_error_extended(errp))
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 564 goto out;
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 565
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 566 pseries_log = get_pseries_errorlog(errp, PSERIES_ELOG_SECT_ID_MCE);
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 567 if (!pseries_log)
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 568 goto out;
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 569
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 570 mce_log = (struct pseries_mc_errorlog *)pseries_log->data;
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 571 error_type = mce_log->error_type;
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 572 err_sub_type = rtas_mc_error_sub_type(mce_log);
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 573
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 574 switch (mce_log->error_type) {
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 575 case MC_ERROR_TYPE_UE:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 576 mce_err.error_type = MCE_ERROR_TYPE_UE;
efbc4303b255bb arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2020-03-27 577 mce_common_process_ue(regs, &mce_err);
efbc4303b255bb arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2020-03-27 578 if (mce_err.ignore_event)
efbc4303b255bb arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2020-03-27 579 disposition = RTAS_DISP_FULLY_RECOVERED;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 580 switch (err_sub_type) {
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 581 case MC_ERROR_UE_IFETCH:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 582 mce_err.u.ue_error_type = MCE_UE_ERROR_IFETCH;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 583 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 584 case MC_ERROR_UE_PAGE_TABLE_WALK_IFETCH:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 585 mce_err.u.ue_error_type = MCE_UE_ERROR_PAGE_TABLE_WALK_IFETCH;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 586 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 587 case MC_ERROR_UE_LOAD_STORE:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 588 mce_err.u.ue_error_type = MCE_UE_ERROR_LOAD_STORE;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 589 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 590 case MC_ERROR_UE_PAGE_TABLE_WALK_LOAD_STORE:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 591 mce_err.u.ue_error_type = MCE_UE_ERROR_PAGE_TABLE_WALK_LOAD_STORE;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 592 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 593 case MC_ERROR_UE_INDETERMINATE:
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 594 default:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 595 mce_err.u.ue_error_type = MCE_UE_ERROR_INDETERMINATE;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 596 break;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 597 }
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 598 if (mce_log->sub_err_type & UE_EFFECTIVE_ADDR_PROVIDED)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 599 eaddr = be64_to_cpu(mce_log->effective_address);
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 600
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 601 if (mce_log->sub_err_type & UE_LOGICAL_ADDR_PROVIDED) {
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 602 paddr = be64_to_cpu(mce_log->logical_address);
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 603 } else if (mce_log->sub_err_type & UE_EFFECTIVE_ADDR_PROVIDED) {
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 604 unsigned long pfn;
c6d15258cdf1c1 arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 605
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 606 pfn = addr_to_pfn(regs, eaddr);
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 607 if (pfn != ULONG_MAX)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 608 paddr = pfn << PAGE_SHIFT;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 609 }
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 610
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 611 break;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 612 case MC_ERROR_TYPE_SLB:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 613 mce_err.error_type = MCE_ERROR_TYPE_SLB;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 614 switch (err_sub_type) {
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 615 case MC_ERROR_SLB_PARITY:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 616 mce_err.u.slb_error_type = MCE_SLB_ERROR_PARITY;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 617 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 618 case MC_ERROR_SLB_MULTIHIT:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 619 mce_err.u.slb_error_type = MCE_SLB_ERROR_MULTIHIT;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 620 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 621 case MC_ERROR_SLB_INDETERMINATE:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 622 default:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 623 mce_err.u.slb_error_type = MCE_SLB_ERROR_INDETERMINATE;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 624 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 625 }
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 626 if (mce_log->sub_err_type & 0x80)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 627 eaddr = be64_to_cpu(mce_log->effective_address);
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 628 break;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 629 case MC_ERROR_TYPE_ERAT:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 630 mce_err.error_type = MCE_ERROR_TYPE_ERAT;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 631 switch (err_sub_type) {
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 632 case MC_ERROR_ERAT_PARITY:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 633 mce_err.u.erat_error_type = MCE_ERAT_ERROR_PARITY;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 634 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 635 case MC_ERROR_ERAT_MULTIHIT:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 636 mce_err.u.erat_error_type = MCE_ERAT_ERROR_MULTIHIT;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 637 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 638 case MC_ERROR_ERAT_INDETERMINATE:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 639 default:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 640 mce_err.u.erat_error_type = MCE_ERAT_ERROR_INDETERMINATE;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 641 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 642 }
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 643 if (mce_log->sub_err_type & 0x80)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 644 eaddr = be64_to_cpu(mce_log->effective_address);
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 645 break;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 646 case MC_ERROR_TYPE_TLB:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 647 mce_err.error_type = MCE_ERROR_TYPE_TLB;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 648 switch (err_sub_type) {
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 649 case MC_ERROR_TLB_PARITY:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 650 mce_err.u.tlb_error_type = MCE_TLB_ERROR_PARITY;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 651 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 652 case MC_ERROR_TLB_MULTIHIT:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 653 mce_err.u.tlb_error_type = MCE_TLB_ERROR_MULTIHIT;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 654 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 655 case MC_ERROR_TLB_INDETERMINATE:
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 656 default:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 657 mce_err.u.tlb_error_type = MCE_TLB_ERROR_INDETERMINATE;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 658 break;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 659 }
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 660 if (mce_log->sub_err_type & 0x80)
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 661 eaddr = be64_to_cpu(mce_log->effective_address);
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 662 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 663 case MC_ERROR_TYPE_D_CACHE:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 664 mce_err.error_type = MCE_ERROR_TYPE_DCACHE;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 665 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 666 case MC_ERROR_TYPE_I_CACHE:
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 667 mce_err.error_type = MCE_ERROR_TYPE_DCACHE;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 668 break;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 669 case MC_ERROR_TYPE_UNKNOWN:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 670 default:
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 671 mce_err.error_type = MCE_ERROR_TYPE_UNKNOWN;
9ca766f9891d23 arch/powerpc/platforms/pseries/ras.c Nicholas Piggin 2019-08-02 672 break;
8f0b80561f217e arch/powerpc/platforms/pseries/ras.c Mahesh Salgaonkar 2018-09-11 673 }
3efc8c464c6707 arch/powerpc/platforms/pseries/ras.c Ganesh Goudar 2021-11-24 674
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2022-01-17 10:14 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-11-24 9:54 [PATCH v3 1/2] powerpc/mce: Avoid using irq_work_queue() in realmode Ganesh Goudar
2021-11-24 9:55 ` [PATCH v3 2/2] pseries/mce: Refactor the pseries mce handling code Ganesh Goudar
2021-11-24 13:10 ` Nicholas Piggin
2022-01-17 8:11 ` Ganesh
2021-11-24 13:03 ` [PATCH v3 1/2] powerpc/mce: Avoid using irq_work_queue() in realmode Nicholas Piggin
2022-01-17 8:09 ` Ganesh
-- strict thread matches above, loose matches on Subject: below --
2021-11-25 22:03 [PATCH v3 2/2] pseries/mce: Refactor the pseries mce handling code kernel test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.