lkml.org 
[lkml]   [2017]   [Feb]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 051/306] pkt_sched: fq: use proper locking in fq_dump_stats()
    3.16.40-rc1 review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Eric Dumazet <edumazet@google.com>

    commit 695b4ec0f0a9cf29deabd3ac075911d58b31f42b upstream.

    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: afe4fd062416 ("pkt_sched: fq: Fair Queue packet scheduler")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    [bwh: Backported to 3.16: keep using ktime_to_ns(ktime_get())]
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    net/sched/sch_fq.c | 32 ++++++++++++++++++--------------
    1 file changed, 18 insertions(+), 14 deletions(-)

    --- a/net/sched/sch_fq.c
    +++ b/net/sched/sch_fq.c
    @@ -789,20 +789,24 @@ nla_put_failure:
    static int fq_dump_stats(struct Qdisc *sch, struct gnet_dump *d)
    {
    struct fq_sched_data *q = qdisc_priv(sch);
    - u64 now = ktime_to_ns(ktime_get());
    - struct tc_fq_qd_stats st = {
    - .gc_flows = q->stat_gc_flows,
    - .highprio_packets = q->stat_internal_packets,
    - .tcp_retrans = q->stat_tcp_retrans,
    - .throttled = q->stat_throttled,
    - .flows_plimit = q->stat_flows_plimit,
    - .pkts_too_long = q->stat_pkts_too_long,
    - .allocation_errors = q->stat_allocation_errors,
    - .flows = q->flows,
    - .inactive_flows = q->inactive_flows,
    - .throttled_flows = q->throttled_flows,
    - .time_next_delayed_flow = q->time_next_delayed_flow - now,
    - };
    + struct tc_fq_qd_stats st;
    +
    + sch_tree_lock(sch);
    +
    + st.gc_flows = q->stat_gc_flows;
    + st.highprio_packets = q->stat_internal_packets;
    + st.tcp_retrans = q->stat_tcp_retrans;
    + st.throttled = q->stat_throttled;
    + st.flows_plimit = q->stat_flows_plimit;
    + st.pkts_too_long = q->stat_pkts_too_long;
    + st.allocation_errors = q->stat_allocation_errors;
    + st.time_next_delayed_flow = q->time_next_delayed_flow - ktime_to_ns(ktime_get());
    + 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));
    }
    \
     
     \ /
      Last update: 2017-02-16 00:35    [W:4.145 / U:0.220 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site