public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Peter Zijlstra <peterz@infradead.org>
To: "Paul E. McKenney" <paulmck@kernel.org>
Cc: rcu@vger.kernel.org, linux-kernel@vger.kernel.org,
	kernel-team@meta.com, rostedt@goodmis.org,
	Andrii Nakryiko <andrii@kernel.org>,
	Alexei Starovoitov <ast@kernel.org>,
	bpf@vger.kernel.org
Subject: Re: [PATCH 15/34] rcu: Add noinstr-fast rcu_read_{,un}lock_tasks_trace() APIs
Date: Tue, 23 Sep 2025 19:32:16 +0200	[thread overview]
Message-ID: <20250923173216.GU3245006@noisy.programming.kicks-ass.net> (raw)
In-Reply-To: <20250923142036.112290-15-paulmck@kernel.org>

On Tue, Sep 23, 2025 at 07:20:17AM -0700, Paul E. McKenney wrote:
> When expressing RCU Tasks Trace in terms of SRCU-fast, it was
> necessary to keep a nesting count and per-CPU srcu_ctr structure
> pointer in the task_struct structure, which is slow to access.
> But an alternative is to instead make rcu_read_lock_tasks_trace() and
> rcu_read_unlock_tasks_trace(), which match the underlying SRCU-fast
> semantics, avoiding the task_struct accesses.
> 
> When all callers have switched to the new API, the previous
> rcu_read_lock_trace() and rcu_read_unlock_trace() APIs will be removed.
> 
> Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
> Cc: Andrii Nakryiko <andrii@kernel.org>
> Cc: Alexei Starovoitov <ast@kernel.org>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Cc: <bpf@vger.kernel.org>
> ---
>  include/linux/rcupdate_trace.h | 37 ++++++++++++++++++++++++++++++++++
>  1 file changed, 37 insertions(+)
> 
> diff --git a/include/linux/rcupdate_trace.h b/include/linux/rcupdate_trace.h
> index 0bd47f12ecd17b..b87151e6b23881 100644
> --- a/include/linux/rcupdate_trace.h
> +++ b/include/linux/rcupdate_trace.h
> @@ -34,6 +34,43 @@ static inline int rcu_read_lock_trace_held(void)
>  
>  #ifdef CONFIG_TASKS_TRACE_RCU
>  
> +/**
> + * rcu_read_lock_tasks_trace - mark beginning of RCU-trace read-side critical section
> + *
> + * When synchronize_rcu_tasks_trace() is invoked by one task, then that
> + * task is guaranteed to block until all other tasks exit their read-side
> + * critical sections.  Similarly, if call_rcu_trace() is invoked on one
> + * task while other tasks are within RCU read-side critical sections,
> + * invocation of the corresponding RCU callback is deferred until after
> + * the all the other tasks exit their critical sections.
> + *
> + * For more details, please see the documentation for srcu_read_lock_fast().
> + */
> +static inline struct srcu_ctr __percpu *rcu_read_lock_tasks_trace(void)
> +{
> +	struct srcu_ctr __percpu *ret = srcu_read_lock_fast(&rcu_tasks_trace_srcu_struct);
> +
> +	if (IS_ENABLED(CONFIG_ARCH_WANTS_NO_INSTR))
> +		smp_mb();

I am somewhat confused by the relation between noinstr and smp_mb()
here. Subject mentions is, but Changelog is awfully silent again.

Furthermore I note that this is a positive while unlock is a negative
relation between the two. Which adds even more confusion.

> +	return ret;
> +}
> +
> +/**
> + * rcu_read_unlock_tasks_trace - mark end of RCU-trace read-side critical section
> + * @scp: return value from corresponding rcu_read_lock_tasks_trace().
> + *
> + * Pairs with the preceding call to rcu_read_lock_tasks_trace() that
> + * returned the value passed in via scp.
> + *
> + * For more details, please see the documentation for rcu_read_unlock().
> + */
> +static inline void rcu_read_unlock_tasks_trace(struct srcu_ctr __percpu *scp)
> +{
> +	if (!IS_ENABLED(CONFIG_ARCH_WANTS_NO_INSTR))
> +		smp_mb();
> +	srcu_read_unlock_fast(&rcu_tasks_trace_srcu_struct, scp);
> +}
> +
>  /**
>   * rcu_read_lock_trace - mark beginning of RCU-trace read-side critical section
>   *
> -- 
> 2.40.1
> 

  reply	other threads:[~2025-09-23 17:32 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-09-23 14:20 [PATCH 0/34] Implement RCU Tasks Trace in terms of SRCU-fast and optimize Paul E. McKenney
2025-09-23 14:20 ` [PATCH 01/34] rcu: Re-implement RCU Tasks Trace in terms of SRCU-fast Paul E. McKenney
2025-09-25 18:39   ` Andrii Nakryiko
2025-09-25 18:58     ` Paul E. McKenney
2025-09-23 14:20 ` [PATCH 02/34] rcu: Remove unused ->trc_ipi_to_cpu and ->trc_blkd_cpu from task_struct Paul E. McKenney
2025-09-23 14:20 ` [PATCH 03/34] rcu: Remove ->trc_blkd_node " Paul E. McKenney
2025-09-23 14:20 ` [PATCH 04/34] rcu: Remove ->trc_holdout_list " Paul E. McKenney
2025-09-23 14:20 ` [PATCH 05/34] rcu: Remove rcu_tasks_trace_qs() and the functions that it calls Paul E. McKenney
2025-09-23 14:20 ` [PATCH 06/34] context_tracking: Remove rcu_task_trace_heavyweight_{enter,exit}() Paul E. McKenney
2025-09-23 14:20 ` [PATCH 07/34] rcu: Remove ->trc_reader_special from task_struct Paul E. McKenney
2025-09-23 14:20 ` [PATCH 08/34] rcu: Remove now-empty RCU Tasks Trace functions and calls to them Paul E. McKenney
2025-09-23 14:20 ` [PATCH 09/34] rcu: Remove unused rcu_tasks_trace_lazy_ms and trc_stall_chk_rdr struct Paul E. McKenney
2025-09-23 14:20 ` [PATCH 10/34] rcu: Remove now-empty show_rcu_tasks_trace_gp_kthread() function Paul E. McKenney
2025-09-23 14:20 ` [PATCH 11/34] rcu: Remove now-empty rcu_tasks_trace_get_gp_data() function Paul E. McKenney
2025-09-23 14:20 ` [PATCH 12/34] rcu: Remove now-empty rcu_tasks_trace_torture_stats_print() function Paul E. McKenney
2025-09-23 14:20 ` [PATCH 13/34] rcu: Remove now-empty get_rcu_tasks_trace_gp_kthread() function Paul E. McKenney
2025-09-23 14:20 ` [PATCH 14/34] rcu: Move rcu_tasks_trace_srcu_struct out of #ifdef CONFIG_TASKS_RCU_GENERIC Paul E. McKenney
2025-09-23 14:20 ` [PATCH 15/34] rcu: Add noinstr-fast rcu_read_{,un}lock_tasks_trace() APIs Paul E. McKenney
2025-09-23 17:32   ` Peter Zijlstra [this message]
2025-09-24  8:44     ` Paul E. McKenney
2025-09-24  9:08       ` Peter Zijlstra
2025-09-23 14:20 ` [PATCH 16/34] rcu: Remove now-unused rcu_task_ipi_delay and TASKS_TRACE_RCU_READ_MB Paul E. McKenney
2025-09-23 14:20 ` [PATCH 17/34] srcu: Create a DEFINE_SRCU_FAST() Paul E. McKenney
2025-09-23 14:20 ` [PATCH 18/34] rcu: Use smp_mb() only when necessary in RCU Tasks Trace readers Paul E. McKenney
2025-09-23 14:20 ` [PATCH 19/34] rcu: Update Requirements.rst for RCU Tasks Trace Paul E. McKenney
2025-09-25 18:40   ` Andrii Nakryiko
2025-09-25 18:53     ` Paul E. McKenney
2025-09-23 14:20 ` [PATCH 20/34] checkpatch: Deprecate rcu_read_{,un}lock_trace() Paul E. McKenney
2025-09-23 15:47   ` Joe Perches
2025-09-23 17:01     ` Paul E. McKenney
2025-09-23 14:20 ` [PATCH 21/34] rcu: Mark diagnostic functions as notrace Paul E. McKenney
2025-09-23 14:20 ` [PATCH 22/34] tracing: Guard __DECLARE_TRACE() use of __DO_TRACE_CALL() with SRCU-fast Paul E. McKenney
2025-09-23 14:20 ` [PATCH 23/34] srcu: Create an srcu_expedite_current() function Paul E. McKenney
2025-09-24  0:10   ` Zqiang
2025-09-24  8:56     ` Paul E. McKenney
2025-09-23 14:20 ` [PATCH 24/34] rcutorture: Test srcu_expedite_current() Paul E. McKenney
2025-09-23 14:20 ` [PATCH 25/34] srcu: Create an rcu_tasks_trace_expedite_current() function Paul E. McKenney
2025-09-23 14:20 ` [PATCH 26/34] rcutorture: Test rcu_tasks_trace_expedite_current() Paul E. McKenney
2025-09-23 14:20 ` [PATCH 27/34] srcu: Make DEFINE_SRCU_FAST() available to modules Paul E. McKenney
2025-09-23 14:20 ` [PATCH 28/34] srcu: Make SRCU-fast available to heap srcu_struct structures Paul E. McKenney
2025-09-23 14:20 ` [PATCH 29/34] srcu: Make grace-period determination use ssp->srcu_reader_flavor Paul E. McKenney
2025-09-23 14:20 ` [PATCH 30/34] rcutorture: Exercise DEFINE_STATIC_SRCU_FAST() and init_srcu_struct_fast() Paul E. McKenney
2025-09-23 14:20 ` [PATCH 31/34] refscale: " Paul E. McKenney
2025-09-23 14:20 ` [PATCH 32/34] srcu: Require special srcu_struct define/init for SRCU-fast readers Paul E. McKenney
2025-09-23 14:20 ` [PATCH 33/34] srcu: Make SRCU-fast readers enforce use of SRCU-fast definition/init Paul E. McKenney
2025-09-23 14:20 ` [PATCH 34/34] doc: Update for SRCU-fast definitions and initialization Paul E. McKenney
2025-09-24  7:49 ` [PATCH 0/34] Implement RCU Tasks Trace in terms of SRCU-fast and optimize Alexei Starovoitov
2025-09-24  8:20   ` Paul E. McKenney

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250923173216.GU3245006@noisy.programming.kicks-ass.net \
    --to=peterz@infradead.org \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=kernel-team@meta.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=paulmck@kernel.org \
    --cc=rcu@vger.kernel.org \
    --cc=rostedt@goodmis.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox