On Fri, Jun 13, 2025 at 05:22:17PM +0200, Sebastian Andrzej Siewior wrote:
> rcu_read_lock_notrace() follows preempt_disable_notrace(). The idea is
> provide a rcu_read_lock() version so that the preempt_disable_notrace()
> user (which use RCU-sched under the hood) can migrate to preemptible
> RCU.
> The first user should be tracing (tracepoint) which is using the
> _notrace variant.
>
> rcu_read_lock_notrace() is a slim version of rcu_read_lock(). It simply
> increments/ decrements the counter. It does not emit any warnings if
> RCU_NEST_PMAX is exceeded or patricipates in STRICT_GRACE_PERIOD. It
> also does not participate in rcu_read_unlock_special() as it would if
> invoke from NMI.
>
If it doesn't participate in rcu_read_unlock_special() then it may not
report a QS in time, right? For example:
CPU 2 CPU 3
=====
rcu_read_lock_notrace();
synchronize_rcu();
// need all CPUs report a QS.
rcu_read_unlock_notrace();
// no rcu_read_unlock_special() so QS will only be reported next
// time we if another RCU read-side critical section exits.
Wouldn't this be a problem?
Regards,
Boqun
> Signed-off-by: Sebastian Andrzej Siewior <[email protected]>
[...]
> diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
> index 0b0f56f6abc85..02cccca917a22 100644
> --- a/kernel/rcu/tree_plugin.h
> +++ b/kernel/rcu/tree_plugin.h
> @@ -420,6 +420,13 @@ void __rcu_read_lock(void)
> }
> EXPORT_SYMBOL_GPL(__rcu_read_lock);
>
> +notrace void __rcu_read_lock_notrace(void)
> +{
> + rcu_preempt_read_enter();
> + barrier(); /* critical section after entry code. */
> +}
> +EXPORT_SYMBOL_GPL(__rcu_read_lock_notrace);
> +
> /*
> * Preemptible RCU implementation for rcu_read_unlock().
> * Decrement ->rcu_read_lock_nesting. If the result is zero (outermost
> @@ -445,6 +452,13 @@ void __rcu_read_unlock(void)
> }
> EXPORT_SYMBOL_GPL(__rcu_read_unlock);
>
> +notrace void __rcu_read_unlock_notrace(void)
> +{
> + barrier(); // critical section before exit code.
> + rcu_preempt_read_exit();
> +}
> +EXPORT_SYMBOL_GPL(__rcu_read_unlock_notrace);
> +
> /*
> * Advance a ->blkd_tasks-list pointer to the next entry, instead
> * returning NULL if at the end of the list.
> --
> 2.49.0
>
>