rcu.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@kernel.org>
To: rcu@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, kernel-team@fb.com,
	mingo@kernel.org, jiangshanlai@gmail.com,
	akpm@linux-foundation.org, mathieu.desnoyers@efficios.com,
	josh@joshtriplett.org, tglx@linutronix.de, peterz@infradead.org,
	rostedt@goodmis.org, dhowells@redhat.com, edumazet@google.com,
	fweisbec@gmail.com, oleg@redhat.com, joel@joelfernandes.org,
	"Paul E. McKenney" <paulmck@kernel.org>
Subject: [PATCH rcu 01/13] rcu-tasks: Wait for trc_read_check_handler() IPIs
Date: Wed, 15 Sep 2021 16:45:52 -0700	[thread overview]
Message-ID: <20210915234604.3907802-1-paulmck@kernel.org> (raw)
In-Reply-To: <20210915234538.GA3907674@paulmck-ThinkPad-P17-Gen-1>

Currently, RCU Tasks Trace initializes the trc_n_readers_need_end counter
to the value one, increments it before each trc_read_check_handler()
IPI, then decrements it within trc_read_check_handler() if the target
task was in a quiescent state (or if the target task moved to some other
CPU while the IPI was in flight), complaining if the new value was zero.
The rationale for complaining is that the initial value of one must be
decremented away before zero can be reached, and this decrement has not
yet happened.

Except that trc_read_check_handler() is initiated with an asynchronous
smp_call_function_single(), which might be significantly delayed.  This
can result in false-positive complaints about the counter reaching zero.

This commit therefore waits for in-flight IPI handlers to complete before
decrementing away the initial value of one from the trc_n_readers_need_end
counter.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
 kernel/rcu/tasks.h | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h
index 806160c44b17..3b2f8038064a 100644
--- a/kernel/rcu/tasks.h
+++ b/kernel/rcu/tasks.h
@@ -1150,14 +1150,28 @@ static void check_all_holdout_tasks_trace(struct list_head *hop,
 	}
 }
 
+static void rcu_tasks_trace_empty_fn(void *unused)
+{
+}
+
 /* Wait for grace period to complete and provide ordering. */
 static void rcu_tasks_trace_postgp(struct rcu_tasks *rtp)
 {
+	int cpu;
 	bool firstreport;
 	struct task_struct *g, *t;
 	LIST_HEAD(holdouts);
 	long ret;
 
+	// Wait for any lingering IPI handlers to complete.  Note that
+	// if a CPU has gone offline or transitioned to userspace in the
+	// meantime, all IPI handlers should have been drained beforehand.
+	// Yes, this assumes that CPUs process IPIs in order.  If that ever
+	// changes, there will need to be a recheck and/or timed wait.
+	for_each_online_cpu(cpu)
+		if (smp_load_acquire(per_cpu_ptr(&trc_ipi_to_cpu, cpu)))
+			smp_call_function_single(cpu, rcu_tasks_trace_empty_fn, NULL, 1);
+
 	// Remove the safety count.
 	smp_mb__before_atomic();  // Order vs. earlier atomics
 	atomic_dec(&trc_n_readers_need_end);
-- 
2.31.1.189.g2e36527f23


  reply	other threads:[~2021-09-15 23:46 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-15 23:45 [PATCH rcu 0/13] Tasks RCU updates for v5.16 Paul E. McKenney
2021-09-15 23:45 ` Paul E. McKenney [this message]
2021-09-15 23:45 ` [PATCH rcu 02/13] rcu-tasks: Simplify trc_read_check_handler() atomic operations Paul E. McKenney
2021-09-15 23:45 ` [PATCH rcu 03/13] rcu-tasks: Add trc_inspect_reader() checks for exiting critical section Paul E. McKenney
2021-09-15 23:45 ` [PATCH rcu 04/13] rcu-tasks: Remove second argument of rcu_read_unlock_trace_special() Paul E. McKenney
2021-09-15 23:45 ` [PATCH rcu 05/13] rcu-tasks: Fix s/instruction/instructions/ typo in comment Paul E. McKenney
2021-09-15 23:45 ` [PATCH rcu 06/13] rcu-tasks: Move RTGS_WAIT_CBS to beginning of rcu_tasks_kthread() loop Paul E. McKenney
2021-09-15 23:45 ` [PATCH rcu 07/13] rcu-tasks: Fix s/rcu_add_holdout/trc_add_holdout/ typo in comment Paul E. McKenney
2021-09-15 23:45 ` [PATCH rcu 08/13] rcu-tasks: Correct firstreport usage in check_all_holdout_tasks_trace Paul E. McKenney
2021-09-15 23:46 ` [PATCH rcu 09/13] rcu-tasks: Correct comparisons for CPU numbers in show_stalled_task_trace Paul E. McKenney
2021-09-15 23:46 ` [PATCH rcu 10/13] rcu-tasks: Clarify read side section info for rcu_tasks_rude GP primitives Paul E. McKenney
2021-09-15 23:46 ` [PATCH rcu 11/13] rcu-tasks: Fix read-side primitives comment for call_rcu_tasks_trace Paul E. McKenney
2021-09-15 23:46 ` [PATCH rcu 12/13] rcu-tasks: Fix IPI failure handling in trc_wait_for_one_reader Paul E. McKenney
2021-09-15 23:46 ` [PATCH rcu 13/13] rcu-tasks: Update comments to cond_resched_tasks_rcu_qs() 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=20210915234604.3907802-1-paulmck@kernel.org \
    --to=paulmck@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=dhowells@redhat.com \
    --cc=edumazet@google.com \
    --cc=fweisbec@gmail.com \
    --cc=jiangshanlai@gmail.com \
    --cc=joel@joelfernandes.org \
    --cc=josh@joshtriplett.org \
    --cc=kernel-team@fb.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=mingo@kernel.org \
    --cc=oleg@redhat.com \
    --cc=peterz@infradead.org \
    --cc=rcu@vger.kernel.org \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    --subject='Re: [PATCH rcu 01/13] rcu-tasks: Wait for trc_read_check_handler() IPIs' \
    /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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).