| From fcae45b9a940a7ac037f104acb80da97bb804bbf Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 18 Aug 2021 13:34:00 +0530 |
| Subject: rcu: Fix existing exp request check in |
| sync_sched_exp_online_cleanup() |
| |
| From: Neeraj Upadhyay <neeraju@codeaurora.org> |
| |
| [ Upstream commit f0b2b2df5423fb369ac762c77900bc7765496d58 ] |
| |
| The sync_sched_exp_online_cleanup() checks to see if RCU needs |
| an expedited quiescent state from the incoming CPU, sending it |
| an IPI if so. Before sending IPI, it checks whether expedited |
| qs need has been already requested for the incoming CPU, by |
| checking rcu_data.cpu_no_qs.b.exp for the current cpu, on which |
| sync_sched_exp_online_cleanup() is running. This works for the |
| case where incoming CPU is same as self. However, for the case |
| where incoming CPU is different from self, expedited request |
| won't get marked, which can potentially delay reporting of |
| expedited quiescent state for the incoming CPU. |
| |
| Fixes: e015a3411220 ("rcu: Avoid self-IPI in sync_sched_exp_online_cleanup()") |
| Signed-off-by: Neeraj Upadhyay <neeraju@codeaurora.org> |
| Signed-off-by: Paul E. McKenney <paulmck@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| kernel/rcu/tree_exp.h | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/kernel/rcu/tree_exp.h b/kernel/rcu/tree_exp.h |
| index df90d4d7ad2e2..4c4d7683a4e5b 100644 |
| --- a/kernel/rcu/tree_exp.h |
| +++ b/kernel/rcu/tree_exp.h |
| @@ -738,7 +738,7 @@ static void sync_sched_exp_online_cleanup(int cpu) |
| my_cpu = get_cpu(); |
| /* Quiescent state either not needed or already requested, leave. */ |
| if (!(READ_ONCE(rnp->expmask) & rdp->grpmask) || |
| - __this_cpu_read(rcu_data.cpu_no_qs.b.exp)) { |
| + rdp->cpu_no_qs.b.exp) { |
| put_cpu(); |
| return; |
| } |
| -- |
| 2.33.0 |
| |