| From: Nicholas Piggin <npiggin@gmail.com> |
| Date: Tue, 10 Apr 2018 21:49:33 +1000 |
| Subject: powerpc/powernv: Fix OPAL NVRAM driver OPAL_BUSY loops |
| |
| commit 3b8070335f751aac9f1526ae2e012e6f5b8b0f21 upstream. |
| |
| The OPAL NVRAM driver does not sleep in case it gets OPAL_BUSY or |
| OPAL_BUSY_EVENT from firmware, which causes large scheduling |
| latencies, and various lockup errors to trigger (again, BMC reboot |
| can cause it). |
| |
| Fix this by converting it to the standard form OPAL_BUSY loop that |
| sleeps. |
| |
| Fixes: 628daa8d5abf ("powerpc/powernv: Add RTC and NVRAM support plus RTAS fallbacks") |
| Depends-on: 34dd25de9fe3 ("powerpc/powernv: define a standard delay for OPAL_BUSY type retry loops") |
| Signed-off-by: Nicholas Piggin <npiggin@gmail.com> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| arch/powerpc/platforms/powernv/opal-nvram.c | 7 ++++++- |
| 1 file changed, 6 insertions(+), 1 deletion(-) |
| |
| --- a/arch/powerpc/platforms/powernv/opal-nvram.c |
| +++ b/arch/powerpc/platforms/powernv/opal-nvram.c |
| @@ -11,6 +11,7 @@ |
| |
| #define DEBUG |
| |
| +#include <linux/delay.h> |
| #include <linux/kernel.h> |
| #include <linux/init.h> |
| #include <linux/of.h> |
| @@ -55,8 +56,12 @@ static ssize_t opal_nvram_write(char *bu |
| |
| while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { |
| rc = opal_write_nvram(__pa(buf), count, off); |
| - if (rc == OPAL_BUSY_EVENT) |
| + if (rc == OPAL_BUSY_EVENT) { |
| + msleep(OPAL_BUSY_DELAY_MS); |
| opal_poll_events(NULL); |
| + } else if (rc == OPAL_BUSY) { |
| + msleep(OPAL_BUSY_DELAY_MS); |
| + } |
| } |
| |
| if (rc) |