diff options
author | Neeraj Upadhyay <neeraju@codeaurora.org> | 2021-08-18 13:34:00 +0530 |
---|---|---|
committer | Paul E. McKenney <paulmck@kernel.org> | 2021-09-13 16:32:46 -0700 |
commit | f0b2b2df5423fb369ac762c77900bc7765496d58 (patch) | |
tree | 32e5d09f9bb2e6b621e6585ff370b569ede5e232 /kernel | |
parent | 1eac0075ebeecbf5c972f575ac448a0ea92e4f3a (diff) | |
download | linux-f0b2b2df5423fb369ac762c77900bc7765496d58.tar.gz linux-f0b2b2df5423fb369ac762c77900bc7765496d58.tar.bz2 linux-f0b2b2df5423fb369ac762c77900bc7765496d58.zip |
rcu: Fix existing exp request check in sync_sched_exp_online_cleanup()
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>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/rcu/tree_exp.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/kernel/rcu/tree_exp.h b/kernel/rcu/tree_exp.h index d9e4f8eb9ae2..f3947c49eee7 100644 --- a/kernel/rcu/tree_exp.h +++ b/kernel/rcu/tree_exp.h @@ -759,7 +759,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; } |