diff options
| author | Li RongQing <roy.qing.li@gmail.com> | 2014-01-02 01:24:36 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2014-01-02 19:37:21 -0500 |
| commit | 469bdcefdc47a69028029e792ff1e80680c867b9 (patch) | |
| tree | b04442e9883838102cb2d72249c08857d095ff2a /net/ipv6 | |
| parent | abb6013cca147ad940b0e9fee260d2d9e93b7018 (diff) | |
ipv6: fix the use of pcpu_tstats in ip6_vti.c
when read/write the 64bit data, the correct lock should be hold.
and we can use the generic vti6_get_stats to return stats, and
not define a new one in ip6_vti.c
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>
Diffstat (limited to 'net/ipv6')
| -rw-r--r-- | net/ipv6/ip6_vti.c | 24 |
1 files changed, 3 insertions, 21 deletions
diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c index ed94ba61dda0..a4564b05c47b 100644 --- a/net/ipv6/ip6_vti.c +++ b/net/ipv6/ip6_vti.c | |||
| @@ -75,26 +75,6 @@ struct vti6_net { | |||
| 75 | struct ip6_tnl __rcu **tnls[2]; | 75 | struct ip6_tnl __rcu **tnls[2]; |
| 76 | }; | 76 | }; |
| 77 | 77 | ||
| 78 | static struct net_device_stats *vti6_get_stats(struct net_device *dev) | ||
| 79 | { | ||
| 80 | struct pcpu_tstats sum = { 0 }; | ||
| 81 | int i; | ||
| 82 | |||
| 83 | for_each_possible_cpu(i) { | ||
| 84 | const struct pcpu_tstats *tstats = per_cpu_ptr(dev->tstats, i); | ||
| 85 | |||
| 86 | sum.rx_packets += tstats->rx_packets; | ||
| 87 | sum.rx_bytes += tstats->rx_bytes; | ||
| 88 | sum.tx_packets += tstats->tx_packets; | ||
| 89 | sum.tx_bytes += tstats->tx_bytes; | ||
| 90 | } | ||
| 91 | dev->stats.rx_packets = sum.rx_packets; | ||
| 92 | dev->stats.rx_bytes = sum.rx_bytes; | ||
| 93 | dev->stats.tx_packets = sum.tx_packets; | ||
| 94 | dev->stats.tx_bytes = sum.tx_bytes; | ||
| 95 | return &dev->stats; | ||
| 96 | } | ||
| 97 | |||
| 98 | #define for_each_vti6_tunnel_rcu(start) \ | 78 | #define for_each_vti6_tunnel_rcu(start) \ |
| 99 | for (t = rcu_dereference(start); t; t = rcu_dereference(t->next)) | 79 | for (t = rcu_dereference(start); t; t = rcu_dereference(t->next)) |
| 100 | 80 | ||
| @@ -331,8 +311,10 @@ static int vti6_rcv(struct sk_buff *skb) | |||
| 331 | } | 311 | } |
| 332 | 312 | ||
| 333 | tstats = this_cpu_ptr(t->dev->tstats); | 313 | tstats = this_cpu_ptr(t->dev->tstats); |
| 314 | u64_stats_update_begin(&tstats->syncp); | ||
| 334 | tstats->rx_packets++; | 315 | tstats->rx_packets++; |
| 335 | tstats->rx_bytes += skb->len; | 316 | tstats->rx_bytes += skb->len; |
| 317 | u64_stats_update_end(&tstats->syncp); | ||
| 336 | 318 | ||
| 337 | skb->mark = 0; | 319 | skb->mark = 0; |
| 338 | secpath_reset(skb); | 320 | secpath_reset(skb); |
| @@ -716,7 +698,7 @@ static const struct net_device_ops vti6_netdev_ops = { | |||
| 716 | .ndo_start_xmit = vti6_tnl_xmit, | 698 | .ndo_start_xmit = vti6_tnl_xmit, |
| 717 | .ndo_do_ioctl = vti6_ioctl, | 699 | .ndo_do_ioctl = vti6_ioctl, |
| 718 | .ndo_change_mtu = vti6_change_mtu, | 700 | .ndo_change_mtu = vti6_change_mtu, |
| 719 | .ndo_get_stats = vti6_get_stats, | 701 | .ndo_get_stats64 = ip_tunnel_get_stats64, |
| 720 | }; | 702 | }; |
| 721 | 703 | ||
| 722 | /** | 704 | /** |
