]> git.karo-electronics.de Git - karo-tx-linux.git/commit
rcu: Move propagation of ->completed from rcu_start_gp() to rcu_report_qs_rsp()
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Wed, 24 Aug 2011 23:52:09 +0000 (16:52 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Tue, 13 Sep 2011 15:46:36 +0000 (08:46 -0700)
commitd9788bfdcd61f0ae17ceb9a058e34835e3a12f1f
tree7412db3576209621d49a1d196a40e20d834f63f4
parent1a1ce0ecccea6d8434df0e54f2e7fcbe01a94c4c
rcu: Move propagation of ->completed from rcu_start_gp() to rcu_report_qs_rsp()

It is possible for the CPU that noted the end of the prior grace period
to not need a new one, and therefore to decide to propagate ->completed
throughout the rcu_node tree without starting another grace period.
However, in so doing, it releases the root rcu_node structure's lock,
which can allow some other CPU to start another grace period.  The first
CPU will be propagating ->completed in parallel with the second CPU
initializing the rcu_node tree for the new grace period.  In theory
this is harmless, but in practice we need to keep things simple.

This commit therefore moves the propagation of ->completed to
rcu_report_qs_rsp(), and refrains from marking the old grace period
as having been completed until it has finished doing this.  This
prevents anyone from starting a new grace period concurrently with
marking the old grace period as having been completed.

Of course, the optimization where a CPU needing a new grace period
doesn't bother marking the old one completed is still in effect:
In that case, the marking happens implicitly as part of initializing
the new grace period.

Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
kernel/rcutree.c