diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2010-06-23 20:55:06 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-06-29 02:24:31 -0400 |
commit | 9618e2ffd78aaa43a5815e1dd456b4dd95f9e53b (patch) | |
tree | 2d75562cd72aa8492154054b90a6d659a80ac4ee | |
parent | bc66154efe163a80f269d448572f7906756e9338 (diff) |
vlan: 64 bit rx counters
Use u64_stats_sync infrastructure to implement 64bit rx stats.
(tx stats are addressed later)
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Acked-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/8021q/vlan.h | 13 | ||||
-rw-r--r-- | net/8021q/vlan_core.c | 7 | ||||
-rw-r--r-- | net/8021q/vlan_dev.c | 46 |
3 files changed, 41 insertions, 25 deletions
diff --git a/net/8021q/vlan.h b/net/8021q/vlan.h index 6abdcac1b2e8..8d9503ad01da 100644 --- a/net/8021q/vlan.h +++ b/net/8021q/vlan.h | |||
@@ -2,6 +2,7 @@ | |||
2 | #define __BEN_VLAN_802_1Q_INC__ | 2 | #define __BEN_VLAN_802_1Q_INC__ |
3 | 3 | ||
4 | #include <linux/if_vlan.h> | 4 | #include <linux/if_vlan.h> |
5 | #include <linux/u64_stats_sync.h> | ||
5 | 6 | ||
6 | 7 | ||
7 | /** | 8 | /** |
@@ -21,14 +22,16 @@ struct vlan_priority_tci_mapping { | |||
21 | * struct vlan_rx_stats - VLAN percpu rx stats | 22 | * struct vlan_rx_stats - VLAN percpu rx stats |
22 | * @rx_packets: number of received packets | 23 | * @rx_packets: number of received packets |
23 | * @rx_bytes: number of received bytes | 24 | * @rx_bytes: number of received bytes |
24 | * @multicast: number of received multicast packets | 25 | * @rx_multicast: number of received multicast packets |
26 | * @syncp: synchronization point for 64bit counters | ||
25 | * @rx_errors: number of errors | 27 | * @rx_errors: number of errors |
26 | */ | 28 | */ |
27 | struct vlan_rx_stats { | 29 | struct vlan_rx_stats { |
28 | unsigned long rx_packets; | 30 | u64 rx_packets; |
29 | unsigned long rx_bytes; | 31 | u64 rx_bytes; |
30 | unsigned long multicast; | 32 | u64 rx_multicast; |
31 | unsigned long rx_errors; | 33 | struct u64_stats_sync syncp; |
34 | unsigned long rx_errors; | ||
32 | }; | 35 | }; |
33 | 36 | ||
34 | /** | 37 | /** |
diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c index 50f58f5f1c34..1b9406a31f0c 100644 --- a/net/8021q/vlan_core.c +++ b/net/8021q/vlan_core.c | |||
@@ -41,9 +41,9 @@ int vlan_hwaccel_do_receive(struct sk_buff *skb) | |||
41 | skb->priority = vlan_get_ingress_priority(dev, skb->vlan_tci); | 41 | skb->priority = vlan_get_ingress_priority(dev, skb->vlan_tci); |
42 | skb->vlan_tci = 0; | 42 | skb->vlan_tci = 0; |
43 | 43 | ||
44 | rx_stats = per_cpu_ptr(vlan_dev_info(dev)->vlan_rx_stats, | 44 | rx_stats = this_cpu_ptr(vlan_dev_info(dev)->vlan_rx_stats); |
45 | smp_processor_id()); | ||
46 | 45 | ||
46 | u64_stats_update_begin(&rx_stats->syncp); | ||
47 | rx_stats->rx_packets++; | 47 | rx_stats->rx_packets++; |
48 | rx_stats->rx_bytes += skb->len; | 48 | rx_stats->rx_bytes += skb->len; |
49 | 49 | ||
@@ -51,7 +51,7 @@ int vlan_hwaccel_do_receive(struct sk_buff *skb) | |||
51 | case PACKET_BROADCAST: | 51 | case PACKET_BROADCAST: |
52 | break; | 52 | break; |
53 | case PACKET_MULTICAST: | 53 | case PACKET_MULTICAST: |
54 | rx_stats->multicast++; | 54 | rx_stats->rx_multicast++; |
55 | break; | 55 | break; |
56 | case PACKET_OTHERHOST: | 56 | case PACKET_OTHERHOST: |
57 | /* Our lower layer thinks this is not local, let's make sure. | 57 | /* Our lower layer thinks this is not local, let's make sure. |
@@ -62,6 +62,7 @@ int vlan_hwaccel_do_receive(struct sk_buff *skb) | |||
62 | skb->pkt_type = PACKET_HOST; | 62 | skb->pkt_type = PACKET_HOST; |
63 | break; | 63 | break; |
64 | } | 64 | } |
65 | u64_stats_update_end(&rx_stats->syncp); | ||
65 | return 0; | 66 | return 0; |
66 | } | 67 | } |
67 | 68 | ||
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index 529842677817..c6456cb842fa 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c | |||
@@ -166,6 +166,7 @@ int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev, | |||
166 | 166 | ||
167 | rx_stats = per_cpu_ptr(vlan_dev_info(skb->dev)->vlan_rx_stats, | 167 | rx_stats = per_cpu_ptr(vlan_dev_info(skb->dev)->vlan_rx_stats, |
168 | smp_processor_id()); | 168 | smp_processor_id()); |
169 | u64_stats_update_begin(&rx_stats->syncp); | ||
169 | rx_stats->rx_packets++; | 170 | rx_stats->rx_packets++; |
170 | rx_stats->rx_bytes += skb->len; | 171 | rx_stats->rx_bytes += skb->len; |
171 | 172 | ||
@@ -182,7 +183,7 @@ int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev, | |||
182 | break; | 183 | break; |
183 | 184 | ||
184 | case PACKET_MULTICAST: | 185 | case PACKET_MULTICAST: |
185 | rx_stats->multicast++; | 186 | rx_stats->rx_multicast++; |
186 | break; | 187 | break; |
187 | 188 | ||
188 | case PACKET_OTHERHOST: | 189 | case PACKET_OTHERHOST: |
@@ -197,6 +198,7 @@ int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev, | |||
197 | default: | 198 | default: |
198 | break; | 199 | break; |
199 | } | 200 | } |
201 | u64_stats_update_end(&rx_stats->syncp); | ||
200 | 202 | ||
201 | vlan_set_encap_proto(skb, vhdr); | 203 | vlan_set_encap_proto(skb, vhdr); |
202 | 204 | ||
@@ -801,27 +803,37 @@ static u32 vlan_ethtool_get_flags(struct net_device *dev) | |||
801 | return dev_ethtool_get_flags(vlan->real_dev); | 803 | return dev_ethtool_get_flags(vlan->real_dev); |
802 | } | 804 | } |
803 | 805 | ||
804 | static struct net_device_stats *vlan_dev_get_stats(struct net_device *dev) | 806 | static struct rtnl_link_stats64 *vlan_dev_get_stats64(struct net_device *dev) |
805 | { | 807 | { |
806 | struct net_device_stats *stats = &dev->stats; | 808 | struct rtnl_link_stats64 *stats = &dev->stats64; |
807 | 809 | ||
808 | dev_txq_stats_fold(dev, stats); | 810 | dev_txq_stats_fold(dev, &dev->stats); |
809 | 811 | ||
810 | if (vlan_dev_info(dev)->vlan_rx_stats) { | 812 | if (vlan_dev_info(dev)->vlan_rx_stats) { |
811 | struct vlan_rx_stats *p, rx = {0}; | 813 | struct vlan_rx_stats *p, accum = {0}; |
812 | int i; | 814 | int i; |
813 | 815 | ||
814 | for_each_possible_cpu(i) { | 816 | for_each_possible_cpu(i) { |
817 | u64 rxpackets, rxbytes, rxmulticast; | ||
818 | unsigned int start; | ||
819 | |||
815 | p = per_cpu_ptr(vlan_dev_info(dev)->vlan_rx_stats, i); | 820 | p = per_cpu_ptr(vlan_dev_info(dev)->vlan_rx_stats, i); |
816 | rx.rx_packets += p->rx_packets; | 821 | do { |
817 | rx.rx_bytes += p->rx_bytes; | 822 | start = u64_stats_fetch_begin_bh(&p->syncp); |
818 | rx.rx_errors += p->rx_errors; | 823 | rxpackets = p->rx_packets; |
819 | rx.multicast += p->multicast; | 824 | rxbytes = p->rx_bytes; |
825 | rxmulticast = p->rx_multicast; | ||
826 | } while (u64_stats_fetch_retry_bh(&p->syncp, start)); | ||
827 | accum.rx_packets += rxpackets; | ||
828 | accum.rx_bytes += rxbytes; | ||
829 | accum.rx_multicast += rxmulticast; | ||
830 | /* rx_errors is an ulong, not protected by syncp */ | ||
831 | accum.rx_errors += p->rx_errors; | ||
820 | } | 832 | } |
821 | stats->rx_packets = rx.rx_packets; | 833 | stats->rx_packets = accum.rx_packets; |
822 | stats->rx_bytes = rx.rx_bytes; | 834 | stats->rx_bytes = accum.rx_bytes; |
823 | stats->rx_errors = rx.rx_errors; | 835 | stats->rx_errors = accum.rx_errors; |
824 | stats->multicast = rx.multicast; | 836 | stats->multicast = accum.rx_multicast; |
825 | } | 837 | } |
826 | return stats; | 838 | return stats; |
827 | } | 839 | } |
@@ -848,7 +860,7 @@ static const struct net_device_ops vlan_netdev_ops = { | |||
848 | .ndo_change_rx_flags = vlan_dev_change_rx_flags, | 860 | .ndo_change_rx_flags = vlan_dev_change_rx_flags, |
849 | .ndo_do_ioctl = vlan_dev_ioctl, | 861 | .ndo_do_ioctl = vlan_dev_ioctl, |
850 | .ndo_neigh_setup = vlan_dev_neigh_setup, | 862 | .ndo_neigh_setup = vlan_dev_neigh_setup, |
851 | .ndo_get_stats = vlan_dev_get_stats, | 863 | .ndo_get_stats64 = vlan_dev_get_stats64, |
852 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) | 864 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) |
853 | .ndo_fcoe_ddp_setup = vlan_dev_fcoe_ddp_setup, | 865 | .ndo_fcoe_ddp_setup = vlan_dev_fcoe_ddp_setup, |
854 | .ndo_fcoe_ddp_done = vlan_dev_fcoe_ddp_done, | 866 | .ndo_fcoe_ddp_done = vlan_dev_fcoe_ddp_done, |
@@ -872,7 +884,7 @@ static const struct net_device_ops vlan_netdev_accel_ops = { | |||
872 | .ndo_change_rx_flags = vlan_dev_change_rx_flags, | 884 | .ndo_change_rx_flags = vlan_dev_change_rx_flags, |
873 | .ndo_do_ioctl = vlan_dev_ioctl, | 885 | .ndo_do_ioctl = vlan_dev_ioctl, |
874 | .ndo_neigh_setup = vlan_dev_neigh_setup, | 886 | .ndo_neigh_setup = vlan_dev_neigh_setup, |
875 | .ndo_get_stats = vlan_dev_get_stats, | 887 | .ndo_get_stats64 = vlan_dev_get_stats64, |
876 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) | 888 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) |
877 | .ndo_fcoe_ddp_setup = vlan_dev_fcoe_ddp_setup, | 889 | .ndo_fcoe_ddp_setup = vlan_dev_fcoe_ddp_setup, |
878 | .ndo_fcoe_ddp_done = vlan_dev_fcoe_ddp_done, | 890 | .ndo_fcoe_ddp_done = vlan_dev_fcoe_ddp_done, |
@@ -897,7 +909,7 @@ static const struct net_device_ops vlan_netdev_ops_sq = { | |||
897 | .ndo_change_rx_flags = vlan_dev_change_rx_flags, | 909 | .ndo_change_rx_flags = vlan_dev_change_rx_flags, |
898 | .ndo_do_ioctl = vlan_dev_ioctl, | 910 | .ndo_do_ioctl = vlan_dev_ioctl, |
899 | .ndo_neigh_setup = vlan_dev_neigh_setup, | 911 | .ndo_neigh_setup = vlan_dev_neigh_setup, |
900 | .ndo_get_stats = vlan_dev_get_stats, | 912 | .ndo_get_stats64 = vlan_dev_get_stats64, |
901 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) | 913 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) |
902 | .ndo_fcoe_ddp_setup = vlan_dev_fcoe_ddp_setup, | 914 | .ndo_fcoe_ddp_setup = vlan_dev_fcoe_ddp_setup, |
903 | .ndo_fcoe_ddp_done = vlan_dev_fcoe_ddp_done, | 915 | .ndo_fcoe_ddp_done = vlan_dev_fcoe_ddp_done, |
@@ -922,7 +934,7 @@ static const struct net_device_ops vlan_netdev_accel_ops_sq = { | |||
922 | .ndo_change_rx_flags = vlan_dev_change_rx_flags, | 934 | .ndo_change_rx_flags = vlan_dev_change_rx_flags, |
923 | .ndo_do_ioctl = vlan_dev_ioctl, | 935 | .ndo_do_ioctl = vlan_dev_ioctl, |
924 | .ndo_neigh_setup = vlan_dev_neigh_setup, | 936 | .ndo_neigh_setup = vlan_dev_neigh_setup, |
925 | .ndo_get_stats = vlan_dev_get_stats, | 937 | .ndo_get_stats64 = vlan_dev_get_stats64, |
926 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) | 938 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) |
927 | .ndo_fcoe_ddp_setup = vlan_dev_fcoe_ddp_setup, | 939 | .ndo_fcoe_ddp_setup = vlan_dev_fcoe_ddp_setup, |
928 | .ndo_fcoe_ddp_done = vlan_dev_fcoe_ddp_done, | 940 | .ndo_fcoe_ddp_done = vlan_dev_fcoe_ddp_done, |