All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arseny Krasnov <arseny.krasnov@kaspersky.com>
To: Stefan Hajnoczi <stefanha@redhat.com>,
	Stefano Garzarella <sgarzare@redhat.com>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	Jason Wang <jasowang@redhat.com>,
	"David S. Miller" <davem@davemloft.net>,
	Jakub Kicinski <kuba@kernel.org>,
	Arseny Krasnov <arseny.krasnov@kaspersky.com>,
	Jorgen Hansen <jhansen@vmware.com>,
	Norbert Slusarek <nslusarek@gmx.net>,
	Andra Paraschiv <andraprs@amazon.com>,
	Colin Ian King <colin.king@canonical.com>
Cc: <kvm@vger.kernel.org>,
	<virtualization@lists.linux-foundation.org>,
	<netdev@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<stsp2@yandex.ru>, <oxffffaa@gmail.com>
Subject: [RFC PATCH v9 03/19] af_vsock: separate receive data loop
Date: Sat, 8 May 2021 19:33:00 +0300	[thread overview]
Message-ID: <20210508163304.3431004-1-arseny.krasnov@kaspersky.com> (raw)
In-Reply-To: <20210508163027.3430238-1-arseny.krasnov@kaspersky.com>

Move STREAM specific data receive logic to '__vsock_stream_recvmsg()'
dedicated function, while checks, that will be same for both STREAM
and SEQPACKET sockets, stays in 'vsock_connectible_recvmsg()' shared
functions.

Signed-off-by: Arseny Krasnov <arseny.krasnov@kaspersky.com>
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
---
 net/vmw_vsock/af_vsock.c | 116 ++++++++++++++++++++++-----------------
 1 file changed, 67 insertions(+), 49 deletions(-)

diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
index 4269e80b02cd..c4f6bfa1e381 100644
--- a/net/vmw_vsock/af_vsock.c
+++ b/net/vmw_vsock/af_vsock.c
@@ -1896,65 +1896,22 @@ static int vsock_wait_data(struct sock *sk, struct wait_queue_entry *wait,
 	return data;
 }
 
-static int
-vsock_connectible_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
-			  int flags)
+static int __vsock_stream_recvmsg(struct sock *sk, struct msghdr *msg,
+				  size_t len, int flags)
 {
-	struct sock *sk;
-	struct vsock_sock *vsk;
+	struct vsock_transport_recv_notify_data recv_data;
 	const struct vsock_transport *transport;
-	int err;
-	size_t target;
+	struct vsock_sock *vsk;
 	ssize_t copied;
+	size_t target;
 	long timeout;
-	struct vsock_transport_recv_notify_data recv_data;
+	int err;
 
 	DEFINE_WAIT(wait);
 
-	sk = sock->sk;
 	vsk = vsock_sk(sk);
-	err = 0;
-
-	lock_sock(sk);
-
 	transport = vsk->transport;
 
-	if (!transport || sk->sk_state != TCP_ESTABLISHED) {
-		/* Recvmsg is supposed to return 0 if a peer performs an
-		 * orderly shutdown. Differentiate between that case and when a
-		 * peer has not connected or a local shutdown occurred with the
-		 * SOCK_DONE flag.
-		 */
-		if (sock_flag(sk, SOCK_DONE))
-			err = 0;
-		else
-			err = -ENOTCONN;
-
-		goto out;
-	}
-
-	if (flags & MSG_OOB) {
-		err = -EOPNOTSUPP;
-		goto out;
-	}
-
-	/* We don't check peer_shutdown flag here since peer may actually shut
-	 * down, but there can be data in the queue that a local socket can
-	 * receive.
-	 */
-	if (sk->sk_shutdown & RCV_SHUTDOWN) {
-		err = 0;
-		goto out;
-	}
-
-	/* It is valid on Linux to pass in a zero-length receive buffer.  This
-	 * is not an error.  We may as well bail out now.
-	 */
-	if (!len) {
-		err = 0;
-		goto out;
-	}
-
 	/* We must not copy less than target bytes into the user's buffer
 	 * before returning successfully, so we wait for the consume queue to
 	 * have that much data to consume before dequeueing.  Note that this
@@ -2013,6 +1970,67 @@ vsock_connectible_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
 	if (copied > 0)
 		err = copied;
 
+out:
+	return err;
+}
+
+static int
+vsock_connectible_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
+			  int flags)
+{
+	struct sock *sk;
+	struct vsock_sock *vsk;
+	const struct vsock_transport *transport;
+	int err;
+
+	DEFINE_WAIT(wait);
+
+	sk = sock->sk;
+	vsk = vsock_sk(sk);
+	err = 0;
+
+	lock_sock(sk);
+
+	transport = vsk->transport;
+
+	if (!transport || sk->sk_state != TCP_ESTABLISHED) {
+		/* Recvmsg is supposed to return 0 if a peer performs an
+		 * orderly shutdown. Differentiate between that case and when a
+		 * peer has not connected or a local shutdown occurred with the
+		 * SOCK_DONE flag.
+		 */
+		if (sock_flag(sk, SOCK_DONE))
+			err = 0;
+		else
+			err = -ENOTCONN;
+
+		goto out;
+	}
+
+	if (flags & MSG_OOB) {
+		err = -EOPNOTSUPP;
+		goto out;
+	}
+
+	/* We don't check peer_shutdown flag here since peer may actually shut
+	 * down, but there can be data in the queue that a local socket can
+	 * receive.
+	 */
+	if (sk->sk_shutdown & RCV_SHUTDOWN) {
+		err = 0;
+		goto out;
+	}
+
+	/* It is valid on Linux to pass in a zero-length receive buffer.  This
+	 * is not an error.  We may as well bail out now.
+	 */
+	if (!len) {
+		err = 0;
+		goto out;
+	}
+
+	err = __vsock_stream_recvmsg(sk, msg, len, flags);
+
 out:
 	release_sock(sk);
 	return err;
-- 
2.25.1


  parent reply	other threads:[~2021-05-08 16:33 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-08 16:30 [RFC PATCH v9 00/19] virtio/vsock: introduce SOCK_SEQPACKET support Arseny Krasnov
2021-05-08 16:32 ` [RFC PATCH v9 01/19] af_vsock: update functions for connectible socket Arseny Krasnov
2021-05-08 16:32 ` [RFC PATCH v9 02/19] af_vsock: separate wait data loop Arseny Krasnov
2021-05-08 16:33 ` Arseny Krasnov [this message]
2021-05-08 16:33 ` [RFC PATCH v9 04/19] af_vsock: implement SEQPACKET receive loop Arseny Krasnov
2021-05-13 11:37   ` Stefano Garzarella
2021-05-13 11:37     ` Stefano Garzarella
2021-05-13 14:41     ` Arseny Krasnov
2021-05-08 16:33 ` [RFC PATCH v9 05/19] af_vsock: implement send logic for SEQPACKET Arseny Krasnov
2021-05-08 16:33 ` [RFC PATCH v9 06/19] af_vsock: rest of SEQPACKET support Arseny Krasnov
2021-05-13 11:42   ` Stefano Garzarella
2021-05-13 11:42     ` Stefano Garzarella
2021-05-08 16:34 ` [RFC PATCH v9 07/19] af_vsock: update comments for stream sockets Arseny Krasnov
2021-05-08 16:34 ` [RFC PATCH v9 08/19] virtio/vsock: set packet's type in virtio_transport_send_pkt_info() Arseny Krasnov
2021-05-08 16:34 ` [RFC PATCH v9 09/19] virtio/vsock: simplify credit update function API Arseny Krasnov
2021-05-08 16:35 ` [RFC PATCH v9 10/19] virtio/vsock: defines and constants for SEQPACKET Arseny Krasnov
2021-05-13 11:45   ` Stefano Garzarella
2021-05-13 11:45     ` Stefano Garzarella
2021-05-13 14:42     ` Arseny Krasnov
2021-05-08 16:35 ` [RFC PATCH v9 11/19] virtio/vsock: dequeue callback for SOCK_SEQPACKET Arseny Krasnov
2021-05-13 11:58   ` Stefano Garzarella
2021-05-13 11:58     ` Stefano Garzarella
2021-05-13 14:42     ` Arseny Krasnov
2021-05-13 12:18   ` Stefano Garzarella
2021-05-13 12:18     ` Stefano Garzarella
2021-05-08 16:35 ` [RFC PATCH v9 12/19] virtio/vsock: add SEQPACKET receive logic Arseny Krasnov
2021-05-13 12:14   ` Stefano Garzarella
2021-05-13 12:14     ` Stefano Garzarella
2021-05-13 14:43     ` Arseny Krasnov
2021-05-08 16:35 ` [RFC PATCH v9 13/19] virtio/vsock: rest of SOCK_SEQPACKET support Arseny Krasnov
2021-05-13 12:27   ` Stefano Garzarella
2021-05-13 12:27     ` Stefano Garzarella
2021-05-13 13:03     ` Stefano Garzarella
2021-05-13 13:03       ` Stefano Garzarella
2021-05-08 16:36 ` [RFC PATCH v9 14/19] virtio/vsock: enable SEQPACKET for transport Arseny Krasnov
2021-05-13 12:49   ` Stefano Garzarella
2021-05-13 12:49     ` Stefano Garzarella
2021-05-13 14:44     ` Arseny Krasnov
2021-05-08 16:36 ` [RFC PATCH v9 15/19] vhost/vsock: " Arseny Krasnov
2021-05-13 13:44   ` Stefano Garzarella
2021-05-13 13:44     ` Stefano Garzarella
2021-05-08 16:36 ` [RFC PATCH v9 16/19] vsock/loopback: " Arseny Krasnov
2021-05-08 16:37 ` [RFC PATCH v9 17/19] vsock_test: add SOCK_SEQPACKET tests Arseny Krasnov
2021-05-13 13:47   ` Stefano Garzarella
2021-05-13 13:47     ` Stefano Garzarella
2021-05-08 16:37 ` [RFC PATCH v9 18/19] virtio/vsock: update trace event for SEQPACKET Arseny Krasnov
2021-05-08 16:37 ` [RFC PATCH v9 19/19] af_vsock: serialize writes to shared socket Arseny Krasnov
2021-05-13 14:01   ` Stefano Garzarella
2021-05-13 14:01     ` Stefano Garzarella
2021-05-13 14:45     ` Arseny Krasnov
2021-05-13 14:46     ` Stefano Garzarella
2021-05-13 14:46       ` Stefano Garzarella
2021-05-13 14:48       ` Arseny Krasnov
2021-05-13 15:41         ` Stefano Garzarella
2021-05-13 15:41           ` Stefano Garzarella
2021-05-13 14:51     ` Arseny Krasnov
2021-05-13 14:10 ` [RFC PATCH v9 00/19] virtio/vsock: introduce SOCK_SEQPACKET support Stefano Garzarella
2021-05-13 14:10   ` Stefano Garzarella
2021-05-13 14:46   ` Arseny Krasnov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210508163304.3431004-1-arseny.krasnov@kaspersky.com \
    --to=arseny.krasnov@kaspersky.com \
    --cc=andraprs@amazon.com \
    --cc=colin.king@canonical.com \
    --cc=davem@davemloft.net \
    --cc=jasowang@redhat.com \
    --cc=jhansen@vmware.com \
    --cc=kuba@kernel.org \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mst@redhat.com \
    --cc=netdev@vger.kernel.org \
    --cc=nslusarek@gmx.net \
    --cc=oxffffaa@gmail.com \
    --cc=sgarzare@redhat.com \
    --cc=stefanha@redhat.com \
    --cc=stsp2@yandex.ru \
    --cc=virtualization@lists.linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.