mptcp: factor out __mptcp_retrans helper()
authorPaolo Abeni <pabeni@redhat.com>
Thu, 4 Mar 2021 21:32:13 +0000 (13:32 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 4 Mar 2021 22:30:13 +0000 (14:30 -0800)
Will simplify the following patch, no functional change
intended.

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/mptcp/protocol.c

index 3dcb564b03ad3e02fda236fe3d1c5a41ddde27e4..67aaf7154dca3f60eb855bea9d467ef0d9855456 100644 (file)
@@ -2261,59 +2261,23 @@ static void mptcp_check_fastclose(struct mptcp_sock *msk)
        mptcp_close_wake_up(sk);
 }
 
-static void mptcp_worker(struct work_struct *work)
+static void __mptcp_retrans(struct sock *sk)
 {
-       struct mptcp_sock *msk = container_of(work, struct mptcp_sock, work);
-       struct sock *ssk, *sk = &msk->sk.icsk_inet.sk;
+       struct mptcp_sock *msk = mptcp_sk(sk);
        struct mptcp_sendmsg_info info = {};
        struct mptcp_data_frag *dfrag;
        size_t copied = 0;
-       int state, ret;
-
-       lock_sock(sk);
-       state = sk->sk_state;
-       if (unlikely(state == TCP_CLOSE))
-               goto unlock;
-
-       mptcp_check_data_fin_ack(sk);
-       __mptcp_flush_join_list(msk);
-
-       mptcp_check_fastclose(msk);
-
-       if (msk->pm.status)
-               mptcp_pm_nl_work(msk);
-
-       if (test_and_clear_bit(MPTCP_WORK_EOF, &msk->flags))
-               mptcp_check_for_eof(msk);
-
-       __mptcp_check_send_data_fin(sk);
-       mptcp_check_data_fin(sk);
-
-       /* There is no point in keeping around an orphaned sk timedout or
-        * closed, but we need the msk around to reply to incoming DATA_FIN,
-        * even if it is orphaned and in FIN_WAIT2 state
-        */
-       if (sock_flag(sk, SOCK_DEAD) &&
-           (mptcp_check_close_timeout(sk) || sk->sk_state == TCP_CLOSE)) {
-               inet_sk_state_store(sk, TCP_CLOSE);
-               __mptcp_destroy_sock(sk);
-               goto unlock;
-       }
-
-       if (test_and_clear_bit(MPTCP_WORK_CLOSE_SUBFLOW, &msk->flags))
-               __mptcp_close_subflow(msk);
-
-       if (!test_and_clear_bit(MPTCP_WORK_RTX, &msk->flags))
-               goto unlock;
+       struct sock *ssk;
+       int ret;
 
        __mptcp_clean_una(sk);
        dfrag = mptcp_rtx_head(sk);
        if (!dfrag)
-               goto unlock;
+               return;
 
        ssk = mptcp_subflow_get_retrans(msk);
        if (!ssk)
-               goto reset_unlock;
+               goto reset_timer;
 
        lock_sock(ssk);
 
@@ -2339,9 +2303,52 @@ static void mptcp_worker(struct work_struct *work)
        mptcp_set_timeout(sk, ssk);
        release_sock(ssk);
 
-reset_unlock:
+reset_timer:
        if (!mptcp_timer_pending(sk))
                mptcp_reset_timer(sk);
+}
+
+static void mptcp_worker(struct work_struct *work)
+{
+       struct mptcp_sock *msk = container_of(work, struct mptcp_sock, work);
+       struct sock *sk = &msk->sk.icsk_inet.sk;
+       int state;
+
+       lock_sock(sk);
+       state = sk->sk_state;
+       if (unlikely(state == TCP_CLOSE))
+               goto unlock;
+
+       mptcp_check_data_fin_ack(sk);
+       __mptcp_flush_join_list(msk);
+
+       mptcp_check_fastclose(msk);
+
+       if (msk->pm.status)
+               mptcp_pm_nl_work(msk);
+
+       if (test_and_clear_bit(MPTCP_WORK_EOF, &msk->flags))
+               mptcp_check_for_eof(msk);
+
+       __mptcp_check_send_data_fin(sk);
+       mptcp_check_data_fin(sk);
+
+       /* There is no point in keeping around an orphaned sk timedout or
+        * closed, but we need the msk around to reply to incoming DATA_FIN,
+        * even if it is orphaned and in FIN_WAIT2 state
+        */
+       if (sock_flag(sk, SOCK_DEAD) &&
+           (mptcp_check_close_timeout(sk) || sk->sk_state == TCP_CLOSE)) {
+               inet_sk_state_store(sk, TCP_CLOSE);
+               __mptcp_destroy_sock(sk);
+               goto unlock;
+       }
+
+       if (test_and_clear_bit(MPTCP_WORK_CLOSE_SUBFLOW, &msk->flags))
+               __mptcp_close_subflow(msk);
+
+       if (test_and_clear_bit(MPTCP_WORK_RTX, &msk->flags))
+               __mptcp_retrans(sk);
 
 unlock:
        release_sock(sk);