Re: [PATCH] rcu_barrier VS cpu_hotplug: make rcu_barrier can be called on CPU_DEAD

Lai Jiangshan
2009-03-08T03:06:34Z

Paul E. McKenney wrote:
> On Sat, Mar 07, 2009 at 06:54:36PM +0800, Lai Jiangshan wrote:
>> cpu hotplug notifier_call for CPU_DEAD are very complex, some notifier_call
>> may call rcu_barrier(), if this notifier_call is called earlier than
>> rcu_cpu_notify(), it is buggy.
>>
>> _cpu_down() -->
>> some_cpu_hotplug_notify() -->
>> case CPU_DEAD: rcu_barrier()
>> rcu_cpu_notify() -->
>> rcu_offline_cpu()
>>
>> When rcu_barrier() is called, rcu_barrier() does not know how to finish
>> his work: rcu callbacks in dead cpu have not been migrated to online cpu,
>> so rcu_barrier() cannot wait for these rcu callbacks, but rcu_barrier()
>> should wait for all queued rcu callbacks.
>
> Hmmm...
>
> What should happen in this case is that rcu_offline_cpu() moves the
> rcu_barrier() callback to a surviving CPU, and then the rcu_barrier()

It's not about the rcu_barrier() callback, It's about rcu callbacks
in dead cpu. rcu_barrier() should also wait for these rcu callbacks
to complete. But these rcu callbacks are not migrated to online cpu,
rcu_barrier() cannot wait for them.

Thanks, Lai.

> should complete just fine at the end of a subsequent grace period.
> In fact, this is why it is so important to keep RCU callbacks ordered
> through CPU-hotplug operations.
>
> Or do you have a test that demonstrates a failure in this case?
> If so, please share!
>