From: "Paul E. McKenney" <paulmck@kernel.org>
To: rcu@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, kernel-team@meta.com,
rostedt@goodmis.org, "Paul E. McKenney" <paulmck@kernel.org>,
Vasily Gorbik <gor@linux.ibm.com>, Samir <samir@linux.ibm.com>,
Shrikanth Hegde <sshegde@linux.ibm.com>,
Tejun Heo <tj@kernel.org>
Subject: [PATCH 1/7] srcu: Don't queue workqueue handlers to never-online CPUs
Date: Thu, 7 May 2026 10:09:44 -0700 [thread overview]
Message-ID: <20260507170950.2040199-1-paulmck@kernel.org> (raw)
In-Reply-To: <eeeda48e-03ed-428a-847d-5a0b56508b68@paulmck-laptop>
While an srcu_struct structure is in the midst of switching from CPU-0
to all-CPUs state, it can attempt to invoke callbacks for CPUs that
have never been online. Worse yet, it can attempt in invoke callbacks
for CPUs that never will be online, even including imaginary CPUs not in
cpu_possible_mask. This can cause hangs on s390, which is not set up to
deal with workqueue handlers being scheduled on such CPUs. This commit
therefore causes Tree SRCU to refrain from queueing workqueue handlers
on CPUs that have not yet (and might never) come online.
Because callbacks are not invoked on CPUs that have not been
online, it is an error to invoke call_srcu(), synchronize_srcu(), or
synchronize_srcu_expedited() on a CPU that is not yet fully online.
However, it turns out to be less code to redirect the callbacks
from too-early invocations of call_srcu() than to warn about such
invocations. This commit therefore also redirects callbacks queued on
not-yet-fully-online CPUs to the boot CPU.
Reported-by: Vasily Gorbik <gor@linux.ibm.com>
Fixes: 61bbcfb50514 ("srcu: Push srcu_node allocation to GP when non-preemptible")
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Tested-by: Vasily Gorbik <gor@linux.ibm.com>
Tested-by: Samir <samir@linux.ibm.com>
Reviewed-by: Shrikanth Hegde <sshegde@linux.ibm.com>
Cc: Tejun Heo <tj@kernel.org>
---
kernel/rcu/srcutree.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c
index 0d01cd8c4b4a7b..7c2f7cc131f7ae 100644
--- a/kernel/rcu/srcutree.c
+++ b/kernel/rcu/srcutree.c
@@ -897,11 +897,9 @@ static void srcu_schedule_cbs_snp(struct srcu_struct *ssp, struct srcu_node *snp
{
int cpu;
- for (cpu = snp->grplo; cpu <= snp->grphi; cpu++) {
- if (!(mask & (1UL << (cpu - snp->grplo))))
- continue;
- srcu_schedule_cbs_sdp(per_cpu_ptr(ssp->sda, cpu), delay);
- }
+ for (cpu = snp->grplo; cpu <= snp->grphi; cpu++)
+ if ((mask & (1UL << (cpu - snp->grplo))) && rcu_cpu_beenfullyonline(cpu))
+ srcu_schedule_cbs_sdp(per_cpu_ptr(ssp->sda, cpu), delay);
}
/*
@@ -1322,7 +1320,9 @@ static unsigned long srcu_gp_start_if_needed(struct srcu_struct *ssp,
*/
idx = __srcu_read_lock_nmisafe(ssp);
ss_state = smp_load_acquire(&ssp->srcu_sup->srcu_size_state);
- if (ss_state < SRCU_SIZE_WAIT_CALL)
+ // If !rcu_cpu_beenfullyonline(), interrupts are still disabled,
+ // so no migration is possible in either direction from this CPU.
+ if (ss_state < SRCU_SIZE_WAIT_CALL || !rcu_cpu_beenfullyonline(raw_smp_processor_id()))
sdp = per_cpu_ptr(ssp->sda, get_boot_cpu_id());
else
sdp = raw_cpu_ptr(ssp->sda);
--
2.40.1
next prev parent reply other threads:[~2026-05-07 17:09 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-07 17:09 [PATCH 0/7] Miscellaneous RCU changes for v7.2 Paul E. McKenney
2026-05-07 17:09 ` Paul E. McKenney [this message]
2026-05-07 17:09 ` [PATCH 2/7] srcu: Fix kerneldoc header comment typo in srcu_down_read_fast() Paul E. McKenney
2026-05-07 17:09 ` [PATCH 3/7] checkpatch: Undeprecate rcu_read_lock_trace() and rcu_read_unlock_trace() Paul E. McKenney
2026-05-07 17:44 ` Joe Perches
2026-05-07 17:53 ` Paul E. McKenney
2026-05-07 17:09 ` [PATCH 4/7] checkpatch: Mark rcu_read_lock_tasks_trace() and friend BPF-only Paul E. McKenney
2026-05-07 17:09 ` [PATCH 5/7] rcu: Simplify rcu_do_batch() by applying clamp() Paul E. McKenney
2026-05-07 17:09 ` [PATCH 6/7] rcu: Simplify param_set_next_fqs_jiffies() by applying clamp_val() Paul E. McKenney
2026-05-07 17:09 ` [PATCH 7/7] rcu: Document rcu_access_pointer() feeding into cmpxchg() Paul E. McKenney
2026-05-08 17:06 ` [PATCH 0/7] Miscellaneous RCU changes for v7.2 Uladzislau Rezki
2026-05-08 17:27 ` Paul E. McKenney
2026-05-08 17:43 ` [PATCH v2 0/6] " Paul E. McKenney
2026-05-08 17:43 ` [PATCH v2 1/6] srcu: Don't queue workqueue handlers to never-online CPUs Paul E. McKenney
2026-05-08 17:43 ` [PATCH v2 2/6] srcu: Fix kerneldoc header comment typo in srcu_down_read_fast() Paul E. McKenney
2026-05-08 17:43 ` [PATCH v2 3/6] checkpatch: Undeprecate rcu_read_lock_trace() and rcu_read_unlock_trace() Paul E. McKenney
2026-05-08 17:43 ` [PATCH v2 4/6] rcu: Simplify rcu_do_batch() by applying clamp() Paul E. McKenney
2026-05-08 17:43 ` [PATCH v2 5/6] rcu: Simplify param_set_next_fqs_jiffies() by applying clamp_val() Paul E. McKenney
2026-05-08 17:43 ` [PATCH v2 6/6] rcu: Document rcu_access_pointer() feeding into cmpxchg() Paul E. McKenney
2026-05-11 9:19 ` [PATCH v2 0/6] Miscellaneous RCU changes for v7.2 Uladzislau Rezki
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=20260507170950.2040199-1-paulmck@kernel.org \
--to=paulmck@kernel.org \
--cc=gor@linux.ibm.com \
--cc=kernel-team@meta.com \
--cc=linux-kernel@vger.kernel.org \
--cc=rcu@vger.kernel.org \
--cc=rostedt@goodmis.org \
--cc=samir@linux.ibm.com \
--cc=sshegde@linux.ibm.com \
--cc=tj@kernel.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