udp: multicast RX should increment SNMP/sk_drops counter in allocation failures
Subsystems (3)
PATCH 8/8 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 <[email protected]>
--- net/ipv4/udp.c | 12 +++++++++++- net/ipv6/udp.c | 8 +++++++- 2 files changed, 18 insertions(+), 2 deletions(-)
net/ipv4/udp.c +11 -1
@@ -1335,12 +1335,22 @@ static void flush_stack(struct sock **stack, unsigned int count, {unsigned int i;struct sk_buff *skb1 =NULL ; +struct sock *sk;for (i =0 ; i < count; i++) { + sk = stack[i];if (likely (skb1 ==NULL )) skb1 = (i == final) ? skb :skb_clone (skb,GFP_ATOMIC ); -if (skb1 &&udp_queue_rcv_skb (stack[i], skb1) <=0 ) +if (!skb1) { +atomic_inc (&sk->sk_drops); +UDP_INC_STATS_BH (sock_net (sk),UDP_MIB_RCVBUFERRORS , +IS_UDPLITE (sk)); +UDP_INC_STATS_BH (sock_net (sk),UDP_MIB_INERRORS , +IS_UDPLITE (sk)); + } + +if (skb1 &&udp_queue_rcv_skb (sk, skb1) <=0 ) skb1 =NULL ; }if (unlikely (skb1))
net/ipv6/udp.c +7 -1
@@ -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)); } } }