Skip to content

Commit

Permalink
mptcp: basic sndbuf autotuning
Browse files Browse the repository at this point in the history
Let the msk sendbuf track the size of the larger subflow's
send window, so that we ensure mptcp_sendmsg() does not
exceed MPTCP-level send window.

The update is performed just before try to send any data.

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
  • Loading branch information
Paolo Abeni authored and jenkins-tessares committed Aug 28, 2020
1 parent 49c9759 commit 75fc9cb
Showing 1 changed file with 13 additions and 4 deletions.
17 changes: 13 additions & 4 deletions net/mptcp/protocol.c
Original file line number Diff line number Diff line change
Expand Up @@ -859,7 +859,8 @@ static void mptcp_nospace(struct mptcp_sock *msk)
}
}

static struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk)
static struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk,
u32 *sndbuf)
{
struct mptcp_subflow_context *subflow;
struct sock *sk = (struct sock *)msk;
Expand All @@ -868,6 +869,7 @@ static struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk)

sock_owned_by_me(sk);

*sndbuf = 0;
if (!mptcp_ext_cache_refill(msk))
return NULL;

Expand All @@ -880,6 +882,7 @@ static struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk)
return NULL;
}

*sndbuf = max(tcp_sk(ssk)->snd_wnd, *sndbuf);
if (subflow->backup) {
if (!backup)
backup = ssk;
Expand All @@ -906,6 +909,7 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
struct page_frag *pfrag;
size_t copied = 0;
struct sock *ssk;
u32 sndbuf;
bool tx_ok;
long timeo;

Expand Down Expand Up @@ -933,7 +937,7 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)

wait_for_sndbuf:
__mptcp_flush_join_list(msk);
ssk = mptcp_subflow_get_send(msk);
ssk = mptcp_subflow_get_send(msk, &sndbuf);
while (!sk_stream_memory_free(sk) ||
!ssk ||
!mptcp_page_frag_refill(ssk, pfrag)) {
Expand All @@ -957,13 +961,18 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)

mptcp_clean_una(sk);

ssk = mptcp_subflow_get_send(msk);
ssk = mptcp_subflow_get_send(msk, &sndbuf);
if (list_empty(&msk->conn_list)) {
ret = -ENOTCONN;
goto out;
}
}

/* do auto tuning */
if (!(sk->sk_userlocks & SOCK_SNDBUF_LOCK) &&
sndbuf > READ_ONCE(sk->sk_sndbuf))
WRITE_ONCE(sk->sk_sndbuf, sndbuf);

pr_debug("conn_list->subflow=%p", ssk);

lock_sock(ssk);
Expand Down Expand Up @@ -1560,7 +1569,7 @@ static int mptcp_init_sock(struct sock *sk)

sk_sockets_allocated_inc(sk);
sk->sk_rcvbuf = sock_net(sk)->ipv4.sysctl_tcp_rmem[1];
sk->sk_sndbuf = sock_net(sk)->ipv4.sysctl_tcp_wmem[2];
sk->sk_sndbuf = sock_net(sk)->ipv4.sysctl_tcp_wmem[1];

return 0;
}
Expand Down

0 comments on commit 75fc9cb

Please sign in to comment.