Re: [PATCH rcu 04/12] srcu: Bit manipulation changes for additional reader flavor

From: Neeraj Upadhyay
Date: Mon Oct 14 2024 - 05:20:54 EST


On 10/9/2024 11:37 PM, Paul E. McKenney wrote:
> Currently, there are only two flavors of readers, normal and NMI-safe.
> Very straightforward state updates suffice to check for erroneous
> mixing of reader flavors on a given srcu_struct structure. This commit
> upgrades the checking in preparation for the addition of light-weight
> (as in memory-barrier-free) readers.
>
> Signed-off-by: Paul E. McKenney <paulmck@xxxxxxxxxx>
> Cc: Alexei Starovoitov <ast@xxxxxxxxxx>
> Cc: Andrii Nakryiko <andrii@xxxxxxxxxx>
> Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
> Cc: Kent Overstreet <kent.overstreet@xxxxxxxxx>
> Cc: <bpf@xxxxxxxxxxxxxxx>
> ---
> kernel/rcu/srcutree.c | 7 ++++---
> 1 file changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c
> index 18f2eae5e14bd..abe55777c4335 100644
> --- a/kernel/rcu/srcutree.c
> +++ b/kernel/rcu/srcutree.c
> @@ -462,7 +462,7 @@ static unsigned long srcu_readers_unlock_idx(struct srcu_struct *ssp, int idx)
> if (IS_ENABLED(CONFIG_PROVE_RCU))
> mask = mask | READ_ONCE(cpuc->srcu_reader_flavor);
> }
> - WARN_ONCE(IS_ENABLED(CONFIG_PROVE_RCU) && (mask & (mask >> 1)),
> + WARN_ONCE(IS_ENABLED(CONFIG_PROVE_RCU) && (mask & (mask - 1)),
> "Mixed NMI-safe readers for srcu_struct at %ps.\n", ssp);
> return sum;
> }
> @@ -712,8 +712,9 @@ void srcu_check_read_flavor(struct srcu_struct *ssp, int read_flavor)
> sdp = raw_cpu_ptr(ssp->sda);
> old_reader_flavor_mask = READ_ONCE(sdp->srcu_reader_flavor);
> if (!old_reader_flavor_mask) {
> - WRITE_ONCE(sdp->srcu_reader_flavor, reader_flavor_mask);
> - return;
> + old_reader_flavor_mask = cmpxchg(&sdp->srcu_reader_flavor, 0, reader_flavor_mask);

This looks to be separate independent fix?


- Neeraj

> + if (!old_reader_flavor_mask)
> + return;
> }
> WARN_ONCE(old_reader_flavor_mask != reader_flavor_mask, "CPU %d old state %d new state %d\n", sdp->cpu, old_reader_flavor_mask, reader_flavor_mask);
> }