author: Thomas Gleixner <tglx@linutronix.de> 2021-09-23 18:54:41 +0200
committer: Minda Chen <minda.chen@starfivetech.com> 2023-11-06 19:24:42 +0800
commit: eae2ac3e9136a15c1a7293b1b529c7c7be9154d9
parent: a154c13db8133bb27b4747cd1d9644d4b541d3bc
Commit Summary:
Diffstat:
1 file changed, 18 insertions, 5 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 641079a153f3..df94ab2f10ea 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -9493,6 +9493,18 @@ void __might_sleep(const char *file, int line)
}
EXPORT_SYMBOL(__might_sleep);
+static void print_preempt_disable_ip(int preempt_offset, unsigned long ip)
+{
+ if (!IS_ENABLED(CONFIG_DEBUG_PREEMPT))
+ return;
+
+ if (preempt_count() == preempt_offset)
+ return;
+
+ pr_err("Preemption disabled at:");
+ print_ip_sym(KERN_ERR, ip);
+}
+
void __might_resched(const char *file, int line, int preempt_offset)
{
/* Ratelimiting timestamp: */
@@ -9521,6 +9533,13 @@ void __might_resched(const char *file, int line, int preempt_offset)
pr_err("in_atomic(): %d, irqs_disabled(): %d, non_block: %d, pid: %d, name: %s\n",
in_atomic(), irqs_disabled(), current->non_block_count,
current->pid, current->comm);
+ pr_err("preempt_count: %x, expected: %x\n", preempt_count(),
+ preempt_offset);
+
+ if (IS_ENABLED(CONFIG_PREEMPT_RCU)) {
+ pr_err("RCU nest depth: %d, expected: 0\n",
+ rcu_preempt_depth());
+ }
if (task_stack_end_corrupted(current))
pr_emerg("Thread overran stack, or stack corrupted\n");
@@ -9528,11 +9547,9 @@ void __might_resched(const char *file, int line, int preempt_offset)
debug_show_held_locks(current);
if (irqs_disabled())
print_irqtrace_events(current);
- if (IS_ENABLED(CONFIG_DEBUG_PREEMPT)
- && !preempt_count_equals(preempt_offset)) {
- pr_err("Preemption disabled at:");
- print_ip_sym(KERN_ERR, preempt_disable_ip);
- }
+
+ print_preempt_disable_ip(preempt_offset, preempt_disable_ip);
+
dump_stack();
add_taint(TAINT_WARN, LOCKDEP_STILL_OK);
}