]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
tcp: add recv_should_stop helper
authorGeliang Tang <tanggeliang@kylinos.cn>
Fri, 3 Apr 2026 11:29:29 +0000 (13:29 +0200)
committerJakub Kicinski <kuba@kernel.org>
Tue, 7 Apr 2026 02:14:27 +0000 (19:14 -0700)
Factor out a new helper tcp_recv_should_stop() from tcp_recvmsg_locked()
and tcp_splice_read() to check whether to stop receiving. And use this
helper in mptcp_recvmsg() and mptcp_splice_read() to reduce redundant code.

Suggested-by: Paolo Abeni <pabeni@redhat.com>
Acked-by: Mat Martineau <martineau@kernel.org>
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
Acked-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Link: https://patch.msgid.link/20260403-net-next-mptcp-msg_eor-misc-v1-3-b0b33bea3fed@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/tcp.h
net/ipv4/tcp.c
net/mptcp/protocol.c

index 565943c34b7e8c66812cc1ca6728ddf7baf565aa..6156d1d068e142f696ec9dfff63e3aaebb0171bc 100644 (file)
@@ -3077,4 +3077,12 @@ enum skb_drop_reason tcp_inbound_hash(struct sock *sk,
                const void *saddr, const void *daddr,
                int family, int dif, int sdif);
 
+static inline int tcp_recv_should_stop(struct sock *sk)
+{
+       return sk->sk_err ||
+              sk->sk_state == TCP_CLOSE ||
+              (sk->sk_shutdown & RCV_SHUTDOWN) ||
+              signal_pending(current);
+}
+
 #endif /* _TCP_H */
index bd2c3c4587e133897aa057bd3b26c29df050607f..e57eaffc007a02d1265df097e0f66d09a44a971a 100644 (file)
@@ -888,9 +888,7 @@ ssize_t tcp_splice_read(struct socket *sock, loff_t *ppos,
                release_sock(sk);
                lock_sock(sk);
 
-               if (sk->sk_err || sk->sk_state == TCP_CLOSE ||
-                   (sk->sk_shutdown & RCV_SHUTDOWN) ||
-                   signal_pending(current))
+               if (tcp_recv_should_stop(sk))
                        break;
        }
 
@@ -2755,10 +2753,7 @@ static int tcp_recvmsg_locked(struct sock *sk, struct msghdr *msg, size_t len,
 
                if (copied) {
                        if (!timeo ||
-                           sk->sk_err ||
-                           sk->sk_state == TCP_CLOSE ||
-                           (sk->sk_shutdown & RCV_SHUTDOWN) ||
-                           signal_pending(current))
+                           tcp_recv_should_stop(sk))
                                break;
                } else {
                        if (sock_flag(sk, SOCK_DONE))
index e21e416cd19afae90ca0f300c179874f2ea0bfc0..2f4776a4f06a398f96d65b6a0be6dd35ab0b532b 100644 (file)
@@ -2333,11 +2333,8 @@ static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
                        break;
 
                if (copied) {
-                       if (sk->sk_err ||
-                           sk->sk_state == TCP_CLOSE ||
-                           (sk->sk_shutdown & RCV_SHUTDOWN) ||
-                           !timeo ||
-                           signal_pending(current))
+                       if (tcp_recv_should_stop(sk) ||
+                           !timeo)
                                break;
                } else {
                        if (sk->sk_err) {
@@ -4520,9 +4517,7 @@ static ssize_t mptcp_splice_read(struct socket *sock, loff_t *ppos,
                release_sock(sk);
                lock_sock(sk);
 
-               if (sk->sk_err || sk->sk_state == TCP_CLOSE ||
-                   (sk->sk_shutdown & RCV_SHUTDOWN) ||
-                   signal_pending(current))
+               if (tcp_recv_should_stop(sk))
                        break;
        }