From 6499baf92d1a325e52856ee2e4c378a261df2f65 Mon Sep 17 00:00:00 2001 From: Matt Wagantall Date: Fri, 20 Mar 2015 12:54:57 -0700 Subject: [PATCH] exit: Add PANIC_ON_RECURSIVE_FAULT Kconfig option If a recursive fault is detected during do_exit(), tasks are left to sit and wait in an un-interruptible sleep until the system reboots (typically manually). Add Kconfig option to change this behaviour and force a panic. This is particularly important if a critical system task encounters a recursive fault (ex. a kworker). Otherwise, the system may be unusable, but since the scheduler is still running system watchdogs may continue to be pet. Change-Id: Ifc26fc79d6066f05a3b2c4d27f78bf4f8d2bd640 Signed-off-by: Matt Wagantall --- kernel/exit.c | 4 ++++ lib/Kconfig.debug | 11 +++++++++++ 2 files changed, 15 insertions(+) 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