Commit 3116a32e authored by Valentin Schneider's avatar Valentin Schneider Committed by Neeraj Upadhyay

rcu: Rename rcu_dynticks_in_eqs_since() into rcu_watching_snap_stopped_since()

The context_tracking.state RCU_DYNTICKS subvariable has been renamed to
RCU_WATCHING, the dynticks prefix can go.

While at it, this helper is only meant to be called after failing an
earlier call to rcu_watching_snap_in_eqs(), document this in the comments
and add a WARN_ON_ONCE() for good measure.
Signed-off-by: default avatarValentin Schneider <vschneid@redhat.com>
Reviewed-by: default avatarFrederic Weisbecker <frederic@kernel.org>
Signed-off-by: default avatarNeeraj Upadhyay <neeraj.upadhyay@kernel.org>
parent 9629936d
...@@ -150,7 +150,7 @@ This case is handled by calls to the strongly ordered ...@@ -150,7 +150,7 @@ This case is handled by calls to the strongly ordered
is invoked within ``rcu_dynticks_eqs_enter()`` at idle-entry is invoked within ``rcu_dynticks_eqs_enter()`` at idle-entry
time and within ``rcu_dynticks_eqs_exit()`` at idle-exit time. time and within ``rcu_dynticks_eqs_exit()`` at idle-exit time.
The grace-period kthread invokes first ``ct_rcu_watching_cpu_acquire()`` The grace-period kthread invokes first ``ct_rcu_watching_cpu_acquire()``
(preceded by a full memory barrier) and ``rcu_dynticks_in_eqs_since()`` (preceded by a full memory barrier) and ``rcu_watching_snap_stopped_since()``
(both of which rely on acquire semantics) to detect idle CPUs. (both of which rely on acquire semantics) to detect idle CPUs.
+-----------------------------------------------------------------------+ +-----------------------------------------------------------------------+
......
...@@ -308,12 +308,20 @@ static bool rcu_watching_snap_in_eqs(int snap) ...@@ -308,12 +308,20 @@ static bool rcu_watching_snap_in_eqs(int snap)
return !(snap & CT_RCU_WATCHING); return !(snap & CT_RCU_WATCHING);
} }
/* /**
* Return true if the CPU corresponding to the specified rcu_data * rcu_watching_snap_stopped_since() - Has RCU stopped watching a given CPU
* structure has spent some time in an extended quiescent state since * since the specified @snap?
* rcu_dynticks_snap() returned the specified snapshot. *
* @rdp: The rcu_data corresponding to the CPU for which to check EQS.
* @snap: rcu_watching snapshot taken when the CPU wasn't in an EQS.
*
* Returns true if the CPU corresponding to @rdp has spent some time in an
* extended quiescent state since @snap. Note that this doesn't check if it
* /still/ is in an EQS, just that it went through one since @snap.
*
* This is meant to be used in a loop waiting for a CPU to go through an EQS.
*/ */
static bool rcu_dynticks_in_eqs_since(struct rcu_data *rdp, int snap) static bool rcu_watching_snap_stopped_since(struct rcu_data *rdp, int snap)
{ {
/* /*
* The first failing snapshot is already ordered against the accesses * The first failing snapshot is already ordered against the accesses
...@@ -323,6 +331,9 @@ static bool rcu_dynticks_in_eqs_since(struct rcu_data *rdp, int snap) ...@@ -323,6 +331,9 @@ static bool rcu_dynticks_in_eqs_since(struct rcu_data *rdp, int snap)
* performed by the remote CPU prior to entering idle and therefore can * performed by the remote CPU prior to entering idle and therefore can
* rely solely on acquire semantics. * rely solely on acquire semantics.
*/ */
if (WARN_ON_ONCE(rcu_watching_snap_in_eqs(snap)))
return true;
return snap != ct_rcu_watching_cpu_acquire(rdp->cpu); return snap != ct_rcu_watching_cpu_acquire(rdp->cpu);
} }
...@@ -815,7 +826,7 @@ static int rcu_implicit_dynticks_qs(struct rcu_data *rdp) ...@@ -815,7 +826,7 @@ static int rcu_implicit_dynticks_qs(struct rcu_data *rdp)
* read-side critical section that started before the beginning * read-side critical section that started before the beginning
* of the current RCU grace period. * of the current RCU grace period.
*/ */
if (rcu_dynticks_in_eqs_since(rdp, rdp->dynticks_snap)) { if (rcu_watching_snap_stopped_since(rdp, rdp->dynticks_snap)) {
trace_rcu_fqs(rcu_state.name, rdp->gp_seq, rdp->cpu, TPS("dti")); trace_rcu_fqs(rcu_state.name, rdp->gp_seq, rdp->cpu, TPS("dti"));
rcu_gpnum_ovf(rnp, rdp); rcu_gpnum_ovf(rnp, rdp);
return 1; return 1;
......
...@@ -400,7 +400,7 @@ static void __sync_rcu_exp_select_node_cpus(struct rcu_exp_work *rewp) ...@@ -400,7 +400,7 @@ static void __sync_rcu_exp_select_node_cpus(struct rcu_exp_work *rewp)
unsigned long mask = rdp->grpmask; unsigned long mask = rdp->grpmask;
retry_ipi: retry_ipi:
if (rcu_dynticks_in_eqs_since(rdp, rdp->exp_dynticks_snap)) { if (rcu_watching_snap_stopped_since(rdp, rdp->exp_dynticks_snap)) {
mask_ofl_test |= mask; mask_ofl_test |= mask;
continue; continue;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment