[PATCH 1/2] efi/runtime-wrappers: mark efi_rts_park_worker() as __noreturn

Breno Leitao <[email protected]> Mon, 13 Jul 2026 06:06:47 -0700
Newsgroups org.kernel.vger.linux-efi,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
efi_rts_park_worker() loops in schedule() forever and never returns, but
it is not annotated as such. When efi_crash_gracefully_on_page_fault()
calls it, objtool cannot tell the call is a dead end and warns about the
unreachable code that follows it:

  vmlinux.o: warning: objtool: efi_crash_gracefully_on_page_fault+0xc3: efi_rts_park_worker() missing __noreturn in .c/.h or NORETURN() in noreturns.h

Mark both the declaration and the definition __noreturn, and add the
function to objtool's noreturn list.

Fixes: 3e5ba97c181e ("efi/runtime-wrappers: factor out efi_rts_park_worker()")
Reported-by: kernel test robot <[email protected]>
Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
Signed-off-by: Breno Leitao <[email protected]>
---
 drivers/firmware/efi/runtime-wrappers.c | 2 +-
 include/linux/efi.h                     | 2 +-
 tools/objtool/noreturns.h               | 1 +
 3 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/firmware/efi/runtime-wrappers.c b/drivers/firmware/efi/runtime-wrappers.c
index 591a725b10613..6f42da11a9178 100644
--- a/drivers/firmware/efi/runtime-wrappers.c
+++ b/drivers/firmware/efi/runtime-wrappers.c
@@ -224,7 +224,7 @@ extern struct semaphore __efi_uv_runtime_lock __alias(efi_runtime_lock);
  * have been disabled and its efi_rts_work is abandoned. Loop in schedule()
  * so a spurious wakeup cannot resume it.
  */
-void efi_rts_park_worker(void)
+void __noreturn efi_rts_park_worker(void)
 {
 	for (;;) {
 		set_current_state(TASK_IDLE);
diff --git a/include/linux/efi.h b/include/linux/efi.h
index 015505423277e..b3c83516593d1 100644
--- a/include/linux/efi.h
+++ b/include/linux/efi.h
@@ -1256,7 +1256,7 @@ extern struct efi_runtime_work efi_rts_work;
 /* Workqueue to queue EFI Runtime Services */
 extern struct workqueue_struct *efi_rts_wq;
 
-void efi_rts_park_worker(void);
+void __noreturn efi_rts_park_worker(void);
 
 struct linux_efi_memreserve {
 	int		size;			// allocated size of the array
diff --git a/tools/objtool/noreturns.h b/tools/objtool/noreturns.h
index 14f8ab653449c..0e9dfd0a2446c 100644
--- a/tools/objtool/noreturns.h
+++ b/tools/objtool/noreturns.h
@@ -26,6 +26,7 @@ NORETURN(cpu_startup_entry)
 NORETURN(do_exit)
 NORETURN(do_group_exit)
 NORETURN(do_task_dead)
+NORETURN(efi_rts_park_worker)
 NORETURN(ex_handler_msr_mce)
 NORETURN(hlt_play_dead)
 NORETURN(hv_ghcb_terminate)

-- 
2.53.0-Meta