pkt_sched: fq: use proper locking in fq_dump_stats()
When fq is used on 32bit kernels, we need to lock the qdisc before
copying 64bit fields.
Otherwise "tc -s qdisc ..." might report bogus values.
Fixes: afe4fd0624
("pkt_sched: fq: Fair Queue packet scheduler")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
db74a3335e
commit
695b4ec0f0
|
@ -823,20 +823,24 @@ nla_put_failure:
|
||||||
static int fq_dump_stats(struct Qdisc *sch, struct gnet_dump *d)
|
static int fq_dump_stats(struct Qdisc *sch, struct gnet_dump *d)
|
||||||
{
|
{
|
||||||
struct fq_sched_data *q = qdisc_priv(sch);
|
struct fq_sched_data *q = qdisc_priv(sch);
|
||||||
u64 now = ktime_get_ns();
|
struct tc_fq_qd_stats st;
|
||||||
struct tc_fq_qd_stats st = {
|
|
||||||
.gc_flows = q->stat_gc_flows,
|
sch_tree_lock(sch);
|
||||||
.highprio_packets = q->stat_internal_packets,
|
|
||||||
.tcp_retrans = q->stat_tcp_retrans,
|
st.gc_flows = q->stat_gc_flows;
|
||||||
.throttled = q->stat_throttled,
|
st.highprio_packets = q->stat_internal_packets;
|
||||||
.flows_plimit = q->stat_flows_plimit,
|
st.tcp_retrans = q->stat_tcp_retrans;
|
||||||
.pkts_too_long = q->stat_pkts_too_long,
|
st.throttled = q->stat_throttled;
|
||||||
.allocation_errors = q->stat_allocation_errors,
|
st.flows_plimit = q->stat_flows_plimit;
|
||||||
.flows = q->flows,
|
st.pkts_too_long = q->stat_pkts_too_long;
|
||||||
.inactive_flows = q->inactive_flows,
|
st.allocation_errors = q->stat_allocation_errors;
|
||||||
.throttled_flows = q->throttled_flows,
|
st.time_next_delayed_flow = q->time_next_delayed_flow - ktime_get_ns();
|
||||||
.time_next_delayed_flow = q->time_next_delayed_flow - now,
|
st.flows = q->flows;
|
||||||
};
|
st.inactive_flows = q->inactive_flows;
|
||||||
|
st.throttled_flows = q->throttled_flows;
|
||||||
|
st.pad = 0;
|
||||||
|
|
||||||
|
sch_tree_unlock(sch);
|
||||||
|
|
||||||
return gnet_stats_copy_app(d, &st, sizeof(st));
|
return gnet_stats_copy_app(d, &st, sizeof(st));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue