Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7133e551 authored by Rohit Vaswani's avatar Rohit Vaswani Committed by Prasad Sodagudi
Browse files

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: default avatarRohit Vaswani <rvaswani@codeaurora.org>
Signed-off-by: default avatarPrasad Sodagudi <psodagud@codeaurora.org>
parent 0aa301d0
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -20,6 +20,10 @@
#define WDOG_BITE_ON_PANIC 0
#define WDOG_BITE_ON_PANIC 0
#endif
#endif


#ifdef CONFIG_MSM_WATCHDOG_V2
void msm_trigger_wdog_bite(void);
void msm_trigger_wdog_bite(void);
#else
static inline void msm_trigger_wdog_bite(void) { }
#endif


#endif
#endif
+6 −1
Original line number Original line Diff line number Diff line
@@ -13,6 +13,7 @@
#include <linux/delay.h>
#include <linux/delay.h>
#include <linux/export.h>
#include <linux/export.h>
#include <linux/bug.h>
#include <linux/bug.h>
#include <soc/qcom/watchdog.h>


void __raw_spin_lock_init(raw_spinlock_t *lock, const char *name,
void __raw_spin_lock_init(raw_spinlock_t *lock, const char *name,
			  struct lock_class_key *key)
			  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 ? owner->comm : "<none>",
		owner ? task_pid_nr(owner) : -1,
		owner ? task_pid_nr(owner) : -1,
		lock->owner_cpu);
		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();
	dump_stack();
}
}


+16 −0
Original line number Original line Diff line number Diff line
@@ -960,6 +960,22 @@ config DEBUG_SPINLOCK
	  best used in conjunction with the NMI watchdog so that spinlock
	  best used in conjunction with the NMI watchdog so that spinlock
	  deadlocks are also debuggable.
	  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
config DEBUG_MUTEXES
	bool "Mutex debugging: basic checks"
	bool "Mutex debugging: basic checks"
	depends on DEBUG_KERNEL
	depends on DEBUG_KERNEL