Re: [PATCH 2/2] rcu: Remove needless preemption disablement in rcu_all_qs()

From: Peter Zijlstra
Date: Tue Jul 06 2021 - 03:51:28 EST


On Tue, Jul 06, 2021 at 01:43:44AM +0200, Frederic Weisbecker wrote:
> The preemption is already disabled when we write rcu_data.rcu_urgent_qs.
> We can use __this_cpu_write() directly, although that path is mostly
> used when CONFIG_PREEMPT=n.
>
> Signed-off-by: Frederic Weisbecker <frederic@xxxxxxxxxx>
> Cc: Neeraj Upadhyay <neeraju@xxxxxxxxxxxxxx>
> Cc: Joel Fernandes <joel@xxxxxxxxxxxxxxxxx>
> Cc: Uladzislau Rezki <urezki@xxxxxxxxx>
> Cc: Boqun Feng <boqun.feng@xxxxxxxxx>
> ---
> kernel/rcu/tree_plugin.h | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
> index 27b74352cccf..38b3d01424d7 100644
> --- a/kernel/rcu/tree_plugin.h
> +++ b/kernel/rcu/tree_plugin.h
> @@ -871,7 +871,7 @@ void rcu_all_qs(void)
> preempt_enable();
> return;
> }
> - this_cpu_write(rcu_data.rcu_urgent_qs, false);
> + __this_cpu_write(rcu_data.rcu_urgent_qs, false);

There's another subtle difference between this_cpu_write() and
__this_cpu_write() aside from preempt. this_cpu_write() is also
IRQ-safe, while __this_cpu_write() is not.

I've not looked at the usage here to see if that is relevant, but the
Changelog only mentioned the preempt side of things, and that argument
is incomplete in general.