lkml.org 
[lkml]   [2017]   [Mar]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.12 101/113] ipv6: fix the use of pcpu_tstats in ip6_tunnel
    Date
    From: Li RongQing <roy.qing.li@gmail.com>

    3.12-stable review patch. If anyone has any objections, please let me know.

    ===============

    commit abb6013cca147ad940b0e9fee260d2d9e93b7018 upstream.

    when read/write the 64bit data, the correct lock should be hold.

    Fixes: 87b6d218f3adb ("tunnel: implement 64 bits statistics")

    Cc: Stephen Hemminger <stephen@networkplumber.org>
    Cc: Eric Dumazet <edumazet@google.com>
    Signed-off-by: Li RongQing <roy.qing.li@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    ---
    net/ipv6/ip6_tunnel.c | 21 ++++++++++++++++-----
    1 file changed, 16 insertions(+), 5 deletions(-)

    diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
    index c47708fac826..509fbc805017 100644
    --- a/net/ipv6/ip6_tunnel.c
    +++ b/net/ipv6/ip6_tunnel.c
    @@ -104,16 +104,25 @@ struct ip6_tnl_net {

    static struct net_device_stats *ip6_get_stats(struct net_device *dev)
    {
    - struct pcpu_tstats sum = { 0 };
    + struct pcpu_tstats tmp, sum = { 0 };
    int i;

    for_each_possible_cpu(i) {
    + unsigned int start;
    const struct pcpu_tstats *tstats = per_cpu_ptr(dev->tstats, i);

    - sum.rx_packets += tstats->rx_packets;
    - sum.rx_bytes += tstats->rx_bytes;
    - sum.tx_packets += tstats->tx_packets;
    - sum.tx_bytes += tstats->tx_bytes;
    + do {
    + start = u64_stats_fetch_begin_bh(&tstats->syncp);
    + tmp.rx_packets = tstats->rx_packets;
    + tmp.rx_bytes = tstats->rx_bytes;
    + tmp.tx_packets = tstats->tx_packets;
    + tmp.tx_bytes = tstats->tx_bytes;
    + } while (u64_stats_fetch_retry_bh(&tstats->syncp, start));
    +
    + sum.rx_packets += tmp.rx_packets;
    + sum.rx_bytes += tmp.rx_bytes;
    + sum.tx_packets += tmp.tx_packets;
    + sum.tx_bytes += tmp.tx_bytes;
    }
    dev->stats.rx_packets = sum.rx_packets;
    dev->stats.rx_bytes = sum.rx_bytes;
    @@ -832,8 +841,10 @@ static int ip6_tnl_rcv(struct sk_buff *skb, __u16 protocol,
    }

    tstats = this_cpu_ptr(t->dev->tstats);
    + u64_stats_update_begin(&tstats->syncp);
    tstats->rx_packets++;
    tstats->rx_bytes += skb->len;
    + u64_stats_update_end(&tstats->syncp);

    netif_rx(skb);

    --
    2.12.0
    \
     
     \ /
      Last update: 2017-03-06 10:22    [W:4.691 / U:0.108 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site