Message ID | 87f4954cfd7eacd6e220ab60d61e09f35ed32252.1594844608.git.dcaratti@redhat.com |
---|---|
State | Accepted |
Delegated to: | David Miller |
Headers | show |
Series | [net-next] mptcp: silence warning in subflow_data_ready() | expand |
Hi Davide, On 15/07/2020 22:27, Davide Caratti wrote: > since commit d47a72152097 ("mptcp: fix race in subflow_data_ready()"), it > is possible to observe a regression in MP_JOIN kselftests. For sockets in > TCP_CLOSE state, it's not sufficient to just wake up the main socket: we > also need to ensure that received data are made available to the reader. > Silence the WARN_ON_ONCE() in these cases: it preserves the syzkaller fix > and restores kselftests when they are ran as follows: > > # while true; do > > make KBUILD_OUTPUT=/tmp/kselftest TARGETS=net/mptcp kselftest > > done > > Reported-by: Florian Westphal <fw@strlen.de> > Fixes: d47a72152097 ("mptcp: fix race in subflow_data_ready()") > Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/47 > Signed-off-by: Davide Caratti <dcaratti@redhat.com> Thank you for the patch! It looks good to me and it fixes the kselftests on my side as well! Reviewed-by: Matthieu Baerts <matthieu.baerts@tessares.net> Cheers, Matt
diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 9f7f3772c13c..519122e66f17 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -869,18 +869,19 @@ void mptcp_space(const struct sock *ssk, int *space, int *full_space) static void subflow_data_ready(struct sock *sk) { struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + u16 state = 1 << inet_sk_state_load(sk); struct sock *parent = subflow->conn; struct mptcp_sock *msk; msk = mptcp_sk(parent); - if ((1 << inet_sk_state_load(sk)) & (TCPF_LISTEN | TCPF_CLOSE)) { + if (state & TCPF_LISTEN) { set_bit(MPTCP_DATA_READY, &msk->flags); parent->sk_data_ready(parent); return; } WARN_ON_ONCE(!__mptcp_check_fallback(msk) && !subflow->mp_capable && - !subflow->mp_join); + !subflow->mp_join && !(state & TCPF_CLOSE)); if (mptcp_subflow_data_available(sk)) mptcp_data_ready(parent, sk);