Thread (66 messages) 66 messages, 10 authors, 2022-09-27

Re: [PATCH 2/6] vsock: return errors other than -ENOMEM to socket

From: Bobby Eshleman <hidden>
Date: 2022-09-26 21:31:03
Also in: kvm, linux-hyperv, lkml

On Mon, Sep 26, 2022 at 03:21:45PM +0200, Stefano Garzarella wrote:
On Mon, Aug 15, 2022 at 10:56:05AM -0700, Bobby Eshleman wrote:
quoted
This commit allows vsock implementations to return errors
to the socket layer other than -ENOMEM. One immediate effect
of this is that upon the sk_sndbuf threshold being reached -EAGAIN
will be returned and userspace may throttle appropriately.

Resultingly, a known issue with uperf is resolved[1].

Additionally, to preserve legacy behavior for non-virtio
implementations, hyperv/vmci force errors to be -ENOMEM so that behavior
is unchanged.

[1]: https://gitlab.com/vsock/vsock/-/issues/1

Signed-off-by: Bobby Eshleman <redacted>
---
include/linux/virtio_vsock.h            | 3 +++
net/vmw_vsock/af_vsock.c                | 3 ++-
net/vmw_vsock/hyperv_transport.c        | 2 +-
net/vmw_vsock/virtio_transport_common.c | 3 ---
net/vmw_vsock/vmci_transport.c          | 9 ++++++++-
5 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/include/linux/virtio_vsock.h b/include/linux/virtio_vsock.h
index 17ed01466875..9a37eddbb87a 100644
--- a/include/linux/virtio_vsock.h
+++ b/include/linux/virtio_vsock.h
@@ -8,6 +8,9 @@
#include <net/sock.h>
#include <net/af_vsock.h>

+/* Threshold for detecting small packets to copy */
+#define GOOD_COPY_LEN  128
+
This change seems unrelated.

Please move it in the patch where you need this.
Maybe it's better to add a prefix if we move it in an header file (e.g.
VIRTIO_VSOCK_...).

Thanks,
Stefano
Oh yes, definitely.

Thanks,
Bobby
quoted
enum virtio_vsock_metadata_flags {
	VIRTIO_VSOCK_METADATA_FLAGS_REPLY		= BIT(0),
	VIRTIO_VSOCK_METADATA_FLAGS_TAP_DELIVERED	= BIT(1),
diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
index e348b2d09eac..1893f8aafa48 100644
--- a/net/vmw_vsock/af_vsock.c
+++ b/net/vmw_vsock/af_vsock.c
@@ -1844,8 +1844,9 @@ static int vsock_connectible_sendmsg(struct socket *sock, struct msghdr *msg,
			written = transport->stream_enqueue(vsk,
					msg, len - total_written);
		}
+
		if (written < 0) {
-			err = -ENOMEM;
+			err = written;
			goto out_err;
		}
diff --git a/net/vmw_vsock/hyperv_transport.c b/net/vmw_vsock/hyperv_transport.c
index fd98229e3db3..e99aea571f6f 100644
--- a/net/vmw_vsock/hyperv_transport.c
+++ b/net/vmw_vsock/hyperv_transport.c
@@ -687,7 +687,7 @@ static ssize_t hvs_stream_enqueue(struct vsock_sock *vsk, struct msghdr *msg,
	if (bytes_written)
		ret = bytes_written;
	kfree(send_buf);
-	return ret;
+	return ret < 0 ? -ENOMEM : ret;
}

static s64 hvs_stream_has_data(struct vsock_sock *vsk)
diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c
index 920578597bb9..d5780599fe93 100644
--- a/net/vmw_vsock/virtio_transport_common.c
+++ b/net/vmw_vsock/virtio_transport_common.c
@@ -23,9 +23,6 @@
/* How long to wait for graceful shutdown of a connection */
#define VSOCK_CLOSE_TIMEOUT (8 * HZ)

-/* Threshold for detecting small packets to copy */
-#define GOOD_COPY_LEN  128
-
static const struct virtio_transport *
virtio_transport_get_ops(struct vsock_sock *vsk)
{
diff --git a/net/vmw_vsock/vmci_transport.c b/net/vmw_vsock/vmci_transport.c
index b14f0ed7427b..c927a90dc859 100644
--- a/net/vmw_vsock/vmci_transport.c
+++ b/net/vmw_vsock/vmci_transport.c
@@ -1838,7 +1838,14 @@ static ssize_t vmci_transport_stream_enqueue(
	struct msghdr *msg,
	size_t len)
{
-	return vmci_qpair_enquev(vmci_trans(vsk)->qpair, msg, len, 0);
+	int err;
+
+	err = vmci_qpair_enquev(vmci_trans(vsk)->qpair, msg, len, 0);
+
+	if (err < 0)
+		err = -ENOMEM;
+
+	return err;
}

static s64 vmci_transport_stream_has_data(struct vsock_sock *vsk)
-- 
2.35.1
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help