Re: [PATCH] kernel/reboot: Avoid potential deadlocks during suspension

From: Bradley Morgan

Date: Tue Oct 20 2026 - 11:21:01 EST


On 20 October 2026 02:05:59 BST, Edward Adam Davis <eadavis@xxxxxxxx>
wrote:
>Invoking reboot with LINUX_REBOOT_CMD_SW_SUSPEND causes kernel/reboot.c
>to acquire system_transition_mutex and invoke hibernate(). hibernate()
>calls lock_system_sleep(), which sets PF_NOFREEZE on current and attempts
>to acquire system_transition_mutex again, potentially hitting:
>
>WARNING: possible recursive locking detected
>--------------------------------------------
>syz.3.5755/5950 is trying to acquire lock:
>ffffffff8fc04760 (system_transition_mutex){+.+.}-{4:4}, at:
>lock_system_sleep+0x49/0x70 kernel/power/main.c:71
>
>but task is already holding lock:
>ffffffff8fc04760 (system_transition_mutex){+.+.}-{4:4}, at:
>__do_sys_reboot kernel/reboot.c:774 [inline]
>ffffffff8fc04760 (system_transition_mutex){+.+.}-{4:4}, at:
>__se_sys_reboot+0x223/0x460 kernel/reboot.c:738
>
>other info that might help us debug this:
> Possible unsafe locking scenario:
>
> CPU0
> ----
> lock(system_transition_mutex);
> lock(system_transition_mutex);
>
> *** DEADLOCK ***
>
> May be due to missing lock nesting notation
>
>locks held by syz.3.5755/5950: 1, last CPU#0:
> #0: ffffffff8fc04760 (system_transition_mutex){+.+.}-{4:4}, at:
> __do_sys_reboot kernel/reboot.c:774 [inline]
> #0: ffffffff8fc04760 (system_transition_mutex){+.+.}-{4:4}, at:
> __se_sys_reboot+0x223/0x460 kernel/reboot.c:738
>
>Call Trace:
> lock_system_sleep+0x49/0x70 kernel/power/main.c:71
> hibernate+0x162/0x680 kernel/power/hibernate.c:784
> __do_sys_reboot kernel/reboot.c:816 [inline]
>
>Move the suspension operation outside the scope protected by lock
>system_transition_mutex.
>
>Fixes: 55f2503c3b69 ("PM / reboot: Eliminate race between reboot and suspend")
>Reported-by: syzbot+1f0fbc2561b3e5d51b91@xxxxxxxxxxxxxxxxxxxxxxxxx
>Closes: https://syzkaller.appspot.com/bug?extid=1f0fbc2561b3e5d51b91

CC akpm:

>Signed-off-by: Edward Adam Davis <eadavis@xxxxxxxx>
>---
> kernel/reboot.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
>diff --git a/kernel/reboot.c b/kernel/reboot.c
>index 5b9691f45f5f..bc2716677a6c 100644
>--- a/kernel/reboot.c
>+++ b/kernel/reboot.c
>@@ -813,8 +813,8 @@ SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
>
> #ifdef CONFIG_HIBERNATION
> case LINUX_REBOOT_CMD_SW_SUSPEND:
>- ret = hibernate();
>- break;
>+ mutex_unlock(&system_transition_mutex);
>+ return hibernate();

Well, this fixes the issue in hand,

Reviewed-by: Bradley Morgan <brads@xxxxxxxxxxxxxx>


> #endif
>
> default:
>

--- Thanks!
"I'm not a very positive person" - Linus torvalds