* [RFC] rcu: Avoid unnecessary softirq when system is idle
@ 2019-01-19 16:14 Joel Fernandes (Google)
2019-01-20 1:07 ` Paul E. McKenney
0 siblings, 1 reply; 2+ messages in thread
From: Joel Fernandes (Google) @ 2019-01-19 16:14 UTC (permalink / raw)
To: linux-kernel
Cc: Joel Fernandes (Google), Josh Triplett, Lai Jiangshan,
Mathieu Desnoyers, Paul E. McKenney, Steven Rostedt
When there are no callbacks pending on an idle system, I noticed that
RCU softirq is continuously firing. During this the cpu_no_qs is set to
false, and core_needs_qs is set to true indefinitely. This causes
rcu_process_callbacks to be repeatedly called, even though the node
corresponding to the CPU has that CPU's mask bit cleared and the system
is idle. I believe the race is when such mask clearing is done during
idle CPU scan of the quiescent state forcing stage in the kthread
instead of the softirq. Since the rnp mask is cleared, but the flags on
the CPU's rdp are not cleared, the CPU thinks it still needs to report
to core RCU.
Cure this by clearing the core_needs_qs flag when the CPU detects that
its node is already updated which will avoid the unwanted softirq raises
to the benefit of real-time systems.
Test: Ran rcutorture for various tree RCU configs.
Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
---
kernel/rcu/tree.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 9180158756d2..96ad80c76b15 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -2273,6 +2273,7 @@ rcu_report_qs_rdp(int cpu, struct rcu_data *rdp)
}
mask = rdp->grpmask;
if ((rnp->qsmask & mask) == 0) {
+ rdp->core_needs_qs = false;
raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
} else {
rdp->core_needs_qs = false;
--
2.20.1.321.g9e740568ce-goog
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [RFC] rcu: Avoid unnecessary softirq when system is idle
2019-01-19 16:14 [RFC] rcu: Avoid unnecessary softirq when system is idle Joel Fernandes (Google)
@ 2019-01-20 1:07 ` Paul E. McKenney
0 siblings, 0 replies; 2+ messages in thread
From: Paul E. McKenney @ 2019-01-20 1:07 UTC (permalink / raw)
To: Joel Fernandes (Google)
Cc: linux-kernel, Josh Triplett, Lai Jiangshan, Mathieu Desnoyers,
Steven Rostedt
On Sat, Jan 19, 2019 at 11:14:18AM -0500, Joel Fernandes (Google) wrote:
> When there are no callbacks pending on an idle system, I noticed that
> RCU softirq is continuously firing. During this the cpu_no_qs is set to
> false, and core_needs_qs is set to true indefinitely. This causes
> rcu_process_callbacks to be repeatedly called, even though the node
> corresponding to the CPU has that CPU's mask bit cleared and the system
> is idle. I believe the race is when such mask clearing is done during
> idle CPU scan of the quiescent state forcing stage in the kthread
> instead of the softirq. Since the rnp mask is cleared, but the flags on
> the CPU's rdp are not cleared, the CPU thinks it still needs to report
> to core RCU.
>
> Cure this by clearing the core_needs_qs flag when the CPU detects that
> its node is already updated which will avoid the unwanted softirq raises
> to the benefit of real-time systems.
>
> Test: Ran rcutorture for various tree RCU configs.
>
> Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
Good catch, queued, thank you!
Thanx, Paul
> ---
> kernel/rcu/tree.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
> index 9180158756d2..96ad80c76b15 100644
> --- a/kernel/rcu/tree.c
> +++ b/kernel/rcu/tree.c
> @@ -2273,6 +2273,7 @@ rcu_report_qs_rdp(int cpu, struct rcu_data *rdp)
> }
> mask = rdp->grpmask;
> if ((rnp->qsmask & mask) == 0) {
> + rdp->core_needs_qs = false;
> raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
> } else {
> rdp->core_needs_qs = false;
> --
> 2.20.1.321.g9e740568ce-goog
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2019-01-20 1:07 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-01-19 16:14 [RFC] rcu: Avoid unnecessary softirq when system is idle Joel Fernandes (Google)
2019-01-20 1:07 ` Paul E. McKenney
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).