mptcp: consolidate sockopt synchronization
authorPaolo Abeni <pabeni@redhat.com>
Mon, 23 Oct 2023 20:44:40 +0000 (13:44 -0700)
committerJakub Kicinski <kuba@kernel.org>
Wed, 25 Oct 2023 19:23:34 +0000 (12:23 -0700)
Move the socket option synchronization for active subflows
at subflow creation time. This allows removing the now unused
unlocked variant of such helper.

While at that, clean-up a bit the mptcp_subflow_create_socket()
errors path.

Reviewed-by: Mat Martineau <martineau@kernel.org>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Mat Martineau <martineau@kernel.org>
Link: https://lore.kernel.org/r/20231023-send-net-next-20231023-2-v1-7-9dc60939d371@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/mptcp/protocol.c
net/mptcp/sockopt.c
net/mptcp/subflow.c

index 5489f02..e44a3da 100644 (file)
@@ -121,8 +121,6 @@ struct sock *__mptcp_nmpc_sk(struct mptcp_sock *msk)
                ret = __mptcp_socket_create(msk);
                if (ret)
                        return ERR_PTR(ret);
-
-               mptcp_sockopt_sync(msk, msk->first);
        }
 
        return msk->first;
index d15891e..abf0645 100644 (file)
@@ -1444,28 +1444,6 @@ static void sync_socket_options(struct mptcp_sock *msk, struct sock *ssk)
        inet_assign_bit(FREEBIND, ssk, inet_test_bit(FREEBIND, sk));
 }
 
-static void __mptcp_sockopt_sync(struct mptcp_sock *msk, struct sock *ssk)
-{
-       bool slow = lock_sock_fast(ssk);
-
-       sync_socket_options(msk, ssk);
-
-       unlock_sock_fast(ssk, slow);
-}
-
-void mptcp_sockopt_sync(struct mptcp_sock *msk, struct sock *ssk)
-{
-       struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
-
-       msk_owned_by_me(msk);
-
-       if (READ_ONCE(subflow->setsockopt_seq) != msk->setsockopt_seq) {
-               __mptcp_sockopt_sync(msk, ssk);
-
-               subflow->setsockopt_seq = msk->setsockopt_seq;
-       }
-}
-
 void mptcp_sockopt_sync_locked(struct mptcp_sock *msk, struct sock *ssk)
 {
        struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
index 080b164..df20866 100644 (file)
@@ -1533,8 +1533,6 @@ int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_addr_info *loc,
        if (addr.ss_family == AF_INET6)
                addrlen = sizeof(struct sockaddr_in6);
 #endif
-       mptcp_sockopt_sync(msk, ssk);
-
        ssk->sk_bound_dev_if = ifindex;
        err = kernel_bind(sf, (struct sockaddr *)&addr, addrlen);
        if (err)
@@ -1645,7 +1643,7 @@ int mptcp_subflow_create_socket(struct sock *sk, unsigned short family,
 
        err = security_mptcp_add_subflow(sk, sf->sk);
        if (err)
-               goto release_ssk;
+               goto err_free;
 
        /* the newly created socket has to be in the same cgroup as its parent */
        mptcp_attach_cgroup(sk, sf->sk);
@@ -1659,15 +1657,12 @@ int mptcp_subflow_create_socket(struct sock *sk, unsigned short family,
        get_net_track(net, &sf->sk->ns_tracker, GFP_KERNEL);
        sock_inuse_add(net, 1);
        err = tcp_set_ulp(sf->sk, "mptcp");
+       if (err)
+               goto err_free;
 
-release_ssk:
+       mptcp_sockopt_sync_locked(mptcp_sk(sk), sf->sk);
        release_sock(sf->sk);
 
-       if (err) {
-               sock_release(sf);
-               return err;
-       }
-
        /* the newly created socket really belongs to the owning MPTCP master
         * socket, even if for additional subflows the allocation is performed
         * by a kernel workqueue. Adjust inode references, so that the
@@ -1687,6 +1682,11 @@ release_ssk:
        mptcp_subflow_ops_override(sf->sk);
 
        return 0;
+
+err_free:
+       release_sock(sf->sk);
+       sock_release(sf);
+       return err;
 }
 
 static struct mptcp_subflow_context *subflow_create_ctx(struct sock *sk,