Skip to content

Commit

Permalink
mptcp: introduce mptcp_schedule_work
Browse files Browse the repository at this point in the history
remove some of code duplications an allow preventing
rescheduling on close.

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
  • Loading branch information
Paolo Abeni authored and jenkins-tessares committed Oct 24, 2020
1 parent ec8e220 commit db2c0db
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 16 deletions.
3 changes: 1 addition & 2 deletions net/mptcp/pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,7 @@ static bool mptcp_pm_schedule_work(struct mptcp_sock *msk,
return false;

msk->pm.status |= BIT(new_status);
if (schedule_work(&msk->work))
sock_hold((struct sock *)msk);
mptcp_schedule_work((struct sock *)msk);
return true;
}

Expand Down
36 changes: 22 additions & 14 deletions net/mptcp/protocol.c
Original file line number Diff line number Diff line change
Expand Up @@ -610,9 +610,8 @@ static bool move_skbs_to_msk(struct mptcp_sock *msk, struct sock *ssk)
* this is not a good place to change state. Let the workqueue
* do it.
*/
if (mptcp_pending_data_fin(sk, NULL) &&
schedule_work(&msk->work))
sock_hold(sk);
if (mptcp_pending_data_fin(sk, NULL))
mptcp_schedule_work(sk);
}

spin_unlock_bh(&sk->sk_lock.slock);
Expand Down Expand Up @@ -689,23 +688,32 @@ static void mptcp_reset_timer(struct sock *sk)
sk_reset_timer(sk, &icsk->icsk_retransmit_timer, jiffies + tout);
}

bool mptcp_schedule_work(struct sock *sk)
{
if (inet_sk_state_load(sk) != TCP_CLOSE &&
schedule_work(&mptcp_sk(sk)->work)) {
/* each subflow already holds a reference to the sk, and the
* workqueue is invoked by a subflow, so sk can't go away here.
*/
sock_hold(sk);
return true;
}
return false;
}

void mptcp_data_acked(struct sock *sk)
{
mptcp_reset_timer(sk);

if ((!test_bit(MPTCP_SEND_SPACE, &mptcp_sk(sk)->flags) ||
(inet_sk_state_load(sk) != TCP_ESTABLISHED)) &&
schedule_work(&mptcp_sk(sk)->work))
sock_hold(sk);
(inet_sk_state_load(sk) != TCP_ESTABLISHED)))
mptcp_schedule_work(sk);
}

void mptcp_subflow_eof(struct sock *sk)
{
struct mptcp_sock *msk = mptcp_sk(sk);

if (!test_and_set_bit(MPTCP_WORK_EOF, &msk->flags) &&
schedule_work(&msk->work))
sock_hold(sk);
if (!test_and_set_bit(MPTCP_WORK_EOF, &mptcp_sk(sk)->flags))
mptcp_schedule_work(sk);
}

static void mptcp_check_for_eof(struct mptcp_sock *msk)
Expand Down Expand Up @@ -1610,8 +1618,7 @@ static void mptcp_retransmit_handler(struct sock *sk)
mptcp_stop_timer(sk);
} else {
set_bit(MPTCP_WORK_RTX, &msk->flags);
if (schedule_work(&msk->work))
sock_hold(sk);
mptcp_schedule_work(sk);
}
}

Expand Down Expand Up @@ -2324,7 +2331,8 @@ static void mptcp_release_cb(struct sock *sk)
struct sock *ssk;

ssk = mptcp_subflow_recv_lookup(msk);
if (!ssk || !schedule_work(&msk->work))
if (!ssk || sk->sk_state == TCP_CLOSE ||
!schedule_work(&msk->work))
__sock_put(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 @@ -408,6 +408,7 @@ static inline bool mptcp_is_fully_established(struct sock *sk)
void mptcp_rcv_space_init(struct mptcp_sock *msk, const struct sock *ssk);
void mptcp_data_ready(struct sock *sk, struct sock *ssk);
bool mptcp_finish_join(struct sock *sk);
bool mptcp_schedule_work(struct sock *sk);
void mptcp_data_acked(struct sock *sk);
void mptcp_subflow_eof(struct sock *sk);
bool mptcp_update_rcv_data_fin(struct mptcp_sock *msk, u64 data_fin_seq, bool use_64bit);
Expand Down

0 comments on commit db2c0db

Please sign in to comment.