Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 55349790 authored by Zhu Yi's avatar Zhu Yi Committed by David S. Miller
Browse files

udp: use limited socket backlog



Make udp adapt to the limited socket backlog change.

Cc: "David S. Miller" <davem@davemloft.net>
Cc: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
Cc: "Pekka Savola (ipv6)" <pekkas@netcore.fi>
Cc: Patrick McHardy <kaber@trash.net>
Signed-off-by: default avatarZhu Yi <yi.zhu@intel.com>
Acked-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6b03a53a
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -1371,8 +1371,10 @@ int udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
	bh_lock_sock(sk);
	if (!sock_owned_by_user(sk))
		rc = __udp_queue_rcv_skb(sk, skb);
	else
		sk_add_backlog(sk, skb);
	else if (sk_add_backlog_limited(sk, skb)) {
		bh_unlock_sock(sk);
		goto drop;
	}
	bh_unlock_sock(sk);

	return rc;
+18 −10
Original line number Diff line number Diff line
@@ -583,10 +583,15 @@ static void flush_stack(struct sock **stack, unsigned int count,
			bh_lock_sock(sk);
			if (!sock_owned_by_user(sk))
				udpv6_queue_rcv_skb(sk, skb1);
			else
				sk_add_backlog(sk, skb1);
			else if (sk_add_backlog_limited(sk, skb1)) {
				kfree_skb(skb1);
				bh_unlock_sock(sk);
		} else {
				goto drop;
			}
			bh_unlock_sock(sk);
			continue;
		}
drop:
		atomic_inc(&sk->sk_drops);
		UDP6_INC_STATS_BH(sock_net(sk),
				UDP_MIB_RCVBUFERRORS, IS_UDPLITE(sk));
@@ -594,7 +599,6 @@ static void flush_stack(struct sock **stack, unsigned int count,
				UDP_MIB_INERRORS, IS_UDPLITE(sk));
	}
}
}
/*
 * Note: called only from the BH handler context,
 * so we don't need to lock the hashes.
@@ -754,8 +758,12 @@ int __udp6_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
	bh_lock_sock(sk);
	if (!sock_owned_by_user(sk))
		udpv6_queue_rcv_skb(sk, skb);
	else
		sk_add_backlog(sk, skb);
	else if (sk_add_backlog_limited(sk, skb)) {
		atomic_inc(&sk->sk_drops);
		bh_unlock_sock(sk);
		sock_put(sk);
		goto discard;
	}
	bh_unlock_sock(sk);
	sock_put(sk);
	return 0;