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) <j...@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
> 

Reply via email to