@@ -421,6 +421,22 @@ static struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk)
return backup;
}
+static void ssk_check_wmem(struct mptcp_sock *msk, struct sock *ssk)
+{
+ struct socket *sock;
+
+ if (likely(sk_stream_is_writeable(ssk)))
+ return;
+
+ sock = READ_ONCE(ssk->sk_socket);
+
+ if (sock) {
+ clear_bit(MPTCP_SEND_SPACE, &msk->flags);
+ smp_mb__after_atomic();
+ set_bit(SOCK_NOSPACE, &sock->flags);
+ }
+}
+
static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
{
int mss_now = 0, size_goal = 0, ret = 0;
@@ -485,6 +501,7 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
mptcp_reset_timer(sk);
}
+ ssk_check_wmem(msk, ssk);
release_sock(ssk);
out:
This is needed when we get rid of __tcp_poll and let mptcp_poll only rely on msk->flags -- we need to avoid EPOLLOUT if the write filled too much sndbuf space. Signed-off-by: Florian Westphal <fw@strlen.de> --- net/mptcp/protocol.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)