diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2010-09-19 20:12:11 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-09-20 13:08:58 -0400 |
commit | 8990f468ae9010ab0af4be8f51bf7ab833a67202 (patch) | |
tree | e84ad358ed67da6011b1e20f3d8039d1f9f07e4a | |
parent | 462fb2af9788a82a534f8184abfde31574e1cfa0 (diff) |
net: rx_dropped accounting
Under load, netif_rx() can drop incoming packets but administrators dont
have a chance to spot which device needs some tuning (RPS activation for
example)
This patch adds rx_dropped accounting in vlans and tunnels.
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/8021q/vlan.h | 2 | ||||
-rw-r--r-- | net/8021q/vlan_dev.c | 9 | ||||
-rw-r--r-- | net/ipv4/ip_gre.c | 6 | ||||
-rw-r--r-- | net/ipv4/ipip.c | 5 | ||||
-rw-r--r-- | net/ipv6/ip6_tunnel.c | 5 | ||||
-rw-r--r-- | net/ipv6/ip6mr.c | 4 | ||||
-rw-r--r-- | net/ipv6/sit.c | 5 |
7 files changed, 28 insertions, 8 deletions
diff --git a/net/8021q/vlan.h b/net/8021q/vlan.h index 8d9503ad01da..b26ce343072c 100644 --- a/net/8021q/vlan.h +++ b/net/8021q/vlan.h | |||
@@ -25,6 +25,7 @@ struct vlan_priority_tci_mapping { | |||
25 | * @rx_multicast: number of received multicast packets | 25 | * @rx_multicast: number of received multicast packets |
26 | * @syncp: synchronization point for 64bit counters | 26 | * @syncp: synchronization point for 64bit counters |
27 | * @rx_errors: number of errors | 27 | * @rx_errors: number of errors |
28 | * @rx_dropped: number of dropped packets | ||
28 | */ | 29 | */ |
29 | struct vlan_rx_stats { | 30 | struct vlan_rx_stats { |
30 | u64 rx_packets; | 31 | u64 rx_packets; |
@@ -32,6 +33,7 @@ struct vlan_rx_stats { | |||
32 | u64 rx_multicast; | 33 | u64 rx_multicast; |
33 | struct u64_stats_sync syncp; | 34 | struct u64_stats_sync syncp; |
34 | unsigned long rx_errors; | 35 | unsigned long rx_errors; |
36 | unsigned long rx_dropped; | ||
35 | }; | 37 | }; |
36 | 38 | ||
37 | /** | 39 | /** |
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index 3bccdd12a264..94a1feddeb49 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c | |||
@@ -225,7 +225,10 @@ int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev, | |||
225 | } | 225 | } |
226 | } | 226 | } |
227 | 227 | ||
228 | netif_rx(skb); | 228 | if (unlikely(netif_rx(skb) == NET_RX_DROP)) { |
229 | if (rx_stats) | ||
230 | rx_stats->rx_dropped++; | ||
231 | } | ||
229 | rcu_read_unlock(); | 232 | rcu_read_unlock(); |
230 | return NET_RX_SUCCESS; | 233 | return NET_RX_SUCCESS; |
231 | 234 | ||
@@ -843,13 +846,15 @@ static struct rtnl_link_stats64 *vlan_dev_get_stats64(struct net_device *dev, st | |||
843 | accum.rx_packets += rxpackets; | 846 | accum.rx_packets += rxpackets; |
844 | accum.rx_bytes += rxbytes; | 847 | accum.rx_bytes += rxbytes; |
845 | accum.rx_multicast += rxmulticast; | 848 | accum.rx_multicast += rxmulticast; |
846 | /* rx_errors is an ulong, not protected by syncp */ | 849 | /* rx_errors, rx_dropped are ulong, not protected by syncp */ |
847 | accum.rx_errors += p->rx_errors; | 850 | accum.rx_errors += p->rx_errors; |
851 | accum.rx_dropped += p->rx_dropped; | ||
848 | } | 852 | } |
849 | stats->rx_packets = accum.rx_packets; | 853 | stats->rx_packets = accum.rx_packets; |
850 | stats->rx_bytes = accum.rx_bytes; | 854 | stats->rx_bytes = accum.rx_bytes; |
851 | stats->rx_errors = accum.rx_errors; | 855 | stats->rx_errors = accum.rx_errors; |
852 | stats->multicast = accum.rx_multicast; | 856 | stats->multicast = accum.rx_multicast; |
857 | stats->rx_dropped = accum.rx_dropped; | ||
853 | } | 858 | } |
854 | return stats; | 859 | return stats; |
855 | } | 860 | } |
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index fc20e687e933..714b6a80361d 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c | |||
@@ -647,9 +647,11 @@ static int ipgre_rcv(struct sk_buff *skb) | |||
647 | skb_reset_network_header(skb); | 647 | skb_reset_network_header(skb); |
648 | ipgre_ecn_decapsulate(iph, skb); | 648 | ipgre_ecn_decapsulate(iph, skb); |
649 | 649 | ||
650 | netif_rx(skb); | 650 | if (netif_rx(skb) == NET_RX_DROP) |
651 | stats->rx_dropped++; | ||
652 | |||
651 | rcu_read_unlock(); | 653 | rcu_read_unlock(); |
652 | return(0); | 654 | return 0; |
653 | } | 655 | } |
654 | icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0); | 656 | icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0); |
655 | 657 | ||
diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c index 8de8888dc95a..babd25278106 100644 --- a/net/ipv4/ipip.c +++ b/net/ipv4/ipip.c | |||
@@ -377,7 +377,10 @@ static int ipip_rcv(struct sk_buff *skb) | |||
377 | skb_tunnel_rx(skb, tunnel->dev); | 377 | skb_tunnel_rx(skb, tunnel->dev); |
378 | 378 | ||
379 | ipip_ecn_decapsulate(iph, skb); | 379 | ipip_ecn_decapsulate(iph, skb); |
380 | netif_rx(skb); | 380 | |
381 | if (netif_rx(skb) == NET_RX_DROP) | ||
382 | tunnel->dev->stats.rx_dropped++; | ||
383 | |||
381 | rcu_read_unlock(); | 384 | rcu_read_unlock(); |
382 | return 0; | 385 | return 0; |
383 | } | 386 | } |
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index 9289cecac4de..f6d9f683543e 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c | |||
@@ -725,7 +725,10 @@ static int ip6_tnl_rcv(struct sk_buff *skb, __u16 protocol, | |||
725 | skb_tunnel_rx(skb, t->dev); | 725 | skb_tunnel_rx(skb, t->dev); |
726 | 726 | ||
727 | dscp_ecn_decapsulate(t, ipv6h, skb); | 727 | dscp_ecn_decapsulate(t, ipv6h, skb); |
728 | netif_rx(skb); | 728 | |
729 | if (netif_rx(skb) == NET_RX_DROP) | ||
730 | t->dev->stats.rx_dropped++; | ||
731 | |||
729 | rcu_read_unlock(); | 732 | rcu_read_unlock(); |
730 | return 0; | 733 | return 0; |
731 | } | 734 | } |
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c index 66078dad7fe8..2640c9be589d 100644 --- a/net/ipv6/ip6mr.c +++ b/net/ipv6/ip6mr.c | |||
@@ -666,7 +666,9 @@ static int pim6_rcv(struct sk_buff *skb) | |||
666 | 666 | ||
667 | skb_tunnel_rx(skb, reg_dev); | 667 | skb_tunnel_rx(skb, reg_dev); |
668 | 668 | ||
669 | netif_rx(skb); | 669 | if (netif_rx(skb) == NET_RX_DROP) |
670 | reg_dev->stats.rx_dropped++; | ||
671 | |||
670 | dev_put(reg_dev); | 672 | dev_put(reg_dev); |
671 | return 0; | 673 | return 0; |
672 | drop: | 674 | drop: |
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index 6822481ff766..8a0399822230 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
@@ -564,7 +564,10 @@ static int ipip6_rcv(struct sk_buff *skb) | |||
564 | skb_tunnel_rx(skb, tunnel->dev); | 564 | skb_tunnel_rx(skb, tunnel->dev); |
565 | 565 | ||
566 | ipip6_ecn_decapsulate(iph, skb); | 566 | ipip6_ecn_decapsulate(iph, skb); |
567 | netif_rx(skb); | 567 | |
568 | if (netif_rx(skb) == NET_RX_DROP) | ||
569 | tunnel->dev->stats.rx_dropped++; | ||
570 | |||
568 | rcu_read_unlock(); | 571 | rcu_read_unlock(); |
569 | return 0; | 572 | return 0; |
570 | } | 573 | } |