Commit-ID: 2f51f9884f6a36b0fe9636d5a1937e5cbd25723b Gitweb: http://git.kernel.org/tip/2f51f9884f6a36b0fe9636d5a1937e5cbd25723b Author: Paul E. McKenney <paulmck@xxxxxxxxxxxxxxxxxx> AuthorDate: Fri, 13 Nov 2009 19:51:39 -0800 Committer: Ingo Molnar <mingo@xxxxxxx> CommitDate: Sat, 14 Nov 2009 10:31:42 +0100 rcu: Eliminate __rcu_pending() false positives Now that there are both ->gpnum and ->completed fields in the rcu_node structure, __rcu_pending() should check rdp->gpnum and rdp->completed against rnp->gpnum and rdp->completed, respectively, instead of the prior comparison against the rcu_state fields rsp->gpnum and rsp->completed. Given the old comparison, __rcu_pending() could return 1, resulting in a needless raise_softirq(RCU_SOFTIRQ). This useless work would happen if RCU responded to a scheduling-clock interrupt after the rcu_state fields had been updated, but before the rcu_node fields had been updated. Changing the comparison from the rcu_state fields to the rcu_node fields prevents this useless work from happening. Signed-off-by: Paul E. McKenney <paulmck@xxxxxxxxxxxxxxxxxx> Cc: laijs@xxxxxxxxxxxxxx Cc: dipankar@xxxxxxxxxx Cc: mathieu.desnoyers@xxxxxxxxxx Cc: josh@xxxxxxxxxxxxxxxx Cc: dvhltc@xxxxxxxxxx Cc: niv@xxxxxxxxxx Cc: peterz@xxxxxxxxxxxxx Cc: rostedt@xxxxxxxxxxx Cc: Valdis.Kletnieks@xxxxxx Cc: dhowells@xxxxxxxxxx LKML-Reference: <12581706991966-git-send-email-> Signed-off-by: Ingo Molnar <mingo@xxxxxxx> --- kernel/rcutree.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/kernel/rcutree.c b/kernel/rcutree.c index 24bbf2c..9b36d6d 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c @@ -1403,6 +1403,8 @@ EXPORT_SYMBOL_GPL(call_rcu_bh); */ static int __rcu_pending(struct rcu_state *rsp, struct rcu_data *rdp) { + struct rcu_node *rnp = rdp->mynode; + rdp->n_rcu_pending++; /* Check for CPU stalls, if enabled. */ @@ -1427,13 +1429,13 @@ static int __rcu_pending(struct rcu_state *rsp, struct rcu_data *rdp) } /* Has another RCU grace period completed? */ - if (ACCESS_ONCE(rsp->completed) != rdp->completed) { /* outside lock */ + if (ACCESS_ONCE(rnp->completed) != rdp->completed) { /* outside lock */ rdp->n_rp_gp_completed++; return 1; } /* Has a new RCU grace period started? */ - if (ACCESS_ONCE(rsp->gpnum) != rdp->gpnum) { /* outside lock */ + if (ACCESS_ONCE(rnp->gpnum) != rdp->gpnum) { /* outside lock */ rdp->n_rp_gp_started++; return 1; } -- To unsubscribe from this list: send the line "unsubscribe linux-tip-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html