tcp_poll places current task on a wait queue. This can cause us to block
forever -- some subflows might never receive any data because they're
used as a backup/fallback path.
This makes mptcp_poll wait on the mptcp socket wait queue instead.
__tcp_poll is used instead to tcp_poll so current task won't wait
again after mptcp socket has been woken from the subflow layer.
Signed-off-by: Florian Westphal <fw(a)strlen.de>
---
net/mptcp/protocol.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index c7755cde9810..c2b29f8d0377 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -1238,11 +1238,13 @@ static __poll_t mptcp_poll(struct file *file, struct socket
*sock,
return ret;
}
+ sock_poll_wait(file, sock, wait);
+
mptcp_for_each_subflow(msk, subflow) {
struct socket *tcp_sock;
tcp_sock = mptcp_subflow_tcp_socket(subflow);
- ret |= tcp_poll(file, tcp_sock, wait);
+ ret |= __tcp_poll(tcp_sock->sk);
}
release_sock(sk);
--
2.21.0