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