| From: "Guilherme G. Piccoli" <gpiccoli@igalia.com> |
| Subject: firmware: google: test spinlock on panic path to avoid lockups |
| Date: Fri, 9 Sep 2022 17:07:55 -0300 |
| |
| Currently the gsmi driver registers a panic notifier as well as reboot and |
| die notifiers. The callbacks registered are called in atomic and very |
| limited context - for instance, panic disables preemption and local IRQs, |
| also all secondary CPUs (not executing the panic path) are shutdown. |
| |
| With that said, taking a spinlock in this scenario is a dangerous |
| invitation for lockup scenarios. So, fix that by checking if the spinlock |
| is free to acquire in the panic notifier callback - if not, bail-out and |
| avoid a potential hang. |
| |
| Link: https://lkml.kernel.org/r/20220909200755.189679-1-gpiccoli@igalia.com |
| Fixes: 74c5b31c6618 ("driver: Google EFI SMI") |
| Signed-off-by: Guilherme G. Piccoli <gpiccoli@igalia.com> |
| Reviewed-by: Evan Green <evgreen@chromium.org> |
| Cc: Ard Biesheuvel <ardb@kernel.org> |
| Cc: David Gow <davidgow@google.com> |
| Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Cc: Julius Werner <jwerner@chromium.org> |
| Cc: Petr Mladek <pmladek@suse.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| drivers/firmware/google/gsmi.c | 9 +++++++++ |
| 1 file changed, 9 insertions(+) |
| |
| --- a/drivers/firmware/google/gsmi.c~firmware-google-test-spinlock-on-panic-path-to-avoid-lockups |
| +++ a/drivers/firmware/google/gsmi.c |
| @@ -681,6 +681,15 @@ static struct notifier_block gsmi_die_no |
| static int gsmi_panic_callback(struct notifier_block *nb, |
| unsigned long reason, void *arg) |
| { |
| + |
| + /* |
| + * Panic callbacks are executed with all other CPUs stopped, |
| + * so we must not attempt to spin waiting for gsmi_dev.lock |
| + * to be released. |
| + */ |
| + if (spin_is_locked(&gsmi_dev.lock)) |
| + return NOTIFY_DONE; |
| + |
| gsmi_shutdown_reason(GSMI_SHUTDOWN_PANIC); |
| return NOTIFY_DONE; |
| } |
| _ |