Commit 86eb09b6 authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch 'mptcp-a-bunch-of-assorted-fixes'

Paolo Abeni says:

====================
mptcp: a bunch of assorted fixes

This series pulls a few fixes for the MPTCP datapath.
Most issues addressed here has been recently introduced
with the recent reworks, with the notable exception of
the first patch, which addresses an issue present since
the early days
====================

Link: https://lore.kernel.org/r/cover.1608114076.git.pabeni@redhat.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 49e27134 13e16037
...@@ -875,10 +875,13 @@ static void ack_update_msk(struct mptcp_sock *msk, ...@@ -875,10 +875,13 @@ static void ack_update_msk(struct mptcp_sock *msk,
new_wnd_end = new_snd_una + tcp_sk(ssk)->snd_wnd; new_wnd_end = new_snd_una + tcp_sk(ssk)->snd_wnd;
if (after64(new_wnd_end, msk->wnd_end)) { if (after64(new_wnd_end, msk->wnd_end))
msk->wnd_end = new_wnd_end; msk->wnd_end = new_wnd_end;
__mptcp_wnd_updated(sk, ssk);
} /* this assumes mptcp_incoming_options() is invoked after tcp_ack() */
if (after64(msk->wnd_end, READ_ONCE(msk->snd_nxt)) &&
sk_stream_memory_free(ssk))
__mptcp_check_push(sk, ssk);
if (after64(new_snd_una, old_snd_una)) { if (after64(new_snd_una, old_snd_una)) {
msk->snd_una = new_snd_una; msk->snd_una = new_snd_una;
...@@ -944,8 +947,8 @@ void mptcp_incoming_options(struct sock *sk, struct sk_buff *skb) ...@@ -944,8 +947,8 @@ void mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)
* helpers are cheap. * helpers are cheap.
*/ */
mptcp_data_lock(subflow->conn); mptcp_data_lock(subflow->conn);
if (mptcp_send_head(subflow->conn)) if (sk_stream_memory_free(sk))
__mptcp_wnd_updated(subflow->conn, sk); __mptcp_check_push(subflow->conn, sk);
__mptcp_data_acked(subflow->conn); __mptcp_data_acked(subflow->conn);
mptcp_data_unlock(subflow->conn); mptcp_data_unlock(subflow->conn);
return; return;
......
...@@ -1658,6 +1658,7 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) ...@@ -1658,6 +1658,7 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
frag_truesize += psize; frag_truesize += psize;
pfrag->offset += frag_truesize; pfrag->offset += frag_truesize;
WRITE_ONCE(msk->write_seq, msk->write_seq + psize); WRITE_ONCE(msk->write_seq, msk->write_seq + psize);
msk->tx_pending_data += psize;
/* charge data on mptcp pending queue to the msk socket /* charge data on mptcp pending queue to the msk socket
* Note: we charge such data both to sk and ssk * Note: we charge such data both to sk and ssk
...@@ -1683,10 +1684,8 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) ...@@ -1683,10 +1684,8 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
goto out; goto out;
} }
if (copied) { if (copied)
msk->tx_pending_data += copied;
mptcp_push_pending(sk, msg->msg_flags); mptcp_push_pending(sk, msg->msg_flags);
}
out: out:
release_sock(sk); release_sock(sk);
...@@ -2119,7 +2118,7 @@ void __mptcp_close_ssk(struct sock *sk, struct sock *ssk, ...@@ -2119,7 +2118,7 @@ void __mptcp_close_ssk(struct sock *sk, struct sock *ssk,
list_del(&subflow->node); list_del(&subflow->node);
lock_sock(ssk); lock_sock_nested(ssk, SINGLE_DEPTH_NESTING);
/* if we are invoked by the msk cleanup code, the subflow is /* if we are invoked by the msk cleanup code, the subflow is
* already orphaned * already orphaned
...@@ -2699,6 +2698,8 @@ struct sock *mptcp_sk_clone(const struct sock *sk, ...@@ -2699,6 +2698,8 @@ struct sock *mptcp_sk_clone(const struct sock *sk,
sock_reset_flag(nsk, SOCK_RCU_FREE); sock_reset_flag(nsk, SOCK_RCU_FREE);
/* will be fully established after successful MPC subflow creation */ /* will be fully established after successful MPC subflow creation */
inet_sk_state_store(nsk, TCP_SYN_RECV); inet_sk_state_store(nsk, TCP_SYN_RECV);
security_inet_csk_clone(nsk, req);
bh_unlock_sock(nsk); bh_unlock_sock(nsk);
/* keep a single reference */ /* keep a single reference */
...@@ -2913,7 +2914,7 @@ void __mptcp_data_acked(struct sock *sk) ...@@ -2913,7 +2914,7 @@ void __mptcp_data_acked(struct sock *sk)
mptcp_schedule_work(sk); mptcp_schedule_work(sk);
} }
void __mptcp_wnd_updated(struct sock *sk, struct sock *ssk) void __mptcp_check_push(struct sock *sk, struct sock *ssk)
{ {
if (!mptcp_send_head(sk)) if (!mptcp_send_head(sk))
return; return;
......
...@@ -503,7 +503,7 @@ void mptcp_rcv_space_init(struct mptcp_sock *msk, const struct sock *ssk); ...@@ -503,7 +503,7 @@ void mptcp_rcv_space_init(struct mptcp_sock *msk, const struct sock *ssk);
void mptcp_data_ready(struct sock *sk, struct sock *ssk); void mptcp_data_ready(struct sock *sk, struct sock *ssk);
bool mptcp_finish_join(struct sock *sk); bool mptcp_finish_join(struct sock *sk);
bool mptcp_schedule_work(struct sock *sk); bool mptcp_schedule_work(struct sock *sk);
void __mptcp_wnd_updated(struct sock *sk, struct sock *ssk); void __mptcp_check_push(struct sock *sk, struct sock *ssk);
void __mptcp_data_acked(struct sock *sk); void __mptcp_data_acked(struct sock *sk);
void mptcp_subflow_eof(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); bool mptcp_update_rcv_data_fin(struct mptcp_sock *msk, u64 data_fin_seq, bool use_64bit);
......
...@@ -287,7 +287,7 @@ run_test 10 10 0 0 "balanced bwidth" ...@@ -287,7 +287,7 @@ run_test 10 10 0 0 "balanced bwidth"
run_test 10 10 1 50 "balanced bwidth with unbalanced delay" run_test 10 10 1 50 "balanced bwidth with unbalanced delay"
# we still need some additional infrastructure to pass the following test-cases # we still need some additional infrastructure to pass the following test-cases
# run_test 30 10 0 0 "unbalanced bwidth" run_test 30 10 0 0 "unbalanced bwidth"
# run_test 30 10 1 50 "unbalanced bwidth with unbalanced delay" run_test 30 10 1 50 "unbalanced bwidth with unbalanced delay"
# run_test 30 10 50 1 "unbalanced bwidth with opposed, unbalanced delay" run_test 30 10 50 1 "unbalanced bwidth with opposed, unbalanced delay"
exit $ret exit $ret
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment