schedule_work() cannot be called from MCE exception context as MCE can interrupt even in interrupt disabled context.
fixes: 733e4a4c ("powerpc/mce: hookup memory_failure for UE errors") Suggested-by: Mahesh Salgaonkar mahesh@linux.vnet.ibm.com Signed-off-by: Santosh Sivaraj santosh@fossix.org Reviewed-by: Mahesh Salgaonkar mahesh@linux.vnet.ibm.com Acked-by: Balbir Singh bsingharora@gmail.com Cc: stable@vger.kernel.org # v4.15+ --- arch/powerpc/kernel/mce.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/arch/powerpc/kernel/mce.c b/arch/powerpc/kernel/mce.c index b18df633eae9..cff31d4a501f 100644 --- a/arch/powerpc/kernel/mce.c +++ b/arch/powerpc/kernel/mce.c @@ -33,6 +33,7 @@ static DEFINE_PER_CPU(struct machine_check_event[MAX_MC_EVT], mce_ue_event_queue);
static void machine_check_process_queued_event(struct irq_work *work); +static void machine_check_ue_irq_work(struct irq_work *work); void machine_check_ue_event(struct machine_check_event *evt); static void machine_process_ue_event(struct work_struct *work);
@@ -40,6 +41,10 @@ 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, +}; + DECLARE_WORK(mce_ue_event_work, machine_process_ue_event);
static void mce_set_error_info(struct machine_check_event *mce, @@ -199,6 +204,10 @@ void release_mce_event(void) get_mce_event(NULL, true); }
+static void machine_check_ue_irq_work(struct irq_work *work) +{ + schedule_work(&mce_ue_event_work); +}
/* * Queue up the MCE event which then can be handled later. @@ -216,7 +225,7 @@ void machine_check_ue_event(struct machine_check_event *evt) memcpy(this_cpu_ptr(&mce_ue_event_queue[index]), evt, sizeof(*evt));
/* Queue work to process this event later. */ - schedule_work(&mce_ue_event_work); + irq_work_queue(&mce_ue_event_irq_work); }
/*
Santosh Sivaraj's on August 15, 2019 10:39 am:
schedule_work() cannot be called from MCE exception context as MCE can interrupt even in interrupt disabled context.
The powernv code doesn't do this in general, rather defers kernel MCEs. My patch series converts the pseries machine check exception code over to the same.
However there remain special cases where that's not true for powernv, e.g., the machine check stack overflow or unrecoverable MCE paths try to force it through so something gets printed. We probably shouldn't even try to do memory failure in these cases.
Still, shouldn't hurt to make this change and fixes the existing "different" pseries code.
Thanks, Nick
fixes: 733e4a4c ("powerpc/mce: hookup memory_failure for UE errors") Suggested-by: Mahesh Salgaonkar mahesh@linux.vnet.ibm.com Signed-off-by: Santosh Sivaraj santosh@fossix.org Reviewed-by: Mahesh Salgaonkar mahesh@linux.vnet.ibm.com Acked-by: Balbir Singh bsingharora@gmail.com Cc: stable@vger.kernel.org # v4.15+
Reviewed-by: Nicholas Piggin npiggin@gmail.com
linux-stable-mirror@lists.linaro.org