lkml.org 
[lkml]   [2022]   [Sep]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 2/6] vsock: return errors other than -ENOMEM to socket
    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:
    > > 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 <bobby.eshleman@bytedance.com>
    > > ---
    > > 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

    > > 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

    \
     
     \ /
      Last update: 2022-09-26 23:31    [W:2.557 / U:0.428 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site