summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRohit Vaswani <rvaswani@codeaurora.org>2014-10-02 21:02:56 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-22 11:16:31 -0700
commit77d758e28363b63c9273099fc49b901def518b96 (patch)
tree16172d18bcbab98496fb1ea72a8297231ac2b9cf
parenta54306165324edab925b8284e189f164a834ec93 (diff)
lib: spinlock: Cause a watchdog bite on spin_dump
Currently we cause a BUG_ON once a spin_bug is detected, but that causes a whole lot of processing and the other CPUs would have proceeded to perform other actions and the state of the system is moved by the time we can analyze it. Provide an option to trigger a watchdog bite instead so that we can get the traces as close to the issue as possible. Change-Id: Ic8d692ebd02c6940a3b4e5798463744db20b0026 Signed-off-by: Rohit Vaswani <rvaswani@codeaurora.org> Signed-off-by: Prasad Sodagudi <psodagud@codeaurora.org>
-rw-r--r--include/soc/qcom/watchdog.h4
-rw-r--r--kernel/locking/spinlock_debug.c7
-rw-r--r--lib/Kconfig.debug16
3 files changed, 26 insertions, 1 deletions
diff --git a/include/soc/qcom/watchdog.h b/include/soc/qcom/watchdog.h
index d82858f30a55..5fbf18143bbe 100644
--- a/include/soc/qcom/watchdog.h
+++ b/include/soc/qcom/watchdog.h
@@ -20,6 +20,10 @@
#define WDOG_BITE_ON_PANIC 0
#endif
+#ifdef CONFIG_MSM_WATCHDOG_V2
void msm_trigger_wdog_bite(void);
+#else
+static inline void msm_trigger_wdog_bite(void) { }
+#endif
#endif
diff --git a/kernel/locking/spinlock_debug.c b/kernel/locking/spinlock_debug.c
index 161eb593ea08..e99d8603de14 100644
--- a/kernel/locking/spinlock_debug.c
+++ b/kernel/locking/spinlock_debug.c
@@ -13,6 +13,7 @@
#include <linux/delay.h>
#include <linux/export.h>
#include <linux/bug.h>
+#include <soc/qcom/watchdog.h>
void __raw_spin_lock_init(raw_spinlock_t *lock, const char *name,
struct lock_class_key *key)
@@ -65,7 +66,11 @@ static void spin_dump(raw_spinlock_t *lock, const char *msg)
owner ? owner->comm : "<none>",
owner ? task_pid_nr(owner) : -1,
lock->owner_cpu);
- BUG_ON(PANIC_CORRUPTION);
+#ifdef CONFIG_DEBUG_SPINLOCK_BITE_ON_BUG
+ msm_trigger_wdog_bite();
+#elif defined(CONFIG_DEBUG_SPINLOCK_PANIC_ON_BUG)
+ BUG();
+#endif
dump_stack();
}
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index 810e6c31d130..de4753d2feb2 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -966,6 +966,22 @@ config DEBUG_SPINLOCK
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+config DEBUG_SPINLOCK_BITE_ON_BUG
+ bool "Cause a Watchdog Bite on Spinlock bug"
+ depends on DEBUG_SPINLOCK && !DEBUG_SPINLOCK_PANIC_ON_BUG && MSM_WATCHDOG_V2
+ help
+ On a spinlock bug, cause a watchdog bite so that we can get the precise
+ state of the system captured at the time of spin dump. This is mutually
+ exclusive with the below DEBUG_SPINLOCK_PANIC_ON_BUG config.
+
+config DEBUG_SPINLOCK_PANIC_ON_BUG
+ bool "Cause a Kernel Panic on Spinlock bug"
+ depends on DEBUG_SPINLOCK && !DEBUG_SPINLOCK_BITE_ON_BUG
+ help
+ On a spinlock bug, cause a kernel panic so that we can get the complete
+ information about the system at the time of spin dump in the dmesg.
+ This is mutually exclusive with the above DEBUG_SPINLOCK_BITE_ON_BUG.
+
config DEBUG_MUTEXES
bool "Mutex debugging: basic checks"
depends on DEBUG_KERNEL