diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index d6aef4b13b8a8d..cede25e7f2a34a 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -2185,7 +2185,12 @@ mp_fail_response_expect_subflow(struct mptcp_sock *msk) static void mptcp_timeout_timer(struct timer_list *t) { struct sock *sk = from_timer(sk, t, sk_timer); + struct mptcp_sock *msk = mptcp_sk(sk); + bh_lock_sock(sk); + if (test_and_clear_bit(MPTCP_FAIL_RESPONSE_EXPECT, &msk->flags)) + __set_bit(MPTCP_FAIL_NO_RESPONSE, &msk->flags); + bh_unlock_sock(sk); mptcp_schedule_work(sk); sock_put(sk); } @@ -2562,7 +2567,8 @@ static void mptcp_worker(struct work_struct *work) if (test_and_clear_bit(MPTCP_WORK_RTX, &msk->flags)) __mptcp_retrans(sk); - mptcp_mp_fail_no_response(msk); + if (test_and_clear_bit(MPTCP_FAIL_NO_RESPONSE, &msk->flags)) + mptcp_mp_fail_no_response(msk); unlock: release_sock(sk); diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index d406b5afbee4d6..99023a59639bf4 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -116,6 +116,8 @@ #define MPTCP_WORK_EOF 3 #define MPTCP_FALLBACK_DONE 4 #define MPTCP_WORK_CLOSE_SUBFLOW 5 +#define MPTCP_FAIL_RESPONSE_EXPECT 6 +#define MPTCP_FAIL_NO_RESPONSE 7 /* MPTCP socket release cb flags */ #define MPTCP_PUSH_PENDING 1 diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 8841e8cd9ad8db..849dd001bc6184 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -1240,6 +1240,7 @@ static bool subflow_check_data_avail(struct sock *ssk) sk_eat_skb(ssk, skb); } else if (!sock_flag(ssk, SOCK_DEAD)) { WRITE_ONCE(subflow->mp_fail_response_expect, true); + __set_bit(MPTCP_FAIL_RESPONSE_EXPECT, &msk->flags); sk_reset_timer((struct sock *)msk, &((struct sock *)msk)->sk_timer, jiffies + TCP_RTO_MAX);