The sync_exp_work_done() function needs to fully order the counter-check operation against anything happening after the corresponding grace period. This is a theoretical bug, as all current architectures either provide full ordering for atomic operations on the one hand or implement smp_mb__before_atomic() as smp_mb() on the other. However, a little future-proofing is a good thing, especially given that smp_mb__before_atomic() is only required to provide acquire semantics rather than full ordering. This commit therefore adds smp_mb__after_atomic() after the atomic_long_inc() in sync_exp_work_done().
Reported-by: Dmitry Vyukov <[email protected]> Signed-off-by: Paul E. McKenney <[email protected]> --- kernel/rcu/tree_exp.h | 1 + 1 file changed, 1 insertion(+) diff --git a/kernel/rcu/tree_exp.h b/kernel/rcu/tree_exp.h index a7b639ccd46e..e0cafa5f3269 100644 --- a/kernel/rcu/tree_exp.h +++ b/kernel/rcu/tree_exp.h @@ -247,6 +247,7 @@ static bool sync_exp_work_done(struct rcu_state *rsp, atomic_long_t *stat, /* Ensure test happens before caller kfree(). */ smp_mb__before_atomic(); /* ^^^ */ atomic_long_inc(stat); + smp_mb__after_atomic(); /* ^^^ */ return true; } return false; -- 2.5.2

