From patchwork Sat Oct 1 03:14:57 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmytro Shytyi X-Patchwork-Id: 12996347 X-Patchwork-Delegate: pabeni@redhat.com Received: from sender11-of-o51.zoho.eu (sender11-of-o51.zoho.eu [31.186.226.237]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A9FE71FD3 for ; Sat, 1 Oct 2022 03:15:21 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; t=1664594118; cv=none; d=zohomail.eu; s=zohoarc; b=CjE7ptcFhocwVFeJCwKpJE9DyOR3P7TdgNZ1ilLecii2958qhxTk/P9AsMo3mziUteUP7zmoH4JzZWqupXaO9ESwfyO+QejrKPpP1h1vKTsTW6uz4SSaNWdOgtS+ScUItdvZVCMwMq8cwVkDOj9339wx3Q7uOm0tZK7HdxgkzcE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.eu; s=zohoarc; t=1664594118; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:To; bh=N3RtdGtzmUBXzQ7LRfA+iQiYh4l80rmrjXzHJl6ZLKk=; b=NSiEHyl9xipehhPu+7qE2Yw56sspfIXRv7T5OH69tr5vCyPUZfy06H0EPSIRXVT5i6I5wkbGH5UW3Kmb2plVCGRAQi8SbwvhGyeG39z6jV4J49IiOyPT1wS0ODHvUcTMfvhOLxIyjTkbCom4h488GvAN9McTFQb2KoUOa7gwdTs= ARC-Authentication-Results: i=1; mx.zohomail.eu; dkim=pass header.i=shytyi.net; spf=pass smtp.mailfrom=dmytro@shytyi.net; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1664594118; s=hs; d=shytyi.net; i=dmytro@shytyi.net; h=From:From:To:To:Cc:Cc:Message-ID:Subject:Subject:Date:Date:In-Reply-To:References:MIME-Version:Content-Transfer-Encoding:Content-Type:Message-Id:Reply-To; bh=N3RtdGtzmUBXzQ7LRfA+iQiYh4l80rmrjXzHJl6ZLKk=; b=KbpZiPIybHkX9rh2lM+R4M5YSbhNlmlxGSQCB8RQTmvDry7lsOBEVCn+HHR+YbyJ Ml4zpu/ghjZVKI4bwxQitEoj0hFZD+HSxEAeZiLwka7opNrBBie2DGPWSbhILPLyshJ y2GyLXkpfOiajAO9K7dqSxnXUGyZ8xT4yRv1A/9Q= Received: from localhost.localdomain (243.34.22.93.rev.sfr.net [93.22.34.243]) by mx.zoho.eu with SMTPS id 1664594116082515.4649384482763; Sat, 1 Oct 2022 05:15:16 +0200 (CEST) From: Dmytro Shytyi To: mptcp@lists.linux.dev Cc: Dmytro Shytyi Message-ID: <20221001031502.29152-3-dmytro@shytyi.net> Subject: [RFC PATCH mptcp-next v13 2/7] mptcp: add __mptcp_stream_connect() helper Date: Sat, 1 Oct 2022 03:14:57 +0000 X-Mailer: git-send-email 2.34.1 In-Reply-To: <20221001031502.29152-1-dmytro@shytyi.net> References: <20221001031502.29152-1-dmytro@shytyi.net> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-ZohoMailClient: External This helper is exctract from mptcp_stream_connect() without locks. Used in the mptcp_sendmsg() in conjunction with __mptcp_pre_connect(). Signed-off-by: Dmytro Shytyi --- net/mptcp/protocol.c | 53 +++++++++++++++++++++++++++++++------------- net/mptcp/protocol.h | 2 ++ 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index b080237d9d7e..f499e3e5a06b 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -1687,22 +1687,35 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) struct sock *ssk = ssock->sk; int copied_syn = 0; - lock_sock(ssk); - if (msg->msg_flags & MSG_FASTOPEN && sk->sk_state == TCP_CLOSE) + if (msg->msg_flags & MSG_FASTOPEN && sk->sk_state == TCP_CLOSE) { __mptcp_pre_connect(msk, ssk, msg, len); + /* we take nmpc_socket (first subflow) inside of __mptcp_stream_connect() */ + /* avoid lock_sock(ssk) as it seems leading to deadlock */ + ret = __mptcp_stream_connect(sk->sk_socket, msg->msg_name, + msg->msg_namelen, msg->msg_flags); + + if (ret >= 0) + copied += len; + else + goto do_error; + } else { - ret = tcp_sendmsg_fastopen(ssk, msg, &copied_syn, len, NULL); - copied += copied_syn; - if (ret == -EINPROGRESS && copied_syn > 0) { - /* reflect the new state on the MPTCP socket */ - inet_sk_state_store(sk, inet_sk_state_load(ssk)); - release_sock(ssk); - goto out; - } else if (ret) { + lock_sock(ssk); + + ret = tcp_sendmsg_fastopen(ssk, msg, &copied_syn, len, NULL); + + copied += copied_syn; + if (ret == -EINPROGRESS && copied_syn > 0) { + /* reflect the new state on the MPTCP socket */ + inet_sk_state_store(sk, inet_sk_state_load(ssk)); + release_sock(ssk); + goto out; + } else if (ret) { + release_sock(ssk); + goto do_error; + } release_sock(ssk); - goto do_error; } - release_sock(ssk); } timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); @@ -3570,15 +3583,14 @@ static void mptcp_subflow_early_fallback(struct mptcp_sock *msk, __mptcp_do_fallback(msk); } -static int mptcp_stream_connect(struct socket *sock, struct sockaddr *uaddr, - int addr_len, int flags) +int __mptcp_stream_connect(struct socket *sock, struct sockaddr *uaddr, + int addr_len, int flags) { struct mptcp_sock *msk = mptcp_sk(sock->sk); struct mptcp_subflow_context *subflow; struct socket *ssock; int err = -EINVAL; - lock_sock(sock->sk); if (uaddr) { if (addr_len < sizeof(uaddr->sa_family)) goto unlock; @@ -3633,7 +3645,18 @@ static int mptcp_stream_connect(struct socket *sock, struct sockaddr *uaddr, inet_sk_state_store(sock->sk, inet_sk_state_load(ssock->sk)); unlock: + return err; +} + +static int mptcp_stream_connect(struct socket *sock, struct sockaddr *uaddr, + int addr_len, int flags) +{ + int err = -EINVAL; + + lock_sock(sock->sk); + err = __mptcp_stream_connect(sock, uaddr, addr_len, flags); release_sock(sock->sk); + return err; } diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 30c03c70fdeb..e596f45763fd 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -837,6 +837,8 @@ void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk, void mptcp_event_addr_announced(const struct sock *ssk, const struct mptcp_addr_info *info); void mptcp_event_addr_removed(const struct mptcp_sock *msk, u8 id); bool mptcp_userspace_pm_active(const struct mptcp_sock *msk); +int __mptcp_stream_connect(struct socket *sock, struct sockaddr *uaddr, + int addr_len, int flags); // Fast Open Mechanism functions begin void __mptcp_pre_connect(struct mptcp_sock *msk, struct sock *ssk,