|
@@ -2129,6 +2129,17 @@ static bool __call_rcu_nocb(struct rcu_data *rdp, struct rcu_head *rhp,
|
|
|
trace_rcu_callback(rdp->rsp->name, rhp,
|
|
|
-atomic_long_read(&rdp->nocb_q_count_lazy),
|
|
|
-atomic_long_read(&rdp->nocb_q_count));
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If called from an extended quiescent state with interrupts
|
|
|
+ * disabled, invoke the RCU core in order to allow the idle-entry
|
|
|
+ * deferred-wakeup check to function.
|
|
|
+ */
|
|
|
+ if (irqs_disabled_flags(flags) &&
|
|
|
+ !rcu_is_watching() &&
|
|
|
+ cpu_online(smp_processor_id()))
|
|
|
+ invoke_rcu_core();
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
|