Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tcp: refactor tcp_read_skb() a bit

As tcp_read_skb() only reads one skb at a time, the while loop is
unnecessary, we can turn it into an if. This also simplifies the
code logic.

Cc: Eric Dumazet <edumazet@google.com>
Cc: John Fastabend <john.fastabend@gmail.com>
Cc: Jakub Sitnicki <jakub@cloudflare.com>
Signed-off-by: Cong Wang <cong.wang@bytedance.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Cong Wang and committed by
Jakub Kicinski
a8688821 c457985a

+9 -17
+9 -17
net/ipv4/tcp.c
··· 1761 1761 if (sk->sk_state == TCP_LISTEN) 1762 1762 return -ENOTCONN; 1763 1763 1764 - while ((skb = tcp_recv_skb(sk, seq, &offset)) != NULL) { 1765 - int used; 1764 + skb = tcp_recv_skb(sk, seq, &offset); 1765 + if (!skb) 1766 + return 0; 1766 1767 1767 - __skb_unlink(skb, &sk->sk_receive_queue); 1768 - WARN_ON(!skb_set_owner_sk_safe(skb, sk)); 1769 - used = recv_actor(sk, skb); 1770 - if (used <= 0) { 1771 - if (!copied) 1772 - copied = used; 1773 - break; 1774 - } 1775 - seq += used; 1776 - copied += used; 1777 - 1778 - if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN) { 1768 + __skb_unlink(skb, &sk->sk_receive_queue); 1769 + WARN_ON(!skb_set_owner_sk_safe(skb, sk)); 1770 + copied = recv_actor(sk, skb); 1771 + if (copied > 0) { 1772 + seq += copied; 1773 + if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN) 1779 1774 ++seq; 1780 - break; 1781 - } 1782 - break; 1783 1775 } 1784 1776 consume_skb(skb); 1785 1777 WRITE_ONCE(tp->copied_seq, seq);