net: sched: Remove Qdisc::running sequence counter
The Qdisc::running sequence counter has two uses:
1. Reliably reading qdisc's tc statistics while the qdisc is running
(a seqcount read/retry loop at gnet_stats_add_basic()).
2. As a flag, indicating whether the qdisc in question is running
(without any retry loops).
For the first usage, the Qdisc::running sequence counter write section,
qdisc_run_begin() => qdisc_run_end(), covers a much wider area than what
is actually needed: the raw qdisc's bstats update. A u64_stats sync
point was thus introduced (in previous commits) inside the bstats
structure itself. A local u64_stats write section is then started and
stopped for the bstats updates.
Use that u64_stats sync point mechanism for the bstats read/retry loop
at gnet_stats_add_basic().
For the second qdisc->running usage, a __QDISC_STATE_RUNNING bit flag,
accessed with atomic bitops, is sufficient. Using a bit flag instead of
a sequence counter at qdisc_run_begin/end() and qdisc_is_running() leads
to the SMP barriers implicitly added through raw_read_seqcount() and
write_seqcount_begin/end() getting removed. All call sites have been
surveyed though, and no required ordering was identified.
Now that the qdisc->running sequence counter is no longer used, remove
it.
Note, using u64_stats implies no sequence counter protection for 64-bit
architectures. This can lead to the qdisc tc statistics "packets" vs.
"bytes" values getting out of sync on rare occasions. The individual
values will still be valid.
Signed-off-by: Ahmed S. Darwish <a.darwish@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
50dc9a8572
commit
29cbcd8582
@@ -501,7 +501,7 @@ int tcf_idr_create(struct tc_action_net *tn, u32 index, struct nlattr *est,
|
||||
if (est) {
|
||||
err = gen_new_estimator(&p->tcfa_bstats, p->cpu_bstats,
|
||||
&p->tcfa_rate_est,
|
||||
&p->tcfa_lock, NULL, est);
|
||||
&p->tcfa_lock, false, est);
|
||||
if (err)
|
||||
goto err4;
|
||||
}
|
||||
@@ -1173,9 +1173,10 @@ int tcf_action_copy_stats(struct sk_buff *skb, struct tc_action *p,
|
||||
if (err < 0)
|
||||
goto errout;
|
||||
|
||||
if (gnet_stats_copy_basic(NULL, &d, p->cpu_bstats, &p->tcfa_bstats) < 0 ||
|
||||
gnet_stats_copy_basic_hw(NULL, &d, p->cpu_bstats_hw,
|
||||
&p->tcfa_bstats_hw) < 0 ||
|
||||
if (gnet_stats_copy_basic(&d, p->cpu_bstats,
|
||||
&p->tcfa_bstats, false) < 0 ||
|
||||
gnet_stats_copy_basic_hw(&d, p->cpu_bstats_hw,
|
||||
&p->tcfa_bstats_hw, false) < 0 ||
|
||||
gnet_stats_copy_rate_est(&d, &p->tcfa_rate_est) < 0 ||
|
||||
gnet_stats_copy_queue(&d, p->cpu_qstats,
|
||||
&p->tcfa_qstats,
|
||||
|
||||
Reference in New Issue
Block a user