tcp: factor out __tcp_close() helper
authorPaolo Abeni <pabeni@redhat.com>
Mon, 16 Nov 2020 09:48:04 +0000 (10:48 +0100)
committerJakub Kicinski <kuba@kernel.org>
Mon, 16 Nov 2020 18:46:06 +0000 (10:46 -0800)
unlocked version of protocol level close, will be used by
MPTCP to allow decouple orphaning and subflow level close.

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/tcp.h
net/ipv4/tcp.c

index 8aee43e..d5d22c4 100644 (file)
@@ -395,6 +395,7 @@ void tcp_update_metrics(struct sock *sk);
 void tcp_init_metrics(struct sock *sk);
 void tcp_metrics_init(void);
 bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst);
+void __tcp_close(struct sock *sk, long timeout);
 void tcp_close(struct sock *sk, long timeout);
 void tcp_init_sock(struct sock *sk);
 void tcp_init_transfer(struct sock *sk, int bpf_op, struct sk_buff *skb);
index a40981e..b285b33 100644 (file)
@@ -2420,13 +2420,12 @@ bool tcp_check_oom(struct sock *sk, int shift)
        return too_many_orphans || out_of_socket_memory;
 }
 
-void tcp_close(struct sock *sk, long timeout)
+void __tcp_close(struct sock *sk, long timeout)
 {
        struct sk_buff *skb;
        int data_was_unread = 0;
        int state;
 
-       lock_sock(sk);
        sk->sk_shutdown = SHUTDOWN_MASK;
 
        if (sk->sk_state == TCP_LISTEN) {
@@ -2590,6 +2589,12 @@ adjudge_to_death:
 out:
        bh_unlock_sock(sk);
        local_bh_enable();
+}
+
+void tcp_close(struct sock *sk, long timeout)
+{
+       lock_sock(sk);
+       __tcp_close(sk, timeout);
        release_sock(sk);
        sock_put(sk);
 }