|
@@ -4170,6 +4170,28 @@ void lockdep_rcu_suspicious(const char *file, const int line, const char *s)
|
|
printk("%s:%d %s!\n", file, line, s);
|
|
printk("%s:%d %s!\n", file, line, s);
|
|
printk("\nother info that might help us debug this:\n\n");
|
|
printk("\nother info that might help us debug this:\n\n");
|
|
printk("\nrcu_scheduler_active = %d, debug_locks = %d\n", rcu_scheduler_active, debug_locks);
|
|
printk("\nrcu_scheduler_active = %d, debug_locks = %d\n", rcu_scheduler_active, debug_locks);
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * If a CPU is in the RCU-free window in idle (ie: in the section
|
|
|
|
+ * between rcu_idle_enter() and rcu_idle_exit(), then RCU
|
|
|
|
+ * considers that CPU to be in an "extended quiescent state",
|
|
|
|
+ * which means that RCU will be completely ignoring that CPU.
|
|
|
|
+ * Therefore, rcu_read_lock() and friends have absolutely no
|
|
|
|
+ * effect on a CPU running in that state. In other words, even if
|
|
|
|
+ * such an RCU-idle CPU has called rcu_read_lock(), RCU might well
|
|
|
|
+ * delete data structures out from under it. RCU really has no
|
|
|
|
+ * choice here: we need to keep an RCU-free window in idle where
|
|
|
|
+ * the CPU may possibly enter into low power mode. This way we can
|
|
|
|
+ * notice an extended quiescent state to other CPUs that started a grace
|
|
|
|
+ * period. Otherwise we would delay any grace period as long as we run
|
|
|
|
+ * in the idle task.
|
|
|
|
+ *
|
|
|
|
+ * So complain bitterly if someone does call rcu_read_lock(),
|
|
|
|
+ * rcu_read_lock_bh() and so on from extended quiescent states.
|
|
|
|
+ */
|
|
|
|
+ if (rcu_is_cpu_idle())
|
|
|
|
+ printk("RCU used illegally from extended quiescent state!\n");
|
|
|
|
+
|
|
lockdep_print_held_locks(curr);
|
|
lockdep_print_held_locks(curr);
|
|
printk("\nstack backtrace:\n");
|
|
printk("\nstack backtrace:\n");
|
|
dump_stack();
|
|
dump_stack();
|