Re: [PATCH] rcu: exp: Fix "must hold exp_mutex" comments for QS reporting functions

From: Paul E. McKenney
Date: Wed Mar 07 2018 - 10:48:12 EST


On Wed, Mar 07, 2018 at 04:49:39PM +0800, Boqun Feng wrote:
> Since commit d9a3da0699b2 ("rcu: Add expedited grace-period support for
> preemptible RCU"), there are comments for some funtions in
> rcu_report_exp_rnp()'s call-chain saying that exp_mutex or its
> predecessors needs to be held.
>
> However, exp_mutex and its predecessors are merely used for synchronize
> between GPs, and it's clearly that all variables visited by those
> functions are under the protection of rcu_node's ->lock. Moreover, those
> functions are currently called without held exp_mutex, and seems that
> doesn't introduce any trouble.
>
> So this patch fix this problem by correcting the comments
>
> Signed-off-by: Boqun Feng <boqun.feng@xxxxxxxxx>
> Fixes: d9a3da0699b2 ("rcu: Add expedited grace-period support for preemptible RCU")

Good catch, applied!

These have been around for almost a decade! ;-) They happened because
I ended up rewriting expedited support several times before it was
accepted, and apparently failed to update the comments towards the end.

So thank you for catching this one!

But wouldn't it be better to use lockdep instead of comments in this case?

Thanx, Paul

> ---
> kernel/rcu/tree_exp.h | 10 +++-------
> 1 file changed, 3 insertions(+), 7 deletions(-)
>
> diff --git a/kernel/rcu/tree_exp.h b/kernel/rcu/tree_exp.h
> index f8e4571efabf..2fd882b08b7c 100644
> --- a/kernel/rcu/tree_exp.h
> +++ b/kernel/rcu/tree_exp.h
> @@ -154,7 +154,7 @@ static void __maybe_unused sync_exp_reset_tree(struct rcu_state *rsp)
> * for the current expedited grace period. Works only for preemptible
> * RCU -- other RCU implementation use other means.
> *
> - * Caller must hold the rcu_state's exp_mutex.
> + * Caller must hold the specificed rcu_node structure's ->lock
> */
> static bool sync_rcu_preempt_exp_done(struct rcu_node *rnp)
> {
> @@ -170,8 +170,7 @@ static bool sync_rcu_preempt_exp_done(struct rcu_node *rnp)
> * recursively up the tree. (Calm down, calm down, we do the recursion
> * iteratively!)
> *
> - * Caller must hold the rcu_state's exp_mutex and the specified rcu_node
> - * structure's ->lock.
> + * Caller must hold the specified rcu_node structure's ->lock.
> */
> static void __rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp,
> bool wake, unsigned long flags)
> @@ -207,8 +206,6 @@ static void __rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp,
> /*
> * Report expedited quiescent state for specified node. This is a
> * lock-acquisition wrapper function for __rcu_report_exp_rnp().
> - *
> - * Caller must hold the rcu_state's exp_mutex.
> */
> static void __maybe_unused rcu_report_exp_rnp(struct rcu_state *rsp,
> struct rcu_node *rnp, bool wake)
> @@ -221,8 +218,7 @@ static void __maybe_unused rcu_report_exp_rnp(struct rcu_state *rsp,
>
> /*
> * Report expedited quiescent state for multiple CPUs, all covered by the
> - * specified leaf rcu_node structure. Caller must hold the rcu_state's
> - * exp_mutex.
> + * specified leaf rcu_node structure.
> */
> static void rcu_report_exp_cpu_mult(struct rcu_state *rsp, struct rcu_node *rnp,
> unsigned long mask, bool wake)
> --
> 2.16.2
>