|
@@ -1904,11 +1904,11 @@ __call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu),
|
|
* If called from an extended quiescent state, invoke the RCU
|
|
* If called from an extended quiescent state, invoke the RCU
|
|
* core in order to force a re-evaluation of RCU's idleness.
|
|
* core in order to force a re-evaluation of RCU's idleness.
|
|
*/
|
|
*/
|
|
- if (rcu_is_cpu_idle())
|
|
|
|
|
|
+ if (rcu_is_cpu_idle() && cpu_online(smp_processor_id()))
|
|
invoke_rcu_core();
|
|
invoke_rcu_core();
|
|
|
|
|
|
- /* If interrupts were disabled, don't dive into RCU core. */
|
|
|
|
- if (irqs_disabled_flags(flags)) {
|
|
|
|
|
|
+ /* If interrupts were disabled or CPU offline, don't invoke RCU core. */
|
|
|
|
+ if (irqs_disabled_flags(flags) || cpu_is_offline(smp_processor_id())) {
|
|
local_irq_restore(flags);
|
|
local_irq_restore(flags);
|
|
return;
|
|
return;
|
|
}
|
|
}
|