* [PATCH v2 00/14] powerpc/64: machine check and system reset fixes
@ 2020-04-03 13:26 Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 01/14] powerpc/64s/exception: Fix machine check no-loss idle wakeup Nicholas Piggin
` (13 more replies)
0 siblings, 14 replies; 26+ messages in thread
From: Nicholas Piggin @ 2020-04-03 13:26 UTC (permalink / raw)
To: linuxppc-dev; +Cc: Mahesh Salgaonkar, Ganesh Goudar, Nicholas Piggin
There's a bunch of problems we hit bringing up fwnmi sreset and testing
with mce injection on QEMU. Mostly pseries issues.
This series of fixes applies on top of next-test, the machine
check reconcile patch won't apply cleanly to previous kernels but
it might want to be backported. We can do that after upstreaming.
This doesn't solve all known problems yet, but fwnmi machine check
and system reset injection in QEMU is significantly better. There
will be more to come but these should be ready for review now.
Thanks,
Nick
v2:
- Added a couple more fixes
- Review comments and tags
- Re-tested with some fixes to my qemu machine check injection patches
Nicholas Piggin (14):
powerpc/64s/exception: Fix machine check no-loss idle wakeup
powerpc/64s/exceptions: Fix in_mce accounting in unrecoverable path
powerpc/64s/exceptions: Change irq reconcile for NMIs from reusing
_DAR to RESULT
powerpc/64s/exceptions: machine check reconcile irq state
powerpc/pseries/ras: avoid calling rtas_token in NMI paths
powerpc/pseries/ras: FWNMI_VALID off by one
powerpc/pseries/ras: fwnmi avoid modifying r3 in error case
powerpc/pseries/ras: fwnmi sreset should not interlock
powerpc/pseries: limit machine check stack to 4GB
powerpc/pseries: machine check use rtas_call_unlocked with args on
stack
powerpc/64s: machine check interrupt update NMI accounting
powerpc/64s: machine check do not trace real-mode handler
powerpc/64s: system reset do not trace
powerpc: make unrecoverable NMIs die instead of panic
arch/powerpc/include/asm/firmware.h | 1 +
arch/powerpc/kernel/exceptions-64s.S | 47 ++++++++++++++-----
arch/powerpc/kernel/mce.c | 13 +++++-
arch/powerpc/kernel/process.c | 2 +-
arch/powerpc/kernel/setup_64.c | 17 ++++++-
arch/powerpc/kernel/traps.c | 24 ++++------
arch/powerpc/platforms/pseries/ras.c | 62 +++++++++++++++++++-------
arch/powerpc/platforms/pseries/setup.c | 13 ++++--
8 files changed, 131 insertions(+), 48 deletions(-)
--
2.23.0
^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH v2 01/14] powerpc/64s/exception: Fix machine check no-loss idle wakeup
2020-04-03 13:26 [PATCH v2 00/14] powerpc/64: machine check and system reset fixes Nicholas Piggin
@ 2020-04-03 13:26 ` Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 02/14] powerpc/64s/exceptions: Fix in_mce accounting in unrecoverable path Nicholas Piggin
` (12 subsequent siblings)
13 siblings, 0 replies; 26+ messages in thread
From: Nicholas Piggin @ 2020-04-03 13:26 UTC (permalink / raw)
To: linuxppc-dev; +Cc: Mahesh Salgaonkar, Ganesh Goudar, Nicholas Piggin
The architecture allows for machine check exceptions to cause idle
wakeups which resume at the 0x200 address which has to return via
the idle wakeup code, but the early machine check handler is run
first.
The case of a no state-loss sleep is broken because the early
handler uses non-volatile register r1 , which is needed for the wakeup
protocol, but it is not restored.
Fix this by loading r1 from the MCE exception frame before returning
to the idle wakeup code. Also update the comment which has become
stale since the idle rewrite in C.
Fixes: 10d91611f426d ("powerpc/64s: Reimplement book3s idle code in C")
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
arch/powerpc/kernel/exceptions-64s.S | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index 728ccb0f560c..bbf3109c5cba 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -1224,17 +1224,19 @@ EXC_COMMON_BEGIN(machine_check_idle_common)
bl machine_check_queue_event
/*
- * We have not used any non-volatile GPRs here, and as a rule
- * most exception code including machine check does not.
- * Therefore PACA_NAPSTATELOST does not need to be set. Idle
- * wakeup will restore volatile registers.
+ * GPR-loss wakeups are relatively straightforward, because the
+ * idle sleep code has saved all non-volatile registers on its
+ * own stack, and r1 in PACAR1.
*
- * Load the original SRR1 into r3 for pnv_powersave_wakeup_mce.
+ * For no-loss wakeups the r1 and lr registers used by the
+ * early machine check handler have to be restored first. r2 is
+ * the kernel TOC, so no need to restore it.
*
* Then decrement MCE nesting after finishing with the stack.
*/
ld r3,_MSR(r1)
ld r4,_LINK(r1)
+ ld r1,GPR1(r1)
lhz r11,PACA_IN_MCE(r13)
subi r11,r11,1
@@ -1243,7 +1245,7 @@ EXC_COMMON_BEGIN(machine_check_idle_common)
mtlr r4
rlwinm r10,r3,47-31,30,31
cmpwi cr1,r10,2
- bltlr cr1 /* no state loss, return to idle caller */
+ bltlr cr1 /* no state loss, return to idle caller with r3=SRR1 */
b idle_return_gpr_loss
#endif
--
2.23.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH v2 02/14] powerpc/64s/exceptions: Fix in_mce accounting in unrecoverable path
2020-04-03 13:26 [PATCH v2 00/14] powerpc/64: machine check and system reset fixes Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 01/14] powerpc/64s/exception: Fix machine check no-loss idle wakeup Nicholas Piggin
@ 2020-04-03 13:26 ` Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 03/14] powerpc/64s/exceptions: Change irq reconcile for NMIs from reusing _DAR to RESULT Nicholas Piggin
` (11 subsequent siblings)
13 siblings, 0 replies; 26+ messages in thread
From: Nicholas Piggin @ 2020-04-03 13:26 UTC (permalink / raw)
To: linuxppc-dev
Cc: Mahesh Salgaonkar, Ganesh Goudar, Mahesh Salgaonkar, Nicholas Piggin
Acked-by: Mahesh Salgaonkar <mahesh@linux.ibm.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
arch/powerpc/kernel/exceptions-64s.S | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index bbf3109c5cba..3322000316ab 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -1267,6 +1267,10 @@ END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
andc r10,r10,r3
mtmsrd r10
+ lhz r12,PACA_IN_MCE(r13)
+ subi r12,r12,1
+ sth r12,PACA_IN_MCE(r13)
+
/* Invoke machine_check_exception to print MCE event and panic. */
addi r3,r1,STACK_FRAME_OVERHEAD
bl machine_check_exception
--
2.23.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH v2 03/14] powerpc/64s/exceptions: Change irq reconcile for NMIs from reusing _DAR to RESULT
2020-04-03 13:26 [PATCH v2 00/14] powerpc/64: machine check and system reset fixes Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 01/14] powerpc/64s/exception: Fix machine check no-loss idle wakeup Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 02/14] powerpc/64s/exceptions: Fix in_mce accounting in unrecoverable path Nicholas Piggin
@ 2020-04-03 13:26 ` Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 04/14] powerpc/64s/exceptions: machine check reconcile irq state Nicholas Piggin
` (10 subsequent siblings)
13 siblings, 0 replies; 26+ messages in thread
From: Nicholas Piggin @ 2020-04-03 13:26 UTC (permalink / raw)
To: linuxppc-dev; +Cc: Mahesh Salgaonkar, Ganesh Goudar, Nicholas Piggin
A spare interrupt stack slot is needed to save irq state when
reconciling NMIs (sreset and decrementer soft-nmi). _DAR is used
for this, but we want to reconcile machine checks as well, which
do use _DAR. Switch to using RESULT instead, as it's used by
system calls.
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
arch/powerpc/kernel/exceptions-64s.S | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index 3322000316ab..a42b73efb1a9 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -939,13 +939,13 @@ EXC_COMMON_BEGIN(system_reset_common)
* the right thing. We do not want to reconcile because that goes
* through irq tracing which we don't want in NMI.
*
- * Save PACAIRQHAPPENED to _DAR (otherwise unused), and set HARD_DIS
+ * Save PACAIRQHAPPENED to RESULT (otherwise unused), and set HARD_DIS
* as we are running with MSR[EE]=0.
*/
li r10,IRQS_ALL_DISABLED
stb r10,PACAIRQSOFTMASK(r13)
lbz r10,PACAIRQHAPPENED(r13)
- std r10,_DAR(r1)
+ std r10,RESULT(r1)
ori r10,r10,PACA_IRQ_HARD_DIS
stb r10,PACAIRQHAPPENED(r13)
@@ -966,7 +966,7 @@ EXC_COMMON_BEGIN(system_reset_common)
/*
* Restore soft mask settings.
*/
- ld r10,_DAR(r1)
+ ld r10,RESULT(r1)
stb r10,PACAIRQHAPPENED(r13)
ld r10,SOFTE(r1)
stb r10,PACAIRQSOFTMASK(r13)
@@ -2743,7 +2743,7 @@ EXC_COMMON_BEGIN(soft_nmi_common)
li r10,IRQS_ALL_DISABLED
stb r10,PACAIRQSOFTMASK(r13)
lbz r10,PACAIRQHAPPENED(r13)
- std r10,_DAR(r1)
+ std r10,RESULT(r1)
ori r10,r10,PACA_IRQ_HARD_DIS
stb r10,PACAIRQHAPPENED(r13)
@@ -2757,7 +2757,7 @@ EXC_COMMON_BEGIN(soft_nmi_common)
/*
* Restore soft mask settings.
*/
- ld r10,_DAR(r1)
+ ld r10,RESULT(r1)
stb r10,PACAIRQHAPPENED(r13)
ld r10,SOFTE(r1)
stb r10,PACAIRQSOFTMASK(r13)
--
2.23.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH v2 04/14] powerpc/64s/exceptions: machine check reconcile irq state
2020-04-03 13:26 [PATCH v2 00/14] powerpc/64: machine check and system reset fixes Nicholas Piggin
` (2 preceding siblings ...)
2020-04-03 13:26 ` [PATCH v2 03/14] powerpc/64s/exceptions: Change irq reconcile for NMIs from reusing _DAR to RESULT Nicholas Piggin
@ 2020-04-03 13:26 ` Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 05/14] powerpc/pseries/ras: avoid calling rtas_token in NMI paths Nicholas Piggin
` (9 subsequent siblings)
13 siblings, 0 replies; 26+ messages in thread
From: Nicholas Piggin @ 2020-04-03 13:26 UTC (permalink / raw)
To: linuxppc-dev; +Cc: Mahesh Salgaonkar, Ganesh Goudar, Nicholas Piggin
pseries fwnmi machine check code pops the soft-irq checks in rtas_call
(after the previous patch to remove rtas_token from this call path).
Rather than play whack a mole with these and forever having fragile
code, it seems better to have the early machine check handler perform
the same kind of reconcile as the other NMI interrupts.
WARNING: CPU: 0 PID: 493 at arch/powerpc/kernel/irq.c:343
CPU: 0 PID: 493 Comm: a Tainted: G W
NIP: c00000000001ed2c LR: c000000000042c40 CTR: 0000000000000000
REGS: c0000001fffd38b0 TRAP: 0700 Tainted: G W
MSR: 8000000000021003 <SF,ME,RI,LE> CR: 28000488 XER: 00000000
CFAR: c00000000001ec90 IRQMASK: 0
GPR00: c000000000043820 c0000001fffd3b40 c0000000012ba300 0000000000000000
GPR04: 0000000048000488 0000000000000000 0000000000000000 00000000deadbeef
GPR08: 0000000000000080 0000000000000000 0000000000000000 0000000000001001
GPR12: 0000000000000000 c0000000014a0000 0000000000000000 0000000000000000
GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR20: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR24: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR28: 0000000000000000 0000000000000001 c000000001360810 0000000000000000
NIP [c00000000001ed2c] arch_local_irq_restore.part.0+0xac/0x100
LR [c000000000042c40] unlock_rtas+0x30/0x90
Call Trace:
[c0000001fffd3b40] [c000000001360810] 0xc000000001360810 (unreliable)
[c0000001fffd3b60] [c000000000043820] rtas_call+0x1c0/0x280
[c0000001fffd3bb0] [c0000000000dc328] fwnmi_release_errinfo+0x38/0x70
[c0000001fffd3c10] [c0000000000dcd8c] pseries_machine_check_realmode+0x1dc/0x540
[c0000001fffd3cd0] [c00000000003fe04] machine_check_early+0x54/0x70
[c0000001fffd3d00] [c000000000008384] machine_check_early_common+0x134/0x1f0
--- interrupt: 200 at 0x13f1307c8
LR = 0x7fff888b8528
Instruction dump:
60000000 7d2000a6 71298000 41820068 39200002 7d210164 4bffff9c 60000000
60000000 7d2000a6 71298000 4c820020 <0fe00000> 4e800020 60000000 60000000
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
arch/powerpc/kernel/exceptions-64s.S | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index a42b73efb1a9..072772803b7c 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -1116,11 +1116,30 @@ END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
li r10,MSR_RI
mtmsrd r10,1
+ /*
+ * Set IRQS_ALL_DISABLED and save PACAIRQHAPPENED (see
+ * system_reset_common)
+ */
+ li r10,IRQS_ALL_DISABLED
+ stb r10,PACAIRQSOFTMASK(r13)
+ lbz r10,PACAIRQHAPPENED(r13)
+ std r10,RESULT(r1)
+ ori r10,r10,PACA_IRQ_HARD_DIS
+ stb r10,PACAIRQHAPPENED(r13)
+
addi r3,r1,STACK_FRAME_OVERHEAD
bl machine_check_early
std r3,RESULT(r1) /* Save result */
ld r12,_MSR(r1)
+ /*
+ * Restore soft mask settings.
+ */
+ ld r10,RESULT(r1)
+ stb r10,PACAIRQHAPPENED(r13)
+ ld r10,SOFTE(r1)
+ stb r10,PACAIRQSOFTMASK(r13)
+
#ifdef CONFIG_PPC_P7_NAP
/*
* Check if thread was in power saving mode. We come here when any
--
2.23.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH v2 05/14] powerpc/pseries/ras: avoid calling rtas_token in NMI paths
2020-04-03 13:26 [PATCH v2 00/14] powerpc/64: machine check and system reset fixes Nicholas Piggin
` (3 preceding siblings ...)
2020-04-03 13:26 ` [PATCH v2 04/14] powerpc/64s/exceptions: machine check reconcile irq state Nicholas Piggin
@ 2020-04-03 13:26 ` Nicholas Piggin
2020-04-03 14:30 ` Christophe Leroy
2020-04-03 13:26 ` [PATCH v2 06/14] powerpc/pseries/ras: FWNMI_VALID off by one Nicholas Piggin
` (8 subsequent siblings)
13 siblings, 1 reply; 26+ messages in thread
From: Nicholas Piggin @ 2020-04-03 13:26 UTC (permalink / raw)
To: linuxppc-dev
Cc: Mahesh Salgaonkar, Ganesh Goudar, Mahesh Salgaonkar, Nicholas Piggin
In the interest of reducing code and possible failures in the
machine check and system reset paths, grab the "ibm,nmi-interlock"
token at init time.
Reviewed-by: Mahesh Salgaonkar <mahesh@linux.ibm.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
arch/powerpc/include/asm/firmware.h | 1 +
arch/powerpc/platforms/pseries/ras.c | 2 +-
arch/powerpc/platforms/pseries/setup.c | 13 ++++++++++---
3 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/arch/powerpc/include/asm/firmware.h b/arch/powerpc/include/asm/firmware.h
index ca33f4ef6cb4..6003c2e533a0 100644
--- a/arch/powerpc/include/asm/firmware.h
+++ b/arch/powerpc/include/asm/firmware.h
@@ -128,6 +128,7 @@ extern void machine_check_fwnmi(void);
/* This is true if we are using the firmware NMI handler (typically LPAR) */
extern int fwnmi_active;
+extern int ibm_nmi_interlock_token;
extern unsigned int __start___fw_ftr_fixup, __stop___fw_ftr_fixup;
diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c
index 1d7f973c647b..c74d5e740922 100644
--- a/arch/powerpc/platforms/pseries/ras.c
+++ b/arch/powerpc/platforms/pseries/ras.c
@@ -458,7 +458,7 @@ static struct rtas_error_log *fwnmi_get_errinfo(struct pt_regs *regs)
*/
static void fwnmi_release_errinfo(void)
{
- int ret = rtas_call(rtas_token("ibm,nmi-interlock"), 0, 1, NULL);
+ int ret = rtas_call(ibm_nmi_interlock_token, 0, 1, NULL);
if (ret != 0)
printk(KERN_ERR "FWNMI: nmi-interlock failed: %d\n", ret);
}
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c
index 0c8421dd01ab..b582198be284 100644
--- a/arch/powerpc/platforms/pseries/setup.c
+++ b/arch/powerpc/platforms/pseries/setup.c
@@ -83,6 +83,7 @@ unsigned long CMO_PageSize = (ASM_CONST(1) << IOMMU_PAGE_SHIFT_4K);
EXPORT_SYMBOL(CMO_PageSize);
int fwnmi_active; /* TRUE if an FWNMI handler is present */
+int ibm_nmi_interlock_token;
static void pSeries_show_cpuinfo(struct seq_file *m)
{
@@ -113,9 +114,14 @@ static void __init fwnmi_init(void)
struct slb_entry *slb_ptr;
size_t size;
#endif
+ int ibm_nmi_register_token;
- int ibm_nmi_register = rtas_token("ibm,nmi-register");
- if (ibm_nmi_register == RTAS_UNKNOWN_SERVICE)
+ ibm_nmi_register_token = rtas_token("ibm,nmi-register");
+ if (ibm_nmi_register_token == RTAS_UNKNOWN_SERVICE)
+ return;
+
+ ibm_nmi_interlock_token = rtas_token("ibm,nmi-interlock");
+ if (WARN_ON(ibm_nmi_interlock_token == RTAS_UNKNOWN_SERVICE))
return;
/* If the kernel's not linked at zero we point the firmware at low
@@ -123,7 +129,8 @@ static void __init fwnmi_init(void)
system_reset_addr = __pa(system_reset_fwnmi) - PHYSICAL_START;
machine_check_addr = __pa(machine_check_fwnmi) - PHYSICAL_START;
- if (0 == rtas_call(ibm_nmi_register, 2, 1, NULL, system_reset_addr,
+ if (0 == rtas_call(ibm_nmi_register_token, 2, 1, NULL,
+ system_reset_addr,
machine_check_addr))
fwnmi_active = 1;
--
2.23.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH v2 06/14] powerpc/pseries/ras: FWNMI_VALID off by one
2020-04-03 13:26 [PATCH v2 00/14] powerpc/64: machine check and system reset fixes Nicholas Piggin
` (4 preceding siblings ...)
2020-04-03 13:26 ` [PATCH v2 05/14] powerpc/pseries/ras: avoid calling rtas_token in NMI paths Nicholas Piggin
@ 2020-04-03 13:26 ` Nicholas Piggin
2020-04-03 14:33 ` Christophe Leroy
2020-04-03 13:26 ` [PATCH v2 07/14] powerpc/pseries/ras: fwnmi avoid modifying r3 in error case Nicholas Piggin
` (7 subsequent siblings)
13 siblings, 1 reply; 26+ messages in thread
From: Nicholas Piggin @ 2020-04-03 13:26 UTC (permalink / raw)
To: linuxppc-dev
Cc: Mahesh Salgaonkar, Ganesh Goudar, Mahesh Salgaonkar, Nicholas Piggin
This was discovered developing qemu fwnmi sreset support. This
off-by-one bug means the last 16 bytes of the rtas area can not
be used for a 16 byte save area.
It's not a serious bug, and QEMU implementation has to retain a
workaround for old kernels, but it's good to tighten it.
Acked-by: Mahesh Salgaonkar <mahesh@linux.ibm.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
arch/powerpc/platforms/pseries/ras.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c
index c74d5e740922..9a37bda47468 100644
--- a/arch/powerpc/platforms/pseries/ras.c
+++ b/arch/powerpc/platforms/pseries/ras.c
@@ -395,10 +395,11 @@ static irqreturn_t ras_error_interrupt(int irq, void *dev_id)
/*
* Some versions of FWNMI place the buffer inside the 4kB page starting at
* 0x7000. Other versions place it inside the rtas buffer. We check both.
+ * Minimum size of the buffer is 16 bytes.
*/
#define VALID_FWNMI_BUFFER(A) \
- ((((A) >= 0x7000) && ((A) < 0x7ff0)) || \
- (((A) >= rtas.base) && ((A) < (rtas.base + rtas.size - 16))))
+ ((((A) >= 0x7000) && ((A) <= 0x8000 - 16)) || \
+ (((A) >= rtas.base) && ((A) <= (rtas.base + rtas.size - 16))))
static inline struct rtas_error_log *fwnmi_get_errlog(void)
{
--
2.23.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH v2 07/14] powerpc/pseries/ras: fwnmi avoid modifying r3 in error case
2020-04-03 13:26 [PATCH v2 00/14] powerpc/64: machine check and system reset fixes Nicholas Piggin
` (5 preceding siblings ...)
2020-04-03 13:26 ` [PATCH v2 06/14] powerpc/pseries/ras: FWNMI_VALID off by one Nicholas Piggin
@ 2020-04-03 13:26 ` Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 08/14] powerpc/pseries/ras: fwnmi sreset should not interlock Nicholas Piggin
` (6 subsequent siblings)
13 siblings, 0 replies; 26+ messages in thread
From: Nicholas Piggin @ 2020-04-03 13:26 UTC (permalink / raw)
To: linuxppc-dev; +Cc: Mahesh Salgaonkar, Ganesh Goudar, Nicholas Piggin
If there is some error with the fwnmi save area, r3 has already been
modified which doesn't help with debugging.
Only update r3 when to restore the saved value.
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
arch/powerpc/platforms/pseries/ras.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c
index 9a37bda47468..a40598e6e525 100644
--- a/arch/powerpc/platforms/pseries/ras.c
+++ b/arch/powerpc/platforms/pseries/ras.c
@@ -423,18 +423,19 @@ static inline struct rtas_error_log *fwnmi_get_errlog(void)
*/
static struct rtas_error_log *fwnmi_get_errinfo(struct pt_regs *regs)
{
+ unsigned long savep_ra;
unsigned long *savep;
struct rtas_error_log *h;
/* Mask top two bits */
- regs->gpr[3] &= ~(0x3UL << 62);
+ savep_ra = regs->gpr[3] & ~(0x3UL << 62);
- if (!VALID_FWNMI_BUFFER(regs->gpr[3])) {
+ if (!VALID_FWNMI_BUFFER(savep_ra)) {
printk(KERN_ERR "FWNMI: corrupt r3 0x%016lx\n", regs->gpr[3]);
return NULL;
}
- savep = __va(regs->gpr[3]);
+ savep = __va(savep_ra);
regs->gpr[3] = be64_to_cpu(savep[0]); /* restore original r3 */
h = (struct rtas_error_log *)&savep[1];
--
2.23.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH v2 08/14] powerpc/pseries/ras: fwnmi sreset should not interlock
2020-04-03 13:26 [PATCH v2 00/14] powerpc/64: machine check and system reset fixes Nicholas Piggin
` (6 preceding siblings ...)
2020-04-03 13:26 ` [PATCH v2 07/14] powerpc/pseries/ras: fwnmi avoid modifying r3 in error case Nicholas Piggin
@ 2020-04-03 13:26 ` Nicholas Piggin
2020-04-03 14:35 ` Christophe Leroy
2020-04-03 13:26 ` [PATCH v2 09/14] powerpc/pseries: limit machine check stack to 4GB Nicholas Piggin
` (5 subsequent siblings)
13 siblings, 1 reply; 26+ messages in thread
From: Nicholas Piggin @ 2020-04-03 13:26 UTC (permalink / raw)
To: linuxppc-dev; +Cc: Mahesh Salgaonkar, Ganesh Goudar, Nicholas Piggin
PAPR does not specify that fwnmi sreset should be interlocked, and
PowerVM (and therefore now QEMU) do not require it.
These "ibm,nmi-interlock" calls are ignored by firmware, but there
is a possibility that the sreset could have interrupted a machine
check and release the machine check's interlock too early, corrupting
it if another machine check came in.
This is an extremely rare case, but it should be fixed for clarity
and reducing the code executed in the sreset path. Firmware also
does not provide error information for the sreset case to look at, so
remove that comment.
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
arch/powerpc/platforms/pseries/ras.c | 48 ++++++++++++++++++++--------
1 file changed, 34 insertions(+), 14 deletions(-)
diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c
index a40598e6e525..833ae34b7fec 100644
--- a/arch/powerpc/platforms/pseries/ras.c
+++ b/arch/powerpc/platforms/pseries/ras.c
@@ -406,6 +406,20 @@ static inline struct rtas_error_log *fwnmi_get_errlog(void)
return (struct rtas_error_log *)local_paca->mce_data_buf;
}
+static unsigned long *fwnmi_get_savep(struct pt_regs *regs)
+{
+ unsigned long savep_ra;
+
+ /* Mask top two bits */
+ savep_ra = regs->gpr[3] & ~(0x3UL << 62);
+ if (!VALID_FWNMI_BUFFER(savep_ra)) {
+ printk(KERN_ERR "FWNMI: corrupt r3 0x%016lx\n", regs->gpr[3]);
+ return NULL;
+ }
+
+ return __va(savep_ra);
+}
+
/*
* Get the error information for errors coming through the
* FWNMI vectors. The pt_regs' r3 will be updated to reflect
@@ -423,20 +437,15 @@ static inline struct rtas_error_log *fwnmi_get_errlog(void)
*/
static struct rtas_error_log *fwnmi_get_errinfo(struct pt_regs *regs)
{
- unsigned long savep_ra;
unsigned long *savep;
struct rtas_error_log *h;
- /* Mask top two bits */
- savep_ra = regs->gpr[3] & ~(0x3UL << 62);
-
- if (!VALID_FWNMI_BUFFER(savep_ra)) {
- printk(KERN_ERR "FWNMI: corrupt r3 0x%016lx\n", regs->gpr[3]);
+ savep = fwnmi_get_savep(regs);
+ if (!savep)
return NULL;
- }
- savep = __va(savep_ra);
- regs->gpr[3] = be64_to_cpu(savep[0]); /* restore original r3 */
+ /* restore original r3 */
+ regs->gpr[3] = be64_to_cpu(savep[0]);
h = (struct rtas_error_log *)&savep[1];
/* Use the per cpu buffer from paca to store rtas error log */
@@ -483,11 +492,22 @@ int pSeries_system_reset_exception(struct pt_regs *regs)
#endif
if (fwnmi_active) {
- struct rtas_error_log *errhdr = fwnmi_get_errinfo(regs);
- if (errhdr) {
- /* XXX Should look at FWNMI information */
- }
- fwnmi_release_errinfo();
+ unsigned long *savep;
+
+ /*
+ * Firmware (PowerVM and KVM) saves r3 to a save area like
+ * machine check, which is not exactly what PAPR (2.9)
+ * suggests but there is no way to detect otherwise, so this
+ * is the interface now.
+ *
+ * System resets do not save any error log or require an
+ * "ibm,nmi-interlock" rtas call to release.
+ */
+
+ savep = fwnmi_get_savep(regs);
+ /* restore original r3 */
+ if (savep)
+ regs->gpr[3] = be64_to_cpu(savep[0]);
}
if (smp_handle_nmi_ipi(regs))
--
2.23.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH v2 09/14] powerpc/pseries: limit machine check stack to 4GB
2020-04-03 13:26 [PATCH v2 00/14] powerpc/64: machine check and system reset fixes Nicholas Piggin
` (7 preceding siblings ...)
2020-04-03 13:26 ` [PATCH v2 08/14] powerpc/pseries/ras: fwnmi sreset should not interlock Nicholas Piggin
@ 2020-04-03 13:26 ` Nicholas Piggin
2020-04-03 14:19 ` Christophe Leroy
2020-04-03 13:26 ` [PATCH v2 10/14] powerpc/pseries: machine check use rtas_call_unlocked with args on stack Nicholas Piggin
` (4 subsequent siblings)
13 siblings, 1 reply; 26+ messages in thread
From: Nicholas Piggin @ 2020-04-03 13:26 UTC (permalink / raw)
To: linuxppc-dev
Cc: Mahesh Salgaonkar, Ganesh Goudar, Mahesh Salgaonkar, Nicholas Piggin
This allows rtas_args to be put on the machine check stack, which
avoids a lot of complications with re-entrancy deadlocks.
Reviewed-by: Mahesh Salgaonkar <mahesh@linux.ibm.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
arch/powerpc/kernel/setup_64.c | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
index e05e6dd67ae6..3a2428aa3d9a 100644
--- a/arch/powerpc/kernel/setup_64.c
+++ b/arch/powerpc/kernel/setup_64.c
@@ -692,6 +692,9 @@ void __init exc_lvl_early_init(void)
void __init emergency_stack_init(void)
{
u64 limit;
+#ifdef CONFIG_PPC_BOOK3S_64
+ u64 mce_limit;
+#endif
unsigned int i;
/*
@@ -710,6 +713,18 @@ void __init emergency_stack_init(void)
*/
limit = min(ppc64_bolted_size(), ppc64_rma_size);
+ /*
+ * Machine check on pseries calls rtas, but can't use the static
+ * rtas_args due to a machine check hitting while the lock is held.
+ * rtas args have to be under 4GB, so the machine check stack is
+ * limited to 4GB so args can be put on stack.
+ */
+#ifdef CONFIG_PPC_BOOK3S_64
+ mce_limit = limit;
+ if (firmware_has_feature(FW_FEATURE_LPAR) && mce_limit > 4UL*1024*1024*1024)
+ mce_limit = 4UL*1024*1024*1024;
+#endif
+
for_each_possible_cpu(i) {
paca_ptrs[i]->emergency_sp = alloc_stack(limit, i) + THREAD_SIZE;
@@ -718,7 +733,7 @@ void __init emergency_stack_init(void)
paca_ptrs[i]->nmi_emergency_sp = alloc_stack(limit, i) + THREAD_SIZE;
/* emergency stack for machine check exception handling. */
- paca_ptrs[i]->mc_emergency_sp = alloc_stack(limit, i) + THREAD_SIZE;
+ paca_ptrs[i]->mc_emergency_sp = alloc_stack(mce_limit, i) + THREAD_SIZE;
#endif
}
}
--
2.23.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH v2 10/14] powerpc/pseries: machine check use rtas_call_unlocked with args on stack
2020-04-03 13:26 [PATCH v2 00/14] powerpc/64: machine check and system reset fixes Nicholas Piggin
` (8 preceding siblings ...)
2020-04-03 13:26 ` [PATCH v2 09/14] powerpc/pseries: limit machine check stack to 4GB Nicholas Piggin
@ 2020-04-03 13:26 ` Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 11/14] powerpc/64s: machine check interrupt update NMI accounting Nicholas Piggin
` (3 subsequent siblings)
13 siblings, 0 replies; 26+ messages in thread
From: Nicholas Piggin @ 2020-04-03 13:26 UTC (permalink / raw)
To: linuxppc-dev; +Cc: Mahesh Salgaonkar, Ganesh Goudar, Nicholas Piggin
With the previous patch, machine checks can use rtas_call_unlocked
which avoids the rtas spinlock which would deadlock if a machine
check hits while making an rtas call.
This also avoids the complex rtas error logging which has more rtas calls
and includes kmalloc (which can return memory beyond RMA, which would
also crash).
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
arch/powerpc/platforms/pseries/ras.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c
index 833ae34b7fec..6938261e4569 100644
--- a/arch/powerpc/platforms/pseries/ras.c
+++ b/arch/powerpc/platforms/pseries/ras.c
@@ -469,7 +469,15 @@ static struct rtas_error_log *fwnmi_get_errinfo(struct pt_regs *regs)
*/
static void fwnmi_release_errinfo(void)
{
- int ret = rtas_call(ibm_nmi_interlock_token, 0, 1, NULL);
+ struct rtas_args rtas_args;
+ int ret;
+
+ /*
+ * On pseries, the machine check stack is limited to under 4GB, so
+ * args can be on-stack.
+ */
+ rtas_call_unlocked(&rtas_args, ibm_nmi_interlock_token, 0, 1, NULL);
+ ret = be32_to_cpu(rtas_args.rets[0]);
if (ret != 0)
printk(KERN_ERR "FWNMI: nmi-interlock failed: %d\n", ret);
}
--
2.23.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH v2 11/14] powerpc/64s: machine check interrupt update NMI accounting
2020-04-03 13:26 [PATCH v2 00/14] powerpc/64: machine check and system reset fixes Nicholas Piggin
` (9 preceding siblings ...)
2020-04-03 13:26 ` [PATCH v2 10/14] powerpc/pseries: machine check use rtas_call_unlocked with args on stack Nicholas Piggin
@ 2020-04-03 13:26 ` Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 12/14] powerpc/64s: machine check do not trace real-mode handler Nicholas Piggin
` (2 subsequent siblings)
13 siblings, 0 replies; 26+ messages in thread
From: Nicholas Piggin @ 2020-04-03 13:26 UTC (permalink / raw)
To: linuxppc-dev; +Cc: Mahesh Salgaonkar, Ganesh Goudar, Nicholas Piggin
machine_check_early is taken as an NMI, so nmi_enter is used there.
machine_check_exception is no longer taken as an NMI (it's invoked
via irq_work in the case a machine check hits in kernel mode), so
remove the nmi_enter from that case.
In NMI context, hash faults don't try to refill the hash table, which
can lead to crashes accessing non-pinned kernel pages. System reset
still has this potential problem.
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
arch/powerpc/kernel/mce.c | 7 +++++++
arch/powerpc/kernel/process.c | 2 +-
arch/powerpc/kernel/traps.c | 13 +------------
3 files changed, 9 insertions(+), 13 deletions(-)
diff --git a/arch/powerpc/kernel/mce.c b/arch/powerpc/kernel/mce.c
index 34c1001e9e8b..c1684be0d8b7 100644
--- a/arch/powerpc/kernel/mce.c
+++ b/arch/powerpc/kernel/mce.c
@@ -560,6 +560,9 @@ EXPORT_SYMBOL_GPL(machine_check_print_event_info);
long machine_check_early(struct pt_regs *regs)
{
long handled = 0;
+ bool nested = in_nmi();
+ if (!nested)
+ nmi_enter();
hv_nmi_check_nonrecoverable(regs);
@@ -568,6 +571,10 @@ long machine_check_early(struct pt_regs *regs)
*/
if (ppc_md.machine_check_early)
handled = ppc_md.machine_check_early(regs);
+
+ if (!nested)
+ nmi_exit();
+
return handled;
}
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
index 1dea4d280f6f..f06d20678611 100644
--- a/arch/powerpc/kernel/process.c
+++ b/arch/powerpc/kernel/process.c
@@ -1421,7 +1421,7 @@ void show_regs(struct pt_regs * regs)
pr_cont("DAR: "REG" DSISR: %08lx ", regs->dar, regs->dsisr);
#endif
#ifdef CONFIG_PPC64
- pr_cont("IRQMASK: %lx ", regs->softe);
+ pr_cont("IRQMASK: %lx IN_NMI:%d IN_MCE:%d", regs->softe, (int)get_paca()->in_nmi, (int)get_paca()->in_mce);
#endif
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
if (MSR_TM_ACTIVE(regs->msr))
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
index 82a3438300fd..1845fd7e161a 100644
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -823,9 +823,6 @@ int machine_check_generic(struct pt_regs *regs)
void machine_check_exception(struct pt_regs *regs)
{
int recover = 0;
- bool nested = in_nmi();
- if (!nested)
- nmi_enter();
__this_cpu_inc(irq_stat.mce_exceptions);
@@ -851,20 +848,12 @@ void machine_check_exception(struct pt_regs *regs)
if (check_io_access(regs))
goto bail;
- if (!nested)
- nmi_exit();
-
die("Machine check", regs, SIGBUS);
+bail:
/* Must die if the interrupt is not recoverable */
if (!(regs->msr & MSR_RI))
nmi_panic(regs, "Unrecoverable Machine check");
-
- return;
-
-bail:
- if (!nested)
- nmi_exit();
}
void SMIException(struct pt_regs *regs)
--
2.23.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH v2 12/14] powerpc/64s: machine check do not trace real-mode handler
2020-04-03 13:26 [PATCH v2 00/14] powerpc/64: machine check and system reset fixes Nicholas Piggin
` (10 preceding siblings ...)
2020-04-03 13:26 ` [PATCH v2 11/14] powerpc/64s: machine check interrupt update NMI accounting Nicholas Piggin
@ 2020-04-03 13:26 ` Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 13/14] powerpc/64s: system reset do not trace Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 14/14] powerpc: make unrecoverable NMIs die instead of panic Nicholas Piggin
13 siblings, 0 replies; 26+ messages in thread
From: Nicholas Piggin @ 2020-04-03 13:26 UTC (permalink / raw)
To: linuxppc-dev
Cc: Mahesh Salgaonkar, Naveen N . Rao, Ganesh Goudar, Nicholas Piggin
Rather than notrace annotations throughout a significant part of the
machine check code across kernel/ pseries/ and powernv/ which can
easily be broken and is infrequently tested, use paca->ftrace_enabled
to blanket-disable tracing of the real-mode non-maskable handler.
Acked-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
arch/powerpc/kernel/mce.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/arch/powerpc/kernel/mce.c b/arch/powerpc/kernel/mce.c
index c1684be0d8b7..36e99adb8710 100644
--- a/arch/powerpc/kernel/mce.c
+++ b/arch/powerpc/kernel/mce.c
@@ -557,10 +557,13 @@ EXPORT_SYMBOL_GPL(machine_check_print_event_info);
*
* regs->nip and regs->msr contains srr0 and ssr1.
*/
-long machine_check_early(struct pt_regs *regs)
+long notrace machine_check_early(struct pt_regs *regs)
{
long handled = 0;
bool nested = in_nmi();
+ u8 ftrace_enabled = local_paca->ftrace_enabled;
+
+ local_paca->ftrace_enabled = 0;
if (!nested)
nmi_enter();
@@ -574,6 +577,7 @@ long machine_check_early(struct pt_regs *regs)
if (!nested)
nmi_exit();
+ local_paca->ftrace_enabled = ftrace_enabled;
return handled;
}
--
2.23.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH v2 13/14] powerpc/64s: system reset do not trace
2020-04-03 13:26 [PATCH v2 00/14] powerpc/64: machine check and system reset fixes Nicholas Piggin
` (11 preceding siblings ...)
2020-04-03 13:26 ` [PATCH v2 12/14] powerpc/64s: machine check do not trace real-mode handler Nicholas Piggin
@ 2020-04-03 13:26 ` Nicholas Piggin
2020-04-03 14:45 ` Christophe Leroy
2020-04-04 21:40 ` kbuild test robot
2020-04-03 13:26 ` [PATCH v2 14/14] powerpc: make unrecoverable NMIs die instead of panic Nicholas Piggin
13 siblings, 2 replies; 26+ messages in thread
From: Nicholas Piggin @ 2020-04-03 13:26 UTC (permalink / raw)
To: linuxppc-dev
Cc: Mahesh Salgaonkar, Naveen N . Rao, Ganesh Goudar, Nicholas Piggin
Similarly to the previous patch, do not trace system reset. This code
is used when there is a crash or hang, and tracing disturbs the system
more and has been known to crash in the crash handling path.
Acked-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
arch/powerpc/kernel/traps.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
index 1845fd7e161a..ed7b7a6e2dc0 100644
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -443,6 +443,9 @@ void system_reset_exception(struct pt_regs *regs)
unsigned long hsrr0, hsrr1;
bool nested = in_nmi();
bool saved_hsrrs = false;
+ u8 ftrace_enabled = local_paca->ftrace_enabled;
+
+ local_paca->ftrace_enabled = 0;
/*
* Avoid crashes in case of nested NMI exceptions. Recoverability
@@ -524,6 +527,8 @@ void system_reset_exception(struct pt_regs *regs)
if (!nested)
nmi_exit();
+ local_paca->ftrace_enabled = ftrace_enabled;
+
/* What should we do here? We could issue a shutdown or hard reset. */
}
--
2.23.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH v2 14/14] powerpc: make unrecoverable NMIs die instead of panic
2020-04-03 13:26 [PATCH v2 00/14] powerpc/64: machine check and system reset fixes Nicholas Piggin
` (12 preceding siblings ...)
2020-04-03 13:26 ` [PATCH v2 13/14] powerpc/64s: system reset do not trace Nicholas Piggin
@ 2020-04-03 13:26 ` Nicholas Piggin
13 siblings, 0 replies; 26+ messages in thread
From: Nicholas Piggin @ 2020-04-03 13:26 UTC (permalink / raw)
To: linuxppc-dev; +Cc: Mahesh Salgaonkar, Ganesh Goudar, Nicholas Piggin
System Reset and Machine Check interrupts that are not recoverable due
to being nested or interrupting when RI=0 currently panic. This is
not necessary, and can often just kill the current context and recover.
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
arch/powerpc/kernel/traps.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
index ed7b7a6e2dc0..1f0277f8d40e 100644
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -513,11 +513,11 @@ void system_reset_exception(struct pt_regs *regs)
#ifdef CONFIG_PPC_BOOK3S_64
BUG_ON(get_paca()->in_nmi == 0);
if (get_paca()->in_nmi > 1)
- nmi_panic(regs, "Unrecoverable nested System Reset");
+ die("Unrecoverable nested System Reset", regs, SIGABRT);
#endif
/* Must die if the interrupt is not recoverable */
if (!(regs->msr & MSR_RI))
- nmi_panic(regs, "Unrecoverable System Reset");
+ die("Unrecoverable System Reset", regs, SIGABRT);
if (saved_hsrrs) {
mtspr(SPRN_HSRR0, hsrr0);
@@ -858,7 +858,7 @@ void machine_check_exception(struct pt_regs *regs)
bail:
/* Must die if the interrupt is not recoverable */
if (!(regs->msr & MSR_RI))
- nmi_panic(regs, "Unrecoverable Machine check");
+ die("Unrecoverable Machine check", regs, SIGBUS);
}
void SMIException(struct pt_regs *regs)
--
2.23.0
^ permalink raw reply related [flat|nested] 26+ messages in thread
* Re: [PATCH v2 09/14] powerpc/pseries: limit machine check stack to 4GB
2020-04-03 13:26 ` [PATCH v2 09/14] powerpc/pseries: limit machine check stack to 4GB Nicholas Piggin
@ 2020-04-03 14:19 ` Christophe Leroy
2020-04-07 4:31 ` Nicholas Piggin
0 siblings, 1 reply; 26+ messages in thread
From: Christophe Leroy @ 2020-04-03 14:19 UTC (permalink / raw)
To: Nicholas Piggin, linuxppc-dev
Cc: Mahesh Salgaonkar, Ganesh Goudar, Mahesh Salgaonkar
Le 03/04/2020 à 15:26, Nicholas Piggin a écrit :
> This allows rtas_args to be put on the machine check stack, which
> avoids a lot of complications with re-entrancy deadlocks.
>
> Reviewed-by: Mahesh Salgaonkar <mahesh@linux.ibm.com>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> ---
> arch/powerpc/kernel/setup_64.c | 17 ++++++++++++++++-
> 1 file changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
> index e05e6dd67ae6..3a2428aa3d9a 100644
> --- a/arch/powerpc/kernel/setup_64.c
> +++ b/arch/powerpc/kernel/setup_64.c
> @@ -692,6 +692,9 @@ void __init exc_lvl_early_init(void)
> void __init emergency_stack_init(void)
> {
> u64 limit;
> +#ifdef CONFIG_PPC_BOOK3S_64
#ifdef not needed, see below
> + u64 mce_limit;
> +#endif
> unsigned int i;
>
> /*
> @@ -710,6 +713,18 @@ void __init emergency_stack_init(void)
> */
> limit = min(ppc64_bolted_size(), ppc64_rma_size);
>
> + /*
> + * Machine check on pseries calls rtas, but can't use the static
> + * rtas_args due to a machine check hitting while the lock is held.
> + * rtas args have to be under 4GB, so the machine check stack is
> + * limited to 4GB so args can be put on stack.
> + */
> +#ifdef CONFIG_PPC_BOOK3S_64
This ifdef is not needed. FW_FEATURE_LPAR is only possible on
CONFIG_PPC_BOOK3S_64 (indeed only on PSERIES or PS3). On others
firmware_has_feature(FW_FEATURE_LPAR) should return 0 at compile time.
> + mce_limit = limit;
> + if (firmware_has_feature(FW_FEATURE_LPAR) && mce_limit > 4UL*1024*1024*1024)
> + mce_limit = 4UL*1024*1024*1024;
You should use SZ_4G instead of hardcoding.
> +#endif
> +
> for_each_possible_cpu(i) {
> paca_ptrs[i]->emergency_sp = alloc_stack(limit, i) + THREAD_SIZE;
>
> @@ -718,7 +733,7 @@ void __init emergency_stack_init(void)
> paca_ptrs[i]->nmi_emergency_sp = alloc_stack(limit, i) + THREAD_SIZE;
>
> /* emergency stack for machine check exception handling. */
> - paca_ptrs[i]->mc_emergency_sp = alloc_stack(limit, i) + THREAD_SIZE;
> + paca_ptrs[i]->mc_emergency_sp = alloc_stack(mce_limit, i) + THREAD_SIZE;
> #endif
> }
> }
>
Christophe
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v2 05/14] powerpc/pseries/ras: avoid calling rtas_token in NMI paths
2020-04-03 13:26 ` [PATCH v2 05/14] powerpc/pseries/ras: avoid calling rtas_token in NMI paths Nicholas Piggin
@ 2020-04-03 14:30 ` Christophe Leroy
2020-04-07 4:35 ` Nicholas Piggin
0 siblings, 1 reply; 26+ messages in thread
From: Christophe Leroy @ 2020-04-03 14:30 UTC (permalink / raw)
To: Nicholas Piggin, linuxppc-dev
Cc: Mahesh Salgaonkar, Ganesh Goudar, Mahesh Salgaonkar
Le 03/04/2020 à 15:26, Nicholas Piggin a écrit :
> In the interest of reducing code and possible failures in the
> machine check and system reset paths, grab the "ibm,nmi-interlock"
> token at init time.
>
> Reviewed-by: Mahesh Salgaonkar <mahesh@linux.ibm.com>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> ---
> arch/powerpc/include/asm/firmware.h | 1 +
> arch/powerpc/platforms/pseries/ras.c | 2 +-
> arch/powerpc/platforms/pseries/setup.c | 13 ++++++++++---
> 3 files changed, 12 insertions(+), 4 deletions(-)
>
> diff --git a/arch/powerpc/include/asm/firmware.h b/arch/powerpc/include/asm/firmware.h
> index ca33f4ef6cb4..6003c2e533a0 100644
> --- a/arch/powerpc/include/asm/firmware.h
> +++ b/arch/powerpc/include/asm/firmware.h
> @@ -128,6 +128,7 @@ extern void machine_check_fwnmi(void);
>
> /* This is true if we are using the firmware NMI handler (typically LPAR) */
> extern int fwnmi_active;
> +extern int ibm_nmi_interlock_token;
>
> extern unsigned int __start___fw_ftr_fixup, __stop___fw_ftr_fixup;
>
> diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c
> index 1d7f973c647b..c74d5e740922 100644
> --- a/arch/powerpc/platforms/pseries/ras.c
> +++ b/arch/powerpc/platforms/pseries/ras.c
> @@ -458,7 +458,7 @@ static struct rtas_error_log *fwnmi_get_errinfo(struct pt_regs *regs)
> */
> static void fwnmi_release_errinfo(void)
> {
> - int ret = rtas_call(rtas_token("ibm,nmi-interlock"), 0, 1, NULL);
> + int ret = rtas_call(ibm_nmi_interlock_token, 0, 1, NULL);
> if (ret != 0)
> printk(KERN_ERR "FWNMI: nmi-interlock failed: %d\n", ret);
> }
> diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c
> index 0c8421dd01ab..b582198be284 100644
> --- a/arch/powerpc/platforms/pseries/setup.c
> +++ b/arch/powerpc/platforms/pseries/setup.c
> @@ -83,6 +83,7 @@ unsigned long CMO_PageSize = (ASM_CONST(1) << IOMMU_PAGE_SHIFT_4K);
> EXPORT_SYMBOL(CMO_PageSize);
>
> int fwnmi_active; /* TRUE if an FWNMI handler is present */
> +int ibm_nmi_interlock_token;
>
> static void pSeries_show_cpuinfo(struct seq_file *m)
> {
> @@ -113,9 +114,14 @@ static void __init fwnmi_init(void)
> struct slb_entry *slb_ptr;
> size_t size;
> #endif
> + int ibm_nmi_register_token;
>
> - int ibm_nmi_register = rtas_token("ibm,nmi-register");
> - if (ibm_nmi_register == RTAS_UNKNOWN_SERVICE)
> + ibm_nmi_register_token = rtas_token("ibm,nmi-register");
> + if (ibm_nmi_register_token == RTAS_UNKNOWN_SERVICE)
> + return;
> +
> + ibm_nmi_interlock_token = rtas_token("ibm,nmi-interlock");
> + if (WARN_ON(ibm_nmi_interlock_token == RTAS_UNKNOWN_SERVICE))
> return;
>
> /* If the kernel's not linked at zero we point the firmware at low
> @@ -123,7 +129,8 @@ static void __init fwnmi_init(void)
> system_reset_addr = __pa(system_reset_fwnmi) - PHYSICAL_START;
> machine_check_addr = __pa(machine_check_fwnmi) - PHYSICAL_START;
>
> - if (0 == rtas_call(ibm_nmi_register, 2, 1, NULL, system_reset_addr,
> + if (0 == rtas_call(ibm_nmi_register_token, 2, 1, NULL,
> + system_reset_addr,
> machine_check_addr))
Alignment is wrong. And you could put system_reset_addr and
machine_check_addr on the same line to limit the number of lines of the if.
> fwnmi_active = 1;
>
>
Christophe
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v2 06/14] powerpc/pseries/ras: FWNMI_VALID off by one
2020-04-03 13:26 ` [PATCH v2 06/14] powerpc/pseries/ras: FWNMI_VALID off by one Nicholas Piggin
@ 2020-04-03 14:33 ` Christophe Leroy
0 siblings, 0 replies; 26+ messages in thread
From: Christophe Leroy @ 2020-04-03 14:33 UTC (permalink / raw)
To: Nicholas Piggin, linuxppc-dev
Cc: Mahesh Salgaonkar, Ganesh Goudar, Mahesh Salgaonkar
Le 03/04/2020 à 15:26, Nicholas Piggin a écrit :
> This was discovered developing qemu fwnmi sreset support. This
> off-by-one bug means the last 16 bytes of the rtas area can not
> be used for a 16 byte save area.
>
> It's not a serious bug, and QEMU implementation has to retain a
> workaround for old kernels, but it's good to tighten it.
>
> Acked-by: Mahesh Salgaonkar <mahesh@linux.ibm.com>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> ---
> arch/powerpc/platforms/pseries/ras.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c
> index c74d5e740922..9a37bda47468 100644
> --- a/arch/powerpc/platforms/pseries/ras.c
> +++ b/arch/powerpc/platforms/pseries/ras.c
> @@ -395,10 +395,11 @@ static irqreturn_t ras_error_interrupt(int irq, void *dev_id)
> /*
> * Some versions of FWNMI place the buffer inside the 4kB page starting at
> * 0x7000. Other versions place it inside the rtas buffer. We check both.
> + * Minimum size of the buffer is 16 bytes.
> */
> #define VALID_FWNMI_BUFFER(A) \
> - ((((A) >= 0x7000) && ((A) < 0x7ff0)) || \
> - (((A) >= rtas.base) && ((A) < (rtas.base + rtas.size - 16))))
> + ((((A) >= 0x7000) && ((A) <= 0x8000 - 16)) || \
> + (((A) >= rtas.base) && ((A) <= (rtas.base + rtas.size - 16))))
Why not just change < to <= and leave the 0x7ff0 ?
>
> static inline struct rtas_error_log *fwnmi_get_errlog(void)
> {
>
Christophe
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v2 08/14] powerpc/pseries/ras: fwnmi sreset should not interlock
2020-04-03 13:26 ` [PATCH v2 08/14] powerpc/pseries/ras: fwnmi sreset should not interlock Nicholas Piggin
@ 2020-04-03 14:35 ` Christophe Leroy
2020-04-07 4:26 ` Nicholas Piggin
0 siblings, 1 reply; 26+ messages in thread
From: Christophe Leroy @ 2020-04-03 14:35 UTC (permalink / raw)
To: Nicholas Piggin, linuxppc-dev; +Cc: Mahesh Salgaonkar, Ganesh Goudar
Le 03/04/2020 à 15:26, Nicholas Piggin a écrit :
> PAPR does not specify that fwnmi sreset should be interlocked, and
> PowerVM (and therefore now QEMU) do not require it.
>
> These "ibm,nmi-interlock" calls are ignored by firmware, but there
> is a possibility that the sreset could have interrupted a machine
> check and release the machine check's interlock too early, corrupting
> it if another machine check came in.
>
> This is an extremely rare case, but it should be fixed for clarity
> and reducing the code executed in the sreset path. Firmware also
> does not provide error information for the sreset case to look at, so
> remove that comment.
>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> ---
> arch/powerpc/platforms/pseries/ras.c | 48 ++++++++++++++++++++--------
> 1 file changed, 34 insertions(+), 14 deletions(-)
>
> diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c
> index a40598e6e525..833ae34b7fec 100644
> --- a/arch/powerpc/platforms/pseries/ras.c
> +++ b/arch/powerpc/platforms/pseries/ras.c
> @@ -406,6 +406,20 @@ static inline struct rtas_error_log *fwnmi_get_errlog(void)
> return (struct rtas_error_log *)local_paca->mce_data_buf;
> }
>
> +static unsigned long *fwnmi_get_savep(struct pt_regs *regs)
> +{
> + unsigned long savep_ra;
> +
> + /* Mask top two bits */
> + savep_ra = regs->gpr[3] & ~(0x3UL << 62);
> + if (!VALID_FWNMI_BUFFER(savep_ra)) {
> + printk(KERN_ERR "FWNMI: corrupt r3 0x%016lx\n", regs->gpr[3]);
Can't you use pr_err() instead ?
> + return NULL;
> + }
> +
> + return __va(savep_ra);
> +}
> +
> /*
> * Get the error information for errors coming through the
> * FWNMI vectors. The pt_regs' r3 will be updated to reflect
> @@ -423,20 +437,15 @@ static inline struct rtas_error_log *fwnmi_get_errlog(void)
> */
> static struct rtas_error_log *fwnmi_get_errinfo(struct pt_regs *regs)
> {
> - unsigned long savep_ra;
> unsigned long *savep;
> struct rtas_error_log *h;
>
> - /* Mask top two bits */
> - savep_ra = regs->gpr[3] & ~(0x3UL << 62);
> -
> - if (!VALID_FWNMI_BUFFER(savep_ra)) {
> - printk(KERN_ERR "FWNMI: corrupt r3 0x%016lx\n", regs->gpr[3]);
> + savep = fwnmi_get_savep(regs);
> + if (!savep)
> return NULL;
> - }
>
> - savep = __va(savep_ra);
> - regs->gpr[3] = be64_to_cpu(savep[0]); /* restore original r3 */
> + /* restore original r3 */
> + regs->gpr[3] = be64_to_cpu(savep[0]);
Is it needed to change the location of the comment ?
>
> h = (struct rtas_error_log *)&savep[1];
> /* Use the per cpu buffer from paca to store rtas error log */
> @@ -483,11 +492,22 @@ int pSeries_system_reset_exception(struct pt_regs *regs)
> #endif
>
> if (fwnmi_active) {
> - struct rtas_error_log *errhdr = fwnmi_get_errinfo(regs);
> - if (errhdr) {
> - /* XXX Should look at FWNMI information */
> - }
> - fwnmi_release_errinfo();
> + unsigned long *savep;
> +
> + /*
> + * Firmware (PowerVM and KVM) saves r3 to a save area like
> + * machine check, which is not exactly what PAPR (2.9)
> + * suggests but there is no way to detect otherwise, so this
> + * is the interface now.
> + *
> + * System resets do not save any error log or require an
> + * "ibm,nmi-interlock" rtas call to release.
> + */
> +
> + savep = fwnmi_get_savep(regs);
> + /* restore original r3 */
> + if (savep)
> + regs->gpr[3] = be64_to_cpu(savep[0]);
> }
>
> if (smp_handle_nmi_ipi(regs))
>
Christophe
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v2 13/14] powerpc/64s: system reset do not trace
2020-04-03 13:26 ` [PATCH v2 13/14] powerpc/64s: system reset do not trace Nicholas Piggin
@ 2020-04-03 14:45 ` Christophe Leroy
2020-04-07 4:30 ` Nicholas Piggin
2020-04-04 21:40 ` kbuild test robot
1 sibling, 1 reply; 26+ messages in thread
From: Christophe Leroy @ 2020-04-03 14:45 UTC (permalink / raw)
To: Nicholas Piggin, linuxppc-dev
Cc: Mahesh Salgaonkar, Naveen N . Rao, Ganesh Goudar
Le 03/04/2020 à 15:26, Nicholas Piggin a écrit :
> Similarly to the previous patch, do not trace system reset. This code
> is used when there is a crash or hang, and tracing disturbs the system
> more and has been known to crash in the crash handling path.
>
> Acked-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> ---
> arch/powerpc/kernel/traps.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
> index 1845fd7e161a..ed7b7a6e2dc0 100644
> --- a/arch/powerpc/kernel/traps.c
> +++ b/arch/powerpc/kernel/traps.c
> @@ -443,6 +443,9 @@ void system_reset_exception(struct pt_regs *regs)
> unsigned long hsrr0, hsrr1;
> bool nested = in_nmi();
> bool saved_hsrrs = false;
> + u8 ftrace_enabled = local_paca->ftrace_enabled;
> +
> + local_paca->ftrace_enabled = 0;
I predict a build failure here in the near future ...
See
https://elixir.bootlin.com/linux/v5.6/source/arch/powerpc/kernel/head_8xx.S#L125
>
> /*
> * Avoid crashes in case of nested NMI exceptions. Recoverability
> @@ -524,6 +527,8 @@ void system_reset_exception(struct pt_regs *regs)
> if (!nested)
> nmi_exit();
>
> + local_paca->ftrace_enabled = ftrace_enabled;
> +
> /* What should we do here? We could issue a shutdown or hard reset. */
> }
>
>
Christophe
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v2 13/14] powerpc/64s: system reset do not trace
2020-04-03 13:26 ` [PATCH v2 13/14] powerpc/64s: system reset do not trace Nicholas Piggin
@ 2020-04-04 21:40 ` kbuild test robot
2020-04-04 21:40 ` kbuild test robot
1 sibling, 0 replies; 26+ messages in thread
From: kbuild test robot @ 2020-04-04 21:40 UTC (permalink / raw)
To: Nicholas Piggin; +Cc: linuxppc-dev, kbuild-all
[-- Attachment #1: Type: text/plain, Size: 4689 bytes --]
Hi Nicholas,
I love your patch! Yet something to improve:
[auto build test ERROR on powerpc/next]
[also build test ERROR on next-20200404]
[cannot apply to v5.6]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]
url: https://github.com/0day-ci/linux/commits/Nicholas-Piggin/powerpc-64-machine-check-and-system-reset-fixes/20200405-030723
base: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next
config: powerpc-allnoconfig (attached as .config)
compiler: powerpc-linux-gcc (GCC) 9.3.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
GCC_VERSION=9.3.0 make.cross ARCH=powerpc
If you fix the issue, kindly add following tag as appropriate
Reported-by: kbuild test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
arch/powerpc/kernel/traps.c: In function 'system_reset_exception':
>> arch/powerpc/kernel/traps.c:446:22: error: 'local_paca' undeclared (first use in this function); did you mean 'local_dec'?
446 | u8 ftrace_enabled = local_paca->ftrace_enabled;
| ^~~~~~~~~~
| local_dec
arch/powerpc/kernel/traps.c:446:22: note: each undeclared identifier is reported only once for each function it appears in
vim +446 arch/powerpc/kernel/traps.c
440
441 void system_reset_exception(struct pt_regs *regs)
442 {
443 unsigned long hsrr0, hsrr1;
444 bool nested = in_nmi();
445 bool saved_hsrrs = false;
> 446 u8 ftrace_enabled = local_paca->ftrace_enabled;
447
448 local_paca->ftrace_enabled = 0;
449
450 /*
451 * Avoid crashes in case of nested NMI exceptions. Recoverability
452 * is determined by RI and in_nmi
453 */
454 if (!nested)
455 nmi_enter();
456
457 /*
458 * System reset can interrupt code where HSRRs are live and MSR[RI]=1.
459 * The system reset interrupt itself may clobber HSRRs (e.g., to call
460 * OPAL), so save them here and restore them before returning.
461 *
462 * Machine checks don't need to save HSRRs, as the real mode handler
463 * is careful to avoid them, and the regular handler is not delivered
464 * as an NMI.
465 */
466 if (cpu_has_feature(CPU_FTR_HVMODE)) {
467 hsrr0 = mfspr(SPRN_HSRR0);
468 hsrr1 = mfspr(SPRN_HSRR1);
469 saved_hsrrs = true;
470 }
471
472 hv_nmi_check_nonrecoverable(regs);
473
474 __this_cpu_inc(irq_stat.sreset_irqs);
475
476 /* See if any machine dependent calls */
477 if (ppc_md.system_reset_exception) {
478 if (ppc_md.system_reset_exception(regs))
479 goto out;
480 }
481
482 if (debugger(regs))
483 goto out;
484
485 kmsg_dump(KMSG_DUMP_OOPS);
486 /*
487 * A system reset is a request to dump, so we always send
488 * it through the crashdump code (if fadump or kdump are
489 * registered).
490 */
491 crash_fadump(regs, "System Reset");
492
493 crash_kexec(regs);
494
495 /*
496 * We aren't the primary crash CPU. We need to send it
497 * to a holding pattern to avoid it ending up in the panic
498 * code.
499 */
500 crash_kexec_secondary(regs);
501
502 /*
503 * No debugger or crash dump registered, print logs then
504 * panic.
505 */
506 die("System Reset", regs, SIGABRT);
507
508 mdelay(2*MSEC_PER_SEC); /* Wait a little while for others to print */
509 add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
510 nmi_panic(regs, "System Reset");
511
512 out:
513 #ifdef CONFIG_PPC_BOOK3S_64
514 BUG_ON(get_paca()->in_nmi == 0);
515 if (get_paca()->in_nmi > 1)
516 nmi_panic(regs, "Unrecoverable nested System Reset");
517 #endif
518 /* Must die if the interrupt is not recoverable */
519 if (!(regs->msr & MSR_RI))
520 nmi_panic(regs, "Unrecoverable System Reset");
521
522 if (saved_hsrrs) {
523 mtspr(SPRN_HSRR0, hsrr0);
524 mtspr(SPRN_HSRR1, hsrr1);
525 }
526
527 if (!nested)
528 nmi_exit();
529
530 local_paca->ftrace_enabled = ftrace_enabled;
531
532 /* What should we do here? We could issue a shutdown or hard reset. */
533 }
534
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 6413 bytes --]
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v2 13/14] powerpc/64s: system reset do not trace
@ 2020-04-04 21:40 ` kbuild test robot
0 siblings, 0 replies; 26+ messages in thread
From: kbuild test robot @ 2020-04-04 21:40 UTC (permalink / raw)
To: kbuild-all
[-- Attachment #1: Type: text/plain, Size: 4825 bytes --]
Hi Nicholas,
I love your patch! Yet something to improve:
[auto build test ERROR on powerpc/next]
[also build test ERROR on next-20200404]
[cannot apply to v5.6]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]
url: https://github.com/0day-ci/linux/commits/Nicholas-Piggin/powerpc-64-machine-check-and-system-reset-fixes/20200405-030723
base: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next
config: powerpc-allnoconfig (attached as .config)
compiler: powerpc-linux-gcc (GCC) 9.3.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
GCC_VERSION=9.3.0 make.cross ARCH=powerpc
If you fix the issue, kindly add following tag as appropriate
Reported-by: kbuild test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
arch/powerpc/kernel/traps.c: In function 'system_reset_exception':
>> arch/powerpc/kernel/traps.c:446:22: error: 'local_paca' undeclared (first use in this function); did you mean 'local_dec'?
446 | u8 ftrace_enabled = local_paca->ftrace_enabled;
| ^~~~~~~~~~
| local_dec
arch/powerpc/kernel/traps.c:446:22: note: each undeclared identifier is reported only once for each function it appears in
vim +446 arch/powerpc/kernel/traps.c
440
441 void system_reset_exception(struct pt_regs *regs)
442 {
443 unsigned long hsrr0, hsrr1;
444 bool nested = in_nmi();
445 bool saved_hsrrs = false;
> 446 u8 ftrace_enabled = local_paca->ftrace_enabled;
447
448 local_paca->ftrace_enabled = 0;
449
450 /*
451 * Avoid crashes in case of nested NMI exceptions. Recoverability
452 * is determined by RI and in_nmi
453 */
454 if (!nested)
455 nmi_enter();
456
457 /*
458 * System reset can interrupt code where HSRRs are live and MSR[RI]=1.
459 * The system reset interrupt itself may clobber HSRRs (e.g., to call
460 * OPAL), so save them here and restore them before returning.
461 *
462 * Machine checks don't need to save HSRRs, as the real mode handler
463 * is careful to avoid them, and the regular handler is not delivered
464 * as an NMI.
465 */
466 if (cpu_has_feature(CPU_FTR_HVMODE)) {
467 hsrr0 = mfspr(SPRN_HSRR0);
468 hsrr1 = mfspr(SPRN_HSRR1);
469 saved_hsrrs = true;
470 }
471
472 hv_nmi_check_nonrecoverable(regs);
473
474 __this_cpu_inc(irq_stat.sreset_irqs);
475
476 /* See if any machine dependent calls */
477 if (ppc_md.system_reset_exception) {
478 if (ppc_md.system_reset_exception(regs))
479 goto out;
480 }
481
482 if (debugger(regs))
483 goto out;
484
485 kmsg_dump(KMSG_DUMP_OOPS);
486 /*
487 * A system reset is a request to dump, so we always send
488 * it through the crashdump code (if fadump or kdump are
489 * registered).
490 */
491 crash_fadump(regs, "System Reset");
492
493 crash_kexec(regs);
494
495 /*
496 * We aren't the primary crash CPU. We need to send it
497 * to a holding pattern to avoid it ending up in the panic
498 * code.
499 */
500 crash_kexec_secondary(regs);
501
502 /*
503 * No debugger or crash dump registered, print logs then
504 * panic.
505 */
506 die("System Reset", regs, SIGABRT);
507
508 mdelay(2*MSEC_PER_SEC); /* Wait a little while for others to print */
509 add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
510 nmi_panic(regs, "System Reset");
511
512 out:
513 #ifdef CONFIG_PPC_BOOK3S_64
514 BUG_ON(get_paca()->in_nmi == 0);
515 if (get_paca()->in_nmi > 1)
516 nmi_panic(regs, "Unrecoverable nested System Reset");
517 #endif
518 /* Must die if the interrupt is not recoverable */
519 if (!(regs->msr & MSR_RI))
520 nmi_panic(regs, "Unrecoverable System Reset");
521
522 if (saved_hsrrs) {
523 mtspr(SPRN_HSRR0, hsrr0);
524 mtspr(SPRN_HSRR1, hsrr1);
525 }
526
527 if (!nested)
528 nmi_exit();
529
530 local_paca->ftrace_enabled = ftrace_enabled;
531
532 /* What should we do here? We could issue a shutdown or hard reset. */
533 }
534
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 6413 bytes --]
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v2 08/14] powerpc/pseries/ras: fwnmi sreset should not interlock
2020-04-03 14:35 ` Christophe Leroy
@ 2020-04-07 4:26 ` Nicholas Piggin
0 siblings, 0 replies; 26+ messages in thread
From: Nicholas Piggin @ 2020-04-07 4:26 UTC (permalink / raw)
To: Christophe Leroy, linuxppc-dev; +Cc: Mahesh Salgaonkar, Ganesh Goudar
Christophe Leroy's on April 4, 2020 12:35 am:
>
>
> Le 03/04/2020 à 15:26, Nicholas Piggin a écrit :
>> PAPR does not specify that fwnmi sreset should be interlocked, and
>> PowerVM (and therefore now QEMU) do not require it.
>>
>> These "ibm,nmi-interlock" calls are ignored by firmware, but there
>> is a possibility that the sreset could have interrupted a machine
>> check and release the machine check's interlock too early, corrupting
>> it if another machine check came in.
>>
>> This is an extremely rare case, but it should be fixed for clarity
>> and reducing the code executed in the sreset path. Firmware also
>> does not provide error information for the sreset case to look at, so
>> remove that comment.
>>
>> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
>> ---
>> arch/powerpc/platforms/pseries/ras.c | 48 ++++++++++++++++++++--------
>> 1 file changed, 34 insertions(+), 14 deletions(-)
>>
>> diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c
>> index a40598e6e525..833ae34b7fec 100644
>> --- a/arch/powerpc/platforms/pseries/ras.c
>> +++ b/arch/powerpc/platforms/pseries/ras.c
>> @@ -406,6 +406,20 @@ static inline struct rtas_error_log *fwnmi_get_errlog(void)
>> return (struct rtas_error_log *)local_paca->mce_data_buf;
>> }
>>
>> +static unsigned long *fwnmi_get_savep(struct pt_regs *regs)
>> +{
>> + unsigned long savep_ra;
>> +
>> + /* Mask top two bits */
>> + savep_ra = regs->gpr[3] & ~(0x3UL << 62);
>> + if (!VALID_FWNMI_BUFFER(savep_ra)) {
>> + printk(KERN_ERR "FWNMI: corrupt r3 0x%016lx\n", regs->gpr[3]);
>
> Can't you use pr_err() instead ?
I think so.
>> + return NULL;
>> + }
>> +
>> + return __va(savep_ra);
>> +}
>> +
>> /*
>> * Get the error information for errors coming through the
>> * FWNMI vectors. The pt_regs' r3 will be updated to reflect
>> @@ -423,20 +437,15 @@ static inline struct rtas_error_log *fwnmi_get_errlog(void)
>> */
>> static struct rtas_error_log *fwnmi_get_errinfo(struct pt_regs *regs)
>> {
>> - unsigned long savep_ra;
>> unsigned long *savep;
>> struct rtas_error_log *h;
>>
>> - /* Mask top two bits */
>> - savep_ra = regs->gpr[3] & ~(0x3UL << 62);
>> -
>> - if (!VALID_FWNMI_BUFFER(savep_ra)) {
>> - printk(KERN_ERR "FWNMI: corrupt r3 0x%016lx\n", regs->gpr[3]);
>> + savep = fwnmi_get_savep(regs);
>> + if (!savep)
>> return NULL;
>> - }
>>
>> - savep = __va(savep_ra);
>> - regs->gpr[3] = be64_to_cpu(savep[0]); /* restore original r3 */
>> + /* restore original r3 */
>> + regs->gpr[3] = be64_to_cpu(savep[0]);
>
> Is it needed to change the location of the comment ?
No, I originally had other changes I think. Will fix.
Thanks,
Nick
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v2 13/14] powerpc/64s: system reset do not trace
2020-04-03 14:45 ` Christophe Leroy
@ 2020-04-07 4:30 ` Nicholas Piggin
0 siblings, 0 replies; 26+ messages in thread
From: Nicholas Piggin @ 2020-04-07 4:30 UTC (permalink / raw)
To: Christophe Leroy, linuxppc-dev
Cc: Mahesh Salgaonkar, Naveen N . Rao, Ganesh Goudar
Christophe Leroy's on April 4, 2020 12:45 am:
>
>
> Le 03/04/2020 à 15:26, Nicholas Piggin a écrit :
>> Similarly to the previous patch, do not trace system reset. This code
>> is used when there is a crash or hang, and tracing disturbs the system
>> more and has been known to crash in the crash handling path.
>>
>> Acked-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
>> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
>> ---
>> arch/powerpc/kernel/traps.c | 5 +++++
>> 1 file changed, 5 insertions(+)
>>
>> diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
>> index 1845fd7e161a..ed7b7a6e2dc0 100644
>> --- a/arch/powerpc/kernel/traps.c
>> +++ b/arch/powerpc/kernel/traps.c
>> @@ -443,6 +443,9 @@ void system_reset_exception(struct pt_regs *regs)
>> unsigned long hsrr0, hsrr1;
>> bool nested = in_nmi();
>> bool saved_hsrrs = false;
>> + u8 ftrace_enabled = local_paca->ftrace_enabled;
>> +
>> + local_paca->ftrace_enabled = 0;
>
> I predict a build failure here in the near future ...
Will fix. Naveen suggested some helper functions for this too.
Thanks,
Nick
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v2 09/14] powerpc/pseries: limit machine check stack to 4GB
2020-04-03 14:19 ` Christophe Leroy
@ 2020-04-07 4:31 ` Nicholas Piggin
0 siblings, 0 replies; 26+ messages in thread
From: Nicholas Piggin @ 2020-04-07 4:31 UTC (permalink / raw)
To: Christophe Leroy, linuxppc-dev
Cc: Mahesh Salgaonkar, Ganesh Goudar, Mahesh Salgaonkar
Christophe Leroy's on April 4, 2020 12:19 am:
>
>
> Le 03/04/2020 à 15:26, Nicholas Piggin a écrit :
>> This allows rtas_args to be put on the machine check stack, which
>> avoids a lot of complications with re-entrancy deadlocks.
>>
>> Reviewed-by: Mahesh Salgaonkar <mahesh@linux.ibm.com>
>> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
>> ---
>> arch/powerpc/kernel/setup_64.c | 17 ++++++++++++++++-
>> 1 file changed, 16 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
>> index e05e6dd67ae6..3a2428aa3d9a 100644
>> --- a/arch/powerpc/kernel/setup_64.c
>> +++ b/arch/powerpc/kernel/setup_64.c
>> @@ -692,6 +692,9 @@ void __init exc_lvl_early_init(void)
>> void __init emergency_stack_init(void)
>> {
>> u64 limit;
>> +#ifdef CONFIG_PPC_BOOK3S_64
>
> #ifdef not needed, see below
>
>> + u64 mce_limit;
>> +#endif
>> unsigned int i;
>>
>> /*
>> @@ -710,6 +713,18 @@ void __init emergency_stack_init(void)
>> */
>> limit = min(ppc64_bolted_size(), ppc64_rma_size);
>>
>> + /*
>> + * Machine check on pseries calls rtas, but can't use the static
>> + * rtas_args due to a machine check hitting while the lock is held.
>> + * rtas args have to be under 4GB, so the machine check stack is
>> + * limited to 4GB so args can be put on stack.
>> + */
>> +#ifdef CONFIG_PPC_BOOK3S_64
>
> This ifdef is not needed. FW_FEATURE_LPAR is only possible on
> CONFIG_PPC_BOOK3S_64 (indeed only on PSERIES or PS3). On others
> firmware_has_feature(FW_FEATURE_LPAR) should return 0 at compile time.
Sure I'll remove it.
>> + mce_limit = limit;
>> + if (firmware_has_feature(FW_FEATURE_LPAR) && mce_limit > 4UL*1024*1024*1024)
>> + mce_limit = 4UL*1024*1024*1024;
>
> You should use SZ_4G instead of hardcoding.
Will do.
Thanks,
Nick
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v2 05/14] powerpc/pseries/ras: avoid calling rtas_token in NMI paths
2020-04-03 14:30 ` Christophe Leroy
@ 2020-04-07 4:35 ` Nicholas Piggin
0 siblings, 0 replies; 26+ messages in thread
From: Nicholas Piggin @ 2020-04-07 4:35 UTC (permalink / raw)
To: Christophe Leroy, linuxppc-dev
Cc: Mahesh Salgaonkar, Ganesh Goudar, Mahesh Salgaonkar
Christophe Leroy's on April 4, 2020 12:30 am:
>
>
> Le 03/04/2020 à 15:26, Nicholas Piggin a écrit :
>> In the interest of reducing code and possible failures in the
>> machine check and system reset paths, grab the "ibm,nmi-interlock"
>> token at init time.
>>
>> Reviewed-by: Mahesh Salgaonkar <mahesh@linux.ibm.com>
>> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
>> ---
>> arch/powerpc/include/asm/firmware.h | 1 +
>> arch/powerpc/platforms/pseries/ras.c | 2 +-
>> arch/powerpc/platforms/pseries/setup.c | 13 ++++++++++---
>> 3 files changed, 12 insertions(+), 4 deletions(-)
>>
>> diff --git a/arch/powerpc/include/asm/firmware.h b/arch/powerpc/include/asm/firmware.h
>> index ca33f4ef6cb4..6003c2e533a0 100644
>> --- a/arch/powerpc/include/asm/firmware.h
>> +++ b/arch/powerpc/include/asm/firmware.h
>> @@ -128,6 +128,7 @@ extern void machine_check_fwnmi(void);
>>
>> /* This is true if we are using the firmware NMI handler (typically LPAR) */
>> extern int fwnmi_active;
>> +extern int ibm_nmi_interlock_token;
>>
>> extern unsigned int __start___fw_ftr_fixup, __stop___fw_ftr_fixup;
>>
>> diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c
>> index 1d7f973c647b..c74d5e740922 100644
>> --- a/arch/powerpc/platforms/pseries/ras.c
>> +++ b/arch/powerpc/platforms/pseries/ras.c
>> @@ -458,7 +458,7 @@ static struct rtas_error_log *fwnmi_get_errinfo(struct pt_regs *regs)
>> */
>> static void fwnmi_release_errinfo(void)
>> {
>> - int ret = rtas_call(rtas_token("ibm,nmi-interlock"), 0, 1, NULL);
>> + int ret = rtas_call(ibm_nmi_interlock_token, 0, 1, NULL);
>> if (ret != 0)
>> printk(KERN_ERR "FWNMI: nmi-interlock failed: %d\n", ret);
>> }
>> diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c
>> index 0c8421dd01ab..b582198be284 100644
>> --- a/arch/powerpc/platforms/pseries/setup.c
>> +++ b/arch/powerpc/platforms/pseries/setup.c
>> @@ -83,6 +83,7 @@ unsigned long CMO_PageSize = (ASM_CONST(1) << IOMMU_PAGE_SHIFT_4K);
>> EXPORT_SYMBOL(CMO_PageSize);
>>
>> int fwnmi_active; /* TRUE if an FWNMI handler is present */
>> +int ibm_nmi_interlock_token;
>>
>> static void pSeries_show_cpuinfo(struct seq_file *m)
>> {
>> @@ -113,9 +114,14 @@ static void __init fwnmi_init(void)
>> struct slb_entry *slb_ptr;
>> size_t size;
>> #endif
>> + int ibm_nmi_register_token;
>>
>> - int ibm_nmi_register = rtas_token("ibm,nmi-register");
>> - if (ibm_nmi_register == RTAS_UNKNOWN_SERVICE)
>> + ibm_nmi_register_token = rtas_token("ibm,nmi-register");
>> + if (ibm_nmi_register_token == RTAS_UNKNOWN_SERVICE)
>> + return;
>> +
>> + ibm_nmi_interlock_token = rtas_token("ibm,nmi-interlock");
>> + if (WARN_ON(ibm_nmi_interlock_token == RTAS_UNKNOWN_SERVICE))
>> return;
>>
>> /* If the kernel's not linked at zero we point the firmware at low
>> @@ -123,7 +129,8 @@ static void __init fwnmi_init(void)
>> system_reset_addr = __pa(system_reset_fwnmi) - PHYSICAL_START;
>> machine_check_addr = __pa(machine_check_fwnmi) - PHYSICAL_START;
>>
>> - if (0 == rtas_call(ibm_nmi_register, 2, 1, NULL, system_reset_addr,
>> + if (0 == rtas_call(ibm_nmi_register_token, 2, 1, NULL,
>> + system_reset_addr,
>> machine_check_addr))
>
> Alignment is wrong.
> And you could put system_reset_addr and
> machine_check_addr on the same line to limit the number of lines of the if.
I don't really like using spaces to align but I'll put it on the same
line.
Thanks,
Nick
^ permalink raw reply [flat|nested] 26+ messages in thread
end of thread, other threads:[~2020-04-07 4:38 UTC | newest]
Thread overview: 26+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-03 13:26 [PATCH v2 00/14] powerpc/64: machine check and system reset fixes Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 01/14] powerpc/64s/exception: Fix machine check no-loss idle wakeup Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 02/14] powerpc/64s/exceptions: Fix in_mce accounting in unrecoverable path Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 03/14] powerpc/64s/exceptions: Change irq reconcile for NMIs from reusing _DAR to RESULT Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 04/14] powerpc/64s/exceptions: machine check reconcile irq state Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 05/14] powerpc/pseries/ras: avoid calling rtas_token in NMI paths Nicholas Piggin
2020-04-03 14:30 ` Christophe Leroy
2020-04-07 4:35 ` Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 06/14] powerpc/pseries/ras: FWNMI_VALID off by one Nicholas Piggin
2020-04-03 14:33 ` Christophe Leroy
2020-04-03 13:26 ` [PATCH v2 07/14] powerpc/pseries/ras: fwnmi avoid modifying r3 in error case Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 08/14] powerpc/pseries/ras: fwnmi sreset should not interlock Nicholas Piggin
2020-04-03 14:35 ` Christophe Leroy
2020-04-07 4:26 ` Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 09/14] powerpc/pseries: limit machine check stack to 4GB Nicholas Piggin
2020-04-03 14:19 ` Christophe Leroy
2020-04-07 4:31 ` Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 10/14] powerpc/pseries: machine check use rtas_call_unlocked with args on stack Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 11/14] powerpc/64s: machine check interrupt update NMI accounting Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 12/14] powerpc/64s: machine check do not trace real-mode handler Nicholas Piggin
2020-04-03 13:26 ` [PATCH v2 13/14] powerpc/64s: system reset do not trace Nicholas Piggin
2020-04-03 14:45 ` Christophe Leroy
2020-04-07 4:30 ` Nicholas Piggin
2020-04-04 21:40 ` kbuild test robot
2020-04-04 21:40 ` kbuild test robot
2020-04-03 13:26 ` [PATCH v2 14/14] powerpc: make unrecoverable NMIs die instead of panic Nicholas Piggin
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.