rcu: Make rcu_start_this_gp() check for grace period already started
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Tue, 15 May 2018 18:53:41 +0000 (11:53 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Thu, 12 Jul 2018 22:38:54 +0000 (15:38 -0700)
commit2e3e5e55010105f9d4351f68e15dbc43402a7794
treeaba67c3616182d92c7b2a5867331250234befcce
parent5ca0905f6787e930bc2a626cf1d8f69fab52acef
rcu: Make rcu_start_this_gp() check for grace period already started

In the old days of ->gpnum and ->completed, the code requesting a new
grace period checked to see if that grace period had already started,
bailing early if so.  The new-age ->gp_seq approach instead checks
whether the grace period has already finished.  A compensating change
pushed the requested grace period down to the bottom of the tree, thus
reducing lock contention and even eliminating it in some cases.  But why
not further reduce contention, especially on large systems, by doing both,
especially given that the cost of doing both is extremely small?

This commit therefore adds a new rcu_seq_started() function that checks
whether a specified grace period has already started.  It then uses
this new function in place of rcu_seq_done() in the rcu_start_this_gp()
function's funnel locking code.

Reported-by: Joel Fernandes <joel@joelfernandes.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
kernel/rcu/rcu.h
kernel/rcu/tree.c