mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 04:33:26 +02:00
cpuidle: lib/bug: Disable rcu_is_watching() during WARN/BUG
In order to avoid WARN/BUG from generating nested or even recursive warnings, force rcu_is_watching() true during WARN/lockdep_rcu_suspicious(). Notably things like unwinding the stack can trigger rcu_dereference() warnings, which then triggers more unwinding which then triggers more warnings etc.. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Link: https://lore.kernel.org/r/20230126151323.408156109@infradead.org
This commit is contained in:
committed by
Ingo Molnar
parent
393e2ea30a
commit
5a5d7e9bad
15
lib/bug.c
15
lib/bug.c
@@ -47,6 +47,7 @@
|
||||
#include <linux/sched.h>
|
||||
#include <linux/rculist.h>
|
||||
#include <linux/ftrace.h>
|
||||
#include <linux/context_tracking.h>
|
||||
|
||||
extern struct bug_entry __start___bug_table[], __stop___bug_table[];
|
||||
|
||||
@@ -153,7 +154,7 @@ struct bug_entry *find_bug(unsigned long bugaddr)
|
||||
return module_find_bug(bugaddr);
|
||||
}
|
||||
|
||||
enum bug_trap_type report_bug(unsigned long bugaddr, struct pt_regs *regs)
|
||||
static enum bug_trap_type __report_bug(unsigned long bugaddr, struct pt_regs *regs)
|
||||
{
|
||||
struct bug_entry *bug;
|
||||
const char *file;
|
||||
@@ -209,6 +210,18 @@ enum bug_trap_type report_bug(unsigned long bugaddr, struct pt_regs *regs)
|
||||
return BUG_TRAP_TYPE_BUG;
|
||||
}
|
||||
|
||||
enum bug_trap_type report_bug(unsigned long bugaddr, struct pt_regs *regs)
|
||||
{
|
||||
enum bug_trap_type ret;
|
||||
bool rcu = false;
|
||||
|
||||
rcu = warn_rcu_enter();
|
||||
ret = __report_bug(bugaddr, regs);
|
||||
warn_rcu_exit(rcu);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void clear_once_table(struct bug_entry *start, struct bug_entry *end)
|
||||
{
|
||||
struct bug_entry *bug;
|
||||
|
Reference in New Issue
Block a user