rcu: Remove full memory barrier on RCU stall printout
RCU stall printout fetches the EQS state of a CPU with a preceding full memory barrier. However there is nothing to order this read against at this debugging stage. It is inherently racy when performed remotely. Do a plain read instead. This was the last user of rcu_dynticks_snap(). Signed-off-by: Frederic Weisbecker <frederic@kernel.org> Signed-off-by: Paul E. McKenney <paulmck@kernel.org> Reviewed-by: Boqun Feng <boqun.feng@gmail.com> Reviewed-by: Neeraj Upadhyay <neeraj.upadhyay@kernel.org>
This commit is contained in:
committed by
Paul E. McKenney
parent
e7a3c8ea6e
commit
55911a9f42
@@ -295,16 +295,6 @@ static void rcu_dynticks_eqs_online(void)
|
|||||||
ct_state_inc(RCU_DYNTICKS_IDX);
|
ct_state_inc(RCU_DYNTICKS_IDX);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Snapshot the ->dynticks counter with full ordering so as to allow
|
|
||||||
* stable comparison of this counter with past and future snapshots.
|
|
||||||
*/
|
|
||||||
static int rcu_dynticks_snap(int cpu)
|
|
||||||
{
|
|
||||||
smp_mb(); // Fundamental RCU ordering guarantee.
|
|
||||||
return ct_dynticks_cpu_acquire(cpu);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return true if the snapshot returned from rcu_dynticks_snap()
|
* Return true if the snapshot returned from rcu_dynticks_snap()
|
||||||
* indicates that RCU is in an extended quiescent state.
|
* indicates that RCU is in an extended quiescent state.
|
||||||
|
|||||||
@@ -501,7 +501,7 @@ static void print_cpu_stall_info(int cpu)
|
|||||||
}
|
}
|
||||||
delta = rcu_seq_ctr(rdp->mynode->gp_seq - rdp->rcu_iw_gp_seq);
|
delta = rcu_seq_ctr(rdp->mynode->gp_seq - rdp->rcu_iw_gp_seq);
|
||||||
falsepositive = rcu_is_gp_kthread_starving(NULL) &&
|
falsepositive = rcu_is_gp_kthread_starving(NULL) &&
|
||||||
rcu_dynticks_in_eqs(rcu_dynticks_snap(cpu));
|
rcu_dynticks_in_eqs(ct_dynticks_cpu(cpu));
|
||||||
rcuc_starved = rcu_is_rcuc_kthread_starving(rdp, &j);
|
rcuc_starved = rcu_is_rcuc_kthread_starving(rdp, &j);
|
||||||
if (rcuc_starved)
|
if (rcuc_starved)
|
||||||
// Print signed value, as negative values indicate a probable bug.
|
// Print signed value, as negative values indicate a probable bug.
|
||||||
@@ -515,7 +515,7 @@ static void print_cpu_stall_info(int cpu)
|
|||||||
rdp->rcu_iw_pending ? (int)min(delta, 9UL) + '0' :
|
rdp->rcu_iw_pending ? (int)min(delta, 9UL) + '0' :
|
||||||
"!."[!delta],
|
"!."[!delta],
|
||||||
ticks_value, ticks_title,
|
ticks_value, ticks_title,
|
||||||
rcu_dynticks_snap(cpu) & 0xffff,
|
ct_dynticks_cpu(cpu) & 0xffff,
|
||||||
ct_dynticks_nesting_cpu(cpu), ct_dynticks_nmi_nesting_cpu(cpu),
|
ct_dynticks_nesting_cpu(cpu), ct_dynticks_nmi_nesting_cpu(cpu),
|
||||||
rdp->softirq_snap, kstat_softirqs_cpu(RCU_SOFTIRQ, cpu),
|
rdp->softirq_snap, kstat_softirqs_cpu(RCU_SOFTIRQ, cpu),
|
||||||
data_race(rcu_state.n_force_qs) - rcu_state.n_force_qs_gpstart,
|
data_race(rcu_state.n_force_qs) - rcu_state.n_force_qs_gpstart,
|
||||||
|
|||||||
Reference in New Issue
Block a user