|
@@ -2501,8 +2501,13 @@ void __kprobes preempt_count_add(int val)
|
|
DEBUG_LOCKS_WARN_ON((preempt_count() & PREEMPT_MASK) >=
|
|
DEBUG_LOCKS_WARN_ON((preempt_count() & PREEMPT_MASK) >=
|
|
PREEMPT_MASK - 10);
|
|
PREEMPT_MASK - 10);
|
|
#endif
|
|
#endif
|
|
- if (preempt_count() == val)
|
|
|
|
- trace_preempt_off(CALLER_ADDR0, get_parent_ip(CALLER_ADDR1));
|
|
|
|
|
|
+ if (preempt_count() == val) {
|
|
|
|
+ unsigned long ip = get_parent_ip(CALLER_ADDR1);
|
|
|
|
+#ifdef CONFIG_DEBUG_PREEMPT
|
|
|
|
+ current->preempt_disable_ip = ip;
|
|
|
|
+#endif
|
|
|
|
+ trace_preempt_off(CALLER_ADDR0, ip);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(preempt_count_add);
|
|
EXPORT_SYMBOL(preempt_count_add);
|
|
|
|
|
|
@@ -2545,6 +2550,13 @@ static noinline void __schedule_bug(struct task_struct *prev)
|
|
print_modules();
|
|
print_modules();
|
|
if (irqs_disabled())
|
|
if (irqs_disabled())
|
|
print_irqtrace_events(prev);
|
|
print_irqtrace_events(prev);
|
|
|
|
+#ifdef CONFIG_DEBUG_PREEMPT
|
|
|
|
+ if (in_atomic_preempt_off()) {
|
|
|
|
+ pr_err("Preemption disabled at:");
|
|
|
|
+ print_ip_sym(current->preempt_disable_ip);
|
|
|
|
+ pr_cont("\n");
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
dump_stack();
|
|
dump_stack();
|
|
add_taint(TAINT_WARN, LOCKDEP_STILL_OK);
|
|
add_taint(TAINT_WARN, LOCKDEP_STILL_OK);
|
|
}
|
|
}
|
|
@@ -6946,6 +6958,13 @@ void __might_sleep(const char *file, int line, int preempt_offset)
|
|
debug_show_held_locks(current);
|
|
debug_show_held_locks(current);
|
|
if (irqs_disabled())
|
|
if (irqs_disabled())
|
|
print_irqtrace_events(current);
|
|
print_irqtrace_events(current);
|
|
|
|
+#ifdef CONFIG_DEBUG_PREEMPT
|
|
|
|
+ if (!preempt_count_equals(preempt_offset)) {
|
|
|
|
+ pr_err("Preemption disabled at:");
|
|
|
|
+ print_ip_sym(current->preempt_disable_ip);
|
|
|
|
+ pr_cont("\n");
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
dump_stack();
|
|
dump_stack();
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(__might_sleep);
|
|
EXPORT_SYMBOL(__might_sleep);
|