mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
udp: Refactor udp_read_skb()
Delete the unnecessary while loop in udp_read_skb() for readability. Additionally, since recv_actor() cannot return a value greater than skb->len (see sk_psock_verdict_recv()), remove the redundant check. Suggested-by: Cong Wang <cong.wang@bytedance.com> Signed-off-by: Peilin Ye <peilin.ye@bytedance.com> Link: https://lore.kernel.org/r/343b5d8090a3eb764068e9f1d392939e2b423747.1663909008.git.peilin.ye@bytedance.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
c52add61c2
commit
31f1fbcb34
1 changed files with 17 additions and 29 deletions
|
@ -1801,41 +1801,29 @@ EXPORT_SYMBOL(__skb_recv_udp);
|
|||
|
||||
int udp_read_skb(struct sock *sk, skb_read_actor_t recv_actor)
|
||||
{
|
||||
int copied = 0;
|
||||
struct sk_buff *skb;
|
||||
int err, copied;
|
||||
|
||||
while (1) {
|
||||
struct sk_buff *skb;
|
||||
int err, used;
|
||||
try_again:
|
||||
skb = skb_recv_udp(sk, MSG_DONTWAIT, &err);
|
||||
if (!skb)
|
||||
return err;
|
||||
|
||||
skb = skb_recv_udp(sk, MSG_DONTWAIT, &err);
|
||||
if (!skb)
|
||||
return err;
|
||||
|
||||
if (udp_lib_checksum_complete(skb)) {
|
||||
__UDP_INC_STATS(sock_net(sk), UDP_MIB_CSUMERRORS,
|
||||
IS_UDPLITE(sk));
|
||||
__UDP_INC_STATS(sock_net(sk), UDP_MIB_INERRORS,
|
||||
IS_UDPLITE(sk));
|
||||
atomic_inc(&sk->sk_drops);
|
||||
kfree_skb(skb);
|
||||
continue;
|
||||
}
|
||||
|
||||
WARN_ON_ONCE(!skb_set_owner_sk_safe(skb, sk));
|
||||
used = recv_actor(sk, skb);
|
||||
if (used <= 0) {
|
||||
if (!copied)
|
||||
copied = used;
|
||||
kfree_skb(skb);
|
||||
break;
|
||||
} else if (used <= skb->len) {
|
||||
copied += used;
|
||||
}
|
||||
if (udp_lib_checksum_complete(skb)) {
|
||||
int is_udplite = IS_UDPLITE(sk);
|
||||
struct net *net = sock_net(sk);
|
||||
|
||||
__UDP_INC_STATS(net, UDP_MIB_CSUMERRORS, is_udplite);
|
||||
__UDP_INC_STATS(net, UDP_MIB_INERRORS, is_udplite);
|
||||
atomic_inc(&sk->sk_drops);
|
||||
kfree_skb(skb);
|
||||
break;
|
||||
goto try_again;
|
||||
}
|
||||
|
||||
WARN_ON_ONCE(!skb_set_owner_sk_safe(skb, sk));
|
||||
copied = recv_actor(sk, skb);
|
||||
kfree_skb(skb);
|
||||
|
||||
return copied;
|
||||
}
|
||||
EXPORT_SYMBOL(udp_read_skb);
|
||||
|
|
Loading…
Add table
Reference in a new issue