diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2009-11-08 11:20:19 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-11-09 05:53:10 +0100 |
commit | f6b8f32ca71406de718391369490f6b1e81fe0bb (patch) | |
tree | 6a9d65cc246c74a78d7274d1911baf38ffc8eaf0 /net/ipv6 | |
parent | ipv6: udp: Optimise multicast reception (diff) | |
download | linux-f6b8f32ca71406de718391369490f6b1e81fe0bb.tar.xz linux-f6b8f32ca71406de718391369490f6b1e81fe0bb.zip |
udp: multicast RX should increment SNMP/sk_drops counter in allocation failures
When skb_clone() fails, we should increment sk_drops and SNMP counters.
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/udp.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 948e823d70c2..2915e1dad726 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -579,14 +579,20 @@ static void flush_stack(struct sock **stack, unsigned int count, for (i = 0; i < count; i++) { skb1 = (i == final) ? skb : skb_clone(skb, GFP_ATOMIC); + sk = stack[i]; if (skb1) { - sk = stack[i]; bh_lock_sock(sk); if (!sock_owned_by_user(sk)) udpv6_queue_rcv_skb(sk, skb1); else sk_add_backlog(sk, skb1); bh_unlock_sock(sk); + } else { + atomic_inc(&sk->sk_drops); + UDP6_INC_STATS_BH(sock_net(sk), + UDP_MIB_RCVBUFERRORS, IS_UDPLITE(sk)); + UDP6_INC_STATS_BH(sock_net(sk), + UDP_MIB_INERRORS, IS_UDPLITE(sk)); } } } |