powerpc/pseries: Machine check use rtas_call_unlocked() with args on stack
authorNicholas Piggin <npiggin@gmail.com>
Fri, 8 May 2020 04:34:02 +0000 (14:34 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 18 May 2020 14:10:34 +0000 (00:10 +1000)
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>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20200508043408.886394-11-npiggin@gmail.com
arch/powerpc/platforms/pseries/ras.c

index d20aecc52ecea5fd71a0e2239fe6ba46fc3fe99c..f3736fcd98fcb8de97a514dbf786e195f87a8b40 100644 (file)
@@ -468,7 +468,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);
 }