diff --git a/kernel/exit.c b/kernel/exit.c index b60a21b18b16..129005ce76ae 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -797,7 +797,11 @@ void __noreturn do_exit(long code) * leave this task alone and wait for reboot. */ if (unlikely(tsk->flags & PF_EXITING)) { +#ifdef CONFIG_PANIC_ON_RECURSIVE_FAULT + panic("Recursive fault!\n"); +#else pr_alert("Fixing recursive fault but reboot is needed!\n"); +#endif /* * We can do this unlocked here. The futex code uses * this flag just to verify whether the pi state diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 04f0880a5fd1..74506964a517 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -879,6 +879,17 @@ config BOOTPARAM_SOFTLOCKUP_PANIC_VALUE default 0 if !BOOTPARAM_SOFTLOCKUP_PANIC default 1 if BOOTPARAM_SOFTLOCKUP_PANIC +config PANIC_ON_RECURSIVE_FAULT + bool "Panic on recursive faults during task exit" + help + Panic upon the detection of a recursive fault during task exit, + rather than putting the task into an uninterruptible sleep. + This is particularly useful for debugging system hangs in + scenarios where the task experiencing the fault is critical + for system operation, rendering the system inoperable. + + Say N if unsure. + config DETECT_HUNG_TASK bool "Detect Hung Tasks" depends on DEBUG_KERNEL