Skip to content

Commit

Permalink
mptcp: call mp_fail_no_response only when needed
Browse files Browse the repository at this point in the history
mptcp_mp_fail_no_response shouldn't be invoked on each worker run, it
should be invoked only when MP_FAIL response timeout occurs.

This patch adds a new msk flag MPTCP_WORK_TIMEOUT, set it in
mptcp_timeout_timer(). And test it in mptcp_worker() before invoking
mptcp_mp_fail_no_response().

Check the SOCK_DEAD flag on the subflow in mptcp_mp_fail_no_response()
to make sure it's a MP_FAIL timeout, not a MPTCP socket close timeout.

Now mp_fail_response_expect_subflow() helper is only used by
mptcp_mp_fail_no_response(), move the definition of the helper right
before mptcp_mp_fail_no_response().

Closes: multipath-tcp/mptcp_net-next#281
Fixes: d9fb797 ("mptcp: Do not traverse the subflow connection list without lock")
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
  • Loading branch information
geliangtang authored and intel-lab-lkp committed Jun 8, 2022
1 parent 2109f19 commit 6690a48
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 17 deletions.
41 changes: 24 additions & 17 deletions net/mptcp/protocol.c
Original file line number Diff line number Diff line change
Expand Up @@ -2167,25 +2167,13 @@ static void mptcp_retransmit_timer(struct timer_list *t)
sock_put(sk);
}

static struct mptcp_subflow_context *
mp_fail_response_expect_subflow(struct mptcp_sock *msk)
{
struct mptcp_subflow_context *subflow, *ret = NULL;

mptcp_for_each_subflow(msk, subflow) {
if (READ_ONCE(subflow->mp_fail_response_expect)) {
ret = subflow;
break;
}
}

return ret;
}

static void mptcp_timeout_timer(struct timer_list *t)
{
struct sock *sk = from_timer(sk, t, sk_timer);

bh_lock_sock(sk);
__set_bit(MPTCP_WORK_TIMEOUT, &mptcp_sk(sk)->flags);
bh_unlock_sock(sk);
mptcp_schedule_work(sk);
sock_put(sk);
}
Expand Down Expand Up @@ -2505,6 +2493,21 @@ static void __mptcp_retrans(struct sock *sk)
mptcp_reset_timer(sk);
}

static struct mptcp_subflow_context *
mp_fail_response_expect_subflow(struct mptcp_sock *msk)
{
struct mptcp_subflow_context *subflow, *ret = NULL;

mptcp_for_each_subflow(msk, subflow) {
if (READ_ONCE(subflow->mp_fail_response_expect)) {
ret = subflow;
break;
}
}

return ret;
}

static void mptcp_mp_fail_no_response(struct mptcp_sock *msk)
{
struct mptcp_subflow_context *subflow;
Expand All @@ -2513,9 +2516,12 @@ static void mptcp_mp_fail_no_response(struct mptcp_sock *msk)

subflow = mp_fail_response_expect_subflow(msk);
if (subflow) {
ssk = mptcp_subflow_tcp_sock(subflow);
if (sock_flag(ssk, SOCK_DEAD))
return;

pr_debug("MP_FAIL doesn't respond, reset the subflow");

ssk = mptcp_subflow_tcp_sock(subflow);
slow = lock_sock_fast(ssk);
mptcp_subflow_reset(ssk);
unlock_sock_fast(ssk, slow);
Expand Down Expand Up @@ -2562,7 +2568,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_WORK_TIMEOUT, &msk->flags))
mptcp_mp_fail_no_response(msk);

unlock:
release_sock(sk);
Expand Down
1 change: 1 addition & 0 deletions net/mptcp/protocol.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@
#define MPTCP_WORK_EOF 3
#define MPTCP_FALLBACK_DONE 4
#define MPTCP_WORK_CLOSE_SUBFLOW 5
#define MPTCP_WORK_TIMEOUT 6

/* MPTCP socket release cb flags */
#define MPTCP_PUSH_PENDING 1
Expand Down

0 comments on commit 6690a48

Please sign in to comment.