__mptcp_inherit_memcg() is currently invoked by mptcp_graph_subflows()
with the wrong GFP flags, as lock_sock_fast() can yield atomic scope.
Since this is not the most extreme fast path, use plain lock_sock()
instead.
Additionally move the subflow CG initialization earlier under the msk data
lock, so that the next patch could use the latter as a synchronization
point to ensure all subflows are CG accounted.
Finally fix a typo in the mentioned helper name.
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
---
v3 -> v4:
- rebased
---
net/mptcp/protocol.c | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 4a4cb9952596..2364c144bf4f 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -936,8 +936,6 @@ static bool __mptcp_finish_join(struct mptcp_sock *msk, struct sock *ssk)
mptcp_subflow_ctx(ssk)->subflow_id = msk->subflow_id++;
mptcp_sockopt_sync_locked(msk, ssk);
mptcp_stop_tout_timer(sk);
- __mptcp_inherit_cgrp_data(sk, ssk);
- __mptcp_inherit_memcg(sk, ssk, GFP_ATOMIC);
__mptcp_propagate_sndbuf(sk, ssk);
return true;
}
@@ -3764,8 +3762,11 @@ static void mptcp_sock_check_graft(struct sock *sk, struct sock *ssk)
write_lock_bh(&sk->sk_callback_lock);
sock = sk->sk_socket;
write_unlock_bh(&sk->sk_callback_lock);
- if (sock)
+ if (sock) {
mptcp_sock_graft(ssk, sock);
+ __mptcp_inherit_cgrp_data(sk, ssk);
+ __mptcp_inherit_memcg(sk, ssk, GFP_ATOMIC);
+ }
}
bool mptcp_finish_join(struct sock *ssk)
@@ -4083,18 +4084,17 @@ static int mptcp_listen(struct socket *sock, int backlog)
return err;
}
-static void mptcp_graph_subflows(struct sock *sk)
+static void mptcp_graft_subflows(struct sock *sk)
{
struct mptcp_subflow_context *subflow;
struct mptcp_sock *msk = mptcp_sk(sk);
mptcp_for_each_subflow(msk, subflow) {
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
- bool slow;
- slow = lock_sock_fast(ssk);
+ lock_sock(ssk);
- /* set ssk->sk_socket of accept()ed flows to mptcp socket.
+ /* Set ssk->sk_socket of accept()ed flows to mptcp socket.
* This is needed so NOSPACE flag can be set from tcp stack.
*/
if (!ssk->sk_socket)
@@ -4102,7 +4102,7 @@ static void mptcp_graph_subflows(struct sock *sk)
__mptcp_inherit_cgrp_data(sk, ssk);
__mptcp_inherit_memcg(sk, ssk, GFP_KERNEL);
- unlock_sock_fast(ssk, slow);
+ release_sock(ssk);
}
}
@@ -4153,7 +4153,7 @@ static int mptcp_stream_accept(struct socket *sock, struct socket *newsock,
msk = mptcp_sk(newsk);
msk->in_accept_queue = 0;
- mptcp_graph_subflows(newsk);
+ mptcp_graft_subflows(newsk);
mptcp_rps_record_subflows(msk);
/* Do late cleanup for the first subflow as necessary. Also
--
2.51.1