* [PATCH 0/3] rcu/nocb updates
@ 2024-08-13 22:56 Frederic Weisbecker
2024-08-13 22:56 ` [PATCH 1/3] rcu/nocb: Fix RT throttling hrtimer armed from offline CPU Frederic Weisbecker
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Frederic Weisbecker @ 2024-08-13 22:56 UTC (permalink / raw)
To: LKML
Cc: Frederic Weisbecker, Boqun Feng, Joel Fernandes, Neeraj Upadhyay,
Paul E . McKenney, Uladzislau Rezki, Zqiang, rcu, Cheng-Jui Wang
Hi,
This series include:
* Fix another RT wake up while CPU is offline (reported by Cheng-Jui Wang)
* Cleanup rcuo wakeup
* Remove another superfluous barrier
Thanks.
Frederic Weisbecker (3):
rcu/nocb: Fix RT throttling hrtimer armed from offline CPU
rcu/nocb: Conditionally wake up rcuo if not already waiting on GP
rcu/nocb: Remove superfluous memory barrier after bypass enqueue
kernel/rcu/tree_nocb.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
--
2.45.2
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH 1/3] rcu/nocb: Fix RT throttling hrtimer armed from offline CPU
2024-08-13 22:56 [PATCH 0/3] rcu/nocb updates Frederic Weisbecker
@ 2024-08-13 22:56 ` Frederic Weisbecker
2024-08-13 22:56 ` [PATCH 2/3] rcu/nocb: Conditionally wake up rcuo if not already waiting on GP Frederic Weisbecker
2024-08-13 22:56 ` [PATCH 3/3] rcu/nocb: Remove superfluous memory barrier after bypass enqueue Frederic Weisbecker
2 siblings, 0 replies; 5+ messages in thread
From: Frederic Weisbecker @ 2024-08-13 22:56 UTC (permalink / raw)
To: LKML
Cc: Frederic Weisbecker, Boqun Feng, Joel Fernandes, Neeraj Upadhyay,
Paul E . McKenney, Uladzislau Rezki, Zqiang, rcu, Cheng-Jui Wang
After a CPU is marked offline and until it reaches its final trip to
idle, rcuo has several opportunities to be woken up, either because
a callback has been queued in the meantime or because
rcutree_report_cpu_dead() has issued the final deferred NOCB wake up.
If RCU-boosting is enabled, RCU kthreads are set to SCHED_FIFO policy.
And if RT-bandwidth is enabled, the related hrtimer might be armed.
However this then happens after hrtimers have been migrated at the
CPUHP_AP_HRTIMERS_DYING stage, which is broken as reported by the
following warning:
Call trace:
enqueue_hrtimer+0x7c/0xf8
hrtimer_start_range_ns+0x2b8/0x300
enqueue_task_rt+0x298/0x3f0
enqueue_task+0x94/0x188
ttwu_do_activate+0xb4/0x27c
try_to_wake_up+0x2d8/0x79c
wake_up_process+0x18/0x28
__wake_nocb_gp+0x80/0x1a0
do_nocb_deferred_wakeup_common+0x3c/0xcc
rcu_report_dead+0x68/0x1ac
cpuhp_report_idle_dead+0x48/0x9c
do_idle+0x288/0x294
cpu_startup_entry+0x34/0x3c
secondary_start_kernel+0x138/0x158
Fix this with waking up rcuo using an IPI if necessary. Since the
existing API to deal with this situation only handles swait queue, rcuo
is only woken up from offline CPUs if it's not already waiting on a
grace period. In the worst case some callbacks will just wait for a
grace period to complete before being assigned to a subsequent one.
Reported-by: Cheng-Jui Wang (王正睿) <Cheng-Jui.Wang@mediatek.com>
Fixes: 5c0930ccaad5 ("hrtimers: Push pending hrtimers away from outgoing CPU earlier")
Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
---
kernel/rcu/tree_nocb.h | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/kernel/rcu/tree_nocb.h b/kernel/rcu/tree_nocb.h
index 1e92164116ef..08608fe1792c 100644
--- a/kernel/rcu/tree_nocb.h
+++ b/kernel/rcu/tree_nocb.h
@@ -216,7 +216,10 @@ static bool __wake_nocb_gp(struct rcu_data *rdp_gp,
raw_spin_unlock_irqrestore(&rdp_gp->nocb_gp_lock, flags);
if (needwake) {
trace_rcu_nocb_wake(rcu_state.name, rdp->cpu, TPS("DoWake"));
- wake_up_process(rdp_gp->nocb_gp_kthread);
+ if (cpu_is_offline(raw_smp_processor_id()))
+ swake_up_one_online(&rdp_gp->nocb_gp_wq);
+ else
+ wake_up_process(rdp_gp->nocb_gp_kthread);
}
return needwake;
--
2.45.2
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH 2/3] rcu/nocb: Conditionally wake up rcuo if not already waiting on GP
2024-08-13 22:56 [PATCH 0/3] rcu/nocb updates Frederic Weisbecker
2024-08-13 22:56 ` [PATCH 1/3] rcu/nocb: Fix RT throttling hrtimer armed from offline CPU Frederic Weisbecker
@ 2024-08-13 22:56 ` Frederic Weisbecker
2024-08-13 22:56 ` [PATCH 3/3] rcu/nocb: Remove superfluous memory barrier after bypass enqueue Frederic Weisbecker
2 siblings, 0 replies; 5+ messages in thread
From: Frederic Weisbecker @ 2024-08-13 22:56 UTC (permalink / raw)
To: LKML
Cc: Frederic Weisbecker, Boqun Feng, Joel Fernandes, Neeraj Upadhyay,
Paul E . McKenney, Uladzislau Rezki, Zqiang, rcu, Cheng-Jui Wang
A callback enqueuer currently wakes up the rcuo kthread if it is adding
the first non-done callback of a CPU, whether the kthread is waiting on
a grace period or not (unless the CPU is offline).
This looks like a desired behaviour because then the rcuo kthread
doesn't wait for the end of the current grace period to handle the
callback. It is accelerated right away and assigned to the next grace
period. The GP kthread is notified about that fact and iterates with
the upcoming GP without sleeping in-between.
However this best-case scenario is contradicted by a few details,
depending on the situation:
1) If the callback is a non-bypass one queued with IRQs enabled, the
wake up only occurs if no other pending callbacks are on the list.
Therefore the theoretical "optimization" actually applies on rare
occasions.
2) If the callback is a non-bypass one queued with IRQs disabled, the
situation is similar with even more uncertainty due to the deferred
wake up.
3) If the callback is lazy, a few jiffies don't make any difference.
4) If the callback is bypass, the wake up timer is programmed 2 jiffies
ahead by rcuo in case the regular pending queue has been handled
in the meantime. The rare storm of callbacks can otherwise wait for
the currently elapsing grace period to be flushed and handled.
For all those reasons, the optimization is only theoretical and
occasional. Therefore it is reasonable that callbacks enqueuers only
wake up the rcuo kthread when it is not already waiting on a grace
period to complete.
Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
---
kernel/rcu/tree_nocb.h | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/kernel/rcu/tree_nocb.h b/kernel/rcu/tree_nocb.h
index 08608fe1792c..0c9eca1cc76e 100644
--- a/kernel/rcu/tree_nocb.h
+++ b/kernel/rcu/tree_nocb.h
@@ -216,10 +216,7 @@ static bool __wake_nocb_gp(struct rcu_data *rdp_gp,
raw_spin_unlock_irqrestore(&rdp_gp->nocb_gp_lock, flags);
if (needwake) {
trace_rcu_nocb_wake(rcu_state.name, rdp->cpu, TPS("DoWake"));
- if (cpu_is_offline(raw_smp_processor_id()))
- swake_up_one_online(&rdp_gp->nocb_gp_wq);
- else
- wake_up_process(rdp_gp->nocb_gp_kthread);
+ swake_up_one_online(&rdp_gp->nocb_gp_wq);
}
return needwake;
--
2.45.2
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH 3/3] rcu/nocb: Remove superfluous memory barrier after bypass enqueue
2024-08-13 22:56 [PATCH 0/3] rcu/nocb updates Frederic Weisbecker
2024-08-13 22:56 ` [PATCH 1/3] rcu/nocb: Fix RT throttling hrtimer armed from offline CPU Frederic Weisbecker
2024-08-13 22:56 ` [PATCH 2/3] rcu/nocb: Conditionally wake up rcuo if not already waiting on GP Frederic Weisbecker
@ 2024-08-13 22:56 ` Frederic Weisbecker
2 siblings, 0 replies; 5+ messages in thread
From: Frederic Weisbecker @ 2024-08-13 22:56 UTC (permalink / raw)
To: LKML
Cc: Frederic Weisbecker, Boqun Feng, Joel Fernandes, Neeraj Upadhyay,
Paul E . McKenney, Uladzislau Rezki, Zqiang, rcu
Pre-GP accesses performed by the update side must be ordered against
post-GP accesses performed by the readers. This is ensured by the
bypass or nocb locking on enqueue time, followed by the fully ordered
rnp locking initiated while callbacks are accelerated, and then
propagated throughout the whole GP lifecyle associated with the
callbacks.
Therefore the explicit barrier advertizing ordering between bypass
enqueue and rcuo wakeup is superfluous. If anything, it would even only
order the first bypass callback enqueue against the rcuo wakeup and
ignore all the subsequent ones.
Remove the needless barrier.
Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
---
kernel/rcu/tree_nocb.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kernel/rcu/tree_nocb.h b/kernel/rcu/tree_nocb.h
index 0c9eca1cc76e..755ada098035 100644
--- a/kernel/rcu/tree_nocb.h
+++ b/kernel/rcu/tree_nocb.h
@@ -493,7 +493,7 @@ static bool rcu_nocb_try_bypass(struct rcu_data *rdp, struct rcu_head *rhp,
trace_rcu_nocb_wake(rcu_state.name, rdp->cpu, TPS("FirstBQ"));
}
rcu_nocb_bypass_unlock(rdp);
- smp_mb(); /* Order enqueue before wake. */
+
// A wake up of the grace period kthread or timer adjustment
// needs to be done only if:
// 1. Bypass list was fully empty before (this is the first
--
2.45.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 0/3] rcu/nocb updates
@ 2024-09-13 21:42 Frederic Weisbecker
2024-09-13 21:42 ` [PATCH 1/3] rcu/nocb: Fix RT throttling hrtimer armed from offline CPU Frederic Weisbecker
0 siblings, 1 reply; 5+ messages in thread
From: Frederic Weisbecker @ 2024-09-13 21:42 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, Frederic Weisbecker, Boqun Feng, Joel Fernandes,
Neeraj Upadhyay, Paul E . McKenney, Uladzislau Rezki, Zqiang, rcu,
Cheng-Jui Wang
Hi,
This series include:
* Fix another RT wake up while CPU is offline (reported by Cheng-Jui Wang)
* Cleanup rcuo wakeup
* Remove another superfluous barrier
Thanks.
Frederic Weisbecker (3):
rcu/nocb: Fix RT throttling hrtimer armed from offline CPU
rcu/nocb: Conditionally wake up rcuo if not already waiting on GP
rcu/nocb: Remove superfluous memory barrier after bypass enqueue
kernel/rcu/tree_nocb.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
--
2.45.2
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/3] rcu/nocb: Fix RT throttling hrtimer armed from offline CPU
2024-09-13 21:42 [PATCH 0/3] rcu/nocb updates Frederic Weisbecker
@ 2024-09-13 21:42 ` Frederic Weisbecker
0 siblings, 0 replies; 5+ messages in thread
From: Frederic Weisbecker @ 2024-09-13 21:42 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, Frederic Weisbecker, Boqun Feng, Joel Fernandes,
Neeraj Upadhyay, Paul E . McKenney, Uladzislau Rezki, Zqiang, rcu,
Cheng-Jui Wang
After a CPU is marked offline and until it reaches its final trip to
idle, rcuo has several opportunities to be woken up, either because
a callback has been queued in the meantime or because
rcutree_report_cpu_dead() has issued the final deferred NOCB wake up.
If RCU-boosting is enabled, RCU kthreads are set to SCHED_FIFO policy.
And if RT-bandwidth is enabled, the related hrtimer might be armed.
However this then happens after hrtimers have been migrated at the
CPUHP_AP_HRTIMERS_DYING stage, which is broken as reported by the
following warning:
Call trace:
enqueue_hrtimer+0x7c/0xf8
hrtimer_start_range_ns+0x2b8/0x300
enqueue_task_rt+0x298/0x3f0
enqueue_task+0x94/0x188
ttwu_do_activate+0xb4/0x27c
try_to_wake_up+0x2d8/0x79c
wake_up_process+0x18/0x28
__wake_nocb_gp+0x80/0x1a0
do_nocb_deferred_wakeup_common+0x3c/0xcc
rcu_report_dead+0x68/0x1ac
cpuhp_report_idle_dead+0x48/0x9c
do_idle+0x288/0x294
cpu_startup_entry+0x34/0x3c
secondary_start_kernel+0x138/0x158
Fix this with waking up rcuo using an IPI if necessary. Since the
existing API to deal with this situation only handles swait queue, rcuo
is only woken up from offline CPUs if it's not already waiting on a
grace period. In the worst case some callbacks will just wait for a
grace period to complete before being assigned to a subsequent one.
Reported-by: Cheng-Jui Wang (王正睿) <Cheng-Jui.Wang@mediatek.com>
Fixes: 5c0930ccaad5 ("hrtimers: Push pending hrtimers away from outgoing CPU earlier")
Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
---
kernel/rcu/tree_nocb.h | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/kernel/rcu/tree_nocb.h b/kernel/rcu/tree_nocb.h
index 1e92164116ef..08608fe1792c 100644
--- a/kernel/rcu/tree_nocb.h
+++ b/kernel/rcu/tree_nocb.h
@@ -216,7 +216,10 @@ static bool __wake_nocb_gp(struct rcu_data *rdp_gp,
raw_spin_unlock_irqrestore(&rdp_gp->nocb_gp_lock, flags);
if (needwake) {
trace_rcu_nocb_wake(rcu_state.name, rdp->cpu, TPS("DoWake"));
- wake_up_process(rdp_gp->nocb_gp_kthread);
+ if (cpu_is_offline(raw_smp_processor_id()))
+ swake_up_one_online(&rdp_gp->nocb_gp_wq);
+ else
+ wake_up_process(rdp_gp->nocb_gp_kthread);
}
return needwake;
--
2.45.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2024-09-13 21:42 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-08-13 22:56 [PATCH 0/3] rcu/nocb updates Frederic Weisbecker
2024-08-13 22:56 ` [PATCH 1/3] rcu/nocb: Fix RT throttling hrtimer armed from offline CPU Frederic Weisbecker
2024-08-13 22:56 ` [PATCH 2/3] rcu/nocb: Conditionally wake up rcuo if not already waiting on GP Frederic Weisbecker
2024-08-13 22:56 ` [PATCH 3/3] rcu/nocb: Remove superfluous memory barrier after bypass enqueue Frederic Weisbecker
-- strict thread matches above, loose matches on Subject: below --
2024-09-13 21:42 [PATCH 0/3] rcu/nocb updates Frederic Weisbecker
2024-09-13 21:42 ` [PATCH 1/3] rcu/nocb: Fix RT throttling hrtimer armed from offline CPU Frederic Weisbecker
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox