summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorBreno Leitao <leitao@debian.org>2026-06-16 05:09:35 -0700
committerArd Biesheuvel <ardb@kernel.org>2026-08-20 14:45:04 +0300
commitecbccdbdab5d31e1e465e3f789d57bb34e5452cd (patch)
tree073a19c95934d300d29f09418c624e6425841f47 /drivers
parent718ee46ba4d95d28d50d3f6437afbbe2be531175 (diff)
efi/runtime-wrappers: factor out efi_rts_park_worker()
x86's efi_crash_gracefully_on_page_fault() ends in an infinite schedule() loop so the kworker that faulted in firmware never runs efi_rts_wq again. A later change needs the same "park this worker forever" primitive on the runtime service timeout path, so factor the loop into a shared efi_rts_park_worker() and call it from the x86 page-fault handler. No functional change. Signed-off-by: Breno Leitao <leitao@debian.org> Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/firmware/efi/runtime-wrappers.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/drivers/firmware/efi/runtime-wrappers.c b/drivers/firmware/efi/runtime-wrappers.c
index da8d29621644..dc2e5c370edc 100644
--- a/drivers/firmware/efi/runtime-wrappers.c
+++ b/drivers/firmware/efi/runtime-wrappers.c
@@ -202,7 +202,7 @@ void efi_call_virt_check_flags(unsigned long flags, const void *caller)
*/
static DEFINE_SEMAPHORE(efi_runtime_lock, 1);
-static struct task_struct *efi_runtime_lock_owner;
+static struct task_struct *efi_runtime_lock_owner __used;
/*
* Expose the EFI runtime lock to the UV platform
@@ -212,6 +212,19 @@ extern struct semaphore __efi_uv_runtime_lock __alias(efi_runtime_lock);
#endif
/*
+ * Park a worker that must never run efi_rts_wq again: EFI runtime services
+ * have been disabled and its efi_rts_work is abandoned. Loop in schedule()
+ * so a spurious wakeup cannot resume it.
+ */
+void __noreturn efi_rts_park_worker(void)
+{
+ for (;;) {
+ set_current_state(TASK_IDLE);
+ schedule();
+ }
+}
+
+/*
* Calls the appropriate efi_runtime_service() with the appropriate
* arguments.
*/