2019-10-11 13:11:56

by Stefano Garzarella

[permalink] [raw]
Subject: [PATCH net 0/2] vsock: don't allow half-closed socket in the host transports

We are implementing a test suite for the VSOCK sockets and we discovered
that vmci_transport never allowed half-closed socket on the host side.

As Jorgen explained [1] this is due to the implementation of VMCI.

Since we want to have the same behaviour across all transports, this
series adds a section in the "Implementation notes" to exaplain this
behaviour, and changes the vhost_transport to behave the same way.

[1] https://patchwork.ozlabs.org/cover/847998/#1831400

Stefano Garzarella (2):
vsock: add half-closed socket details in the implementation notes
vhost/vsock: don't allow half-closed socket in the host

drivers/vhost/vsock.c | 17 ++++++++++++++++-
net/vmw_vsock/af_vsock.c | 4 ++++
2 files changed, 20 insertions(+), 1 deletion(-)

--
2.21.0


2019-10-11 13:12:08

by Stefano Garzarella

[permalink] [raw]
Subject: [PATCH net 2/2] vhost/vsock: don't allow half-closed socket in the host

vmci_transport never allowed half-closed socket on the host side.
In order to provide the same behaviour, we changed the
vhost_transport_stream_has_data() to return 0 (no data available)
if the peer (guest) closed the connection.

Signed-off-by: Stefano Garzarella <[email protected]>
---
drivers/vhost/vsock.c | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c
index 9f57736fe15e..754120aa4478 100644
--- a/drivers/vhost/vsock.c
+++ b/drivers/vhost/vsock.c
@@ -58,6 +58,21 @@ static u32 vhost_transport_get_local_cid(void)
return VHOST_VSOCK_DEFAULT_HOST_CID;
}

+static s64 vhost_transport_stream_has_data(struct vsock_sock *vsk)
+{
+ /* vmci_transport doesn't allow half-closed socket on the host side.
+ * recv() on the host side returns EOF when the guest closes a
+ * connection, also if some data is still in the receive queue.
+ *
+ * In order to provide the same behaviour, we always return 0
+ * (no data available) if the peer (guest) closed the connection.
+ */
+ if (vsk->peer_shutdown == SHUTDOWN_MASK)
+ return 0;
+
+ return virtio_transport_stream_has_data(vsk);
+}
+
/* Callers that dereference the return value must hold vhost_vsock_mutex or the
* RCU read lock.
*/
@@ -804,7 +819,7 @@ static struct virtio_transport vhost_transport = {

.stream_enqueue = virtio_transport_stream_enqueue,
.stream_dequeue = virtio_transport_stream_dequeue,
- .stream_has_data = virtio_transport_stream_has_data,
+ .stream_has_data = vhost_transport_stream_has_data,
.stream_has_space = virtio_transport_stream_has_space,
.stream_rcvhiwat = virtio_transport_stream_rcvhiwat,
.stream_is_active = virtio_transport_stream_is_active,
--
2.21.0

2019-10-11 14:20:53

by Michael S. Tsirkin

[permalink] [raw]
Subject: Re: [PATCH net 0/2] vsock: don't allow half-closed socket in the host transports

On Fri, Oct 11, 2019 at 03:07:56PM +0200, Stefano Garzarella wrote:
> We are implementing a test suite for the VSOCK sockets and we discovered
> that vmci_transport never allowed half-closed socket on the host side.
>
> As Jorgen explained [1] this is due to the implementation of VMCI.
>
> Since we want to have the same behaviour across all transports, this
> series adds a section in the "Implementation notes" to exaplain this
> behaviour, and changes the vhost_transport to behave the same way.
>
> [1] https://patchwork.ozlabs.org/cover/847998/#1831400

Half closed sockets are very useful, and lots of
applications use tricks to swap a vsock for a tcp socket,
which might as a result break.

If VMCI really cares it can implement an ioctl to
allow applications to detect that half closed sockets aren't supported.

It does not look like VMCI wants to bother (users do not read
kernel implementation notes) so it does not really care.
So why do we want to cripple other transports intentionally?



> Stefano Garzarella (2):
> vsock: add half-closed socket details in the implementation notes
> vhost/vsock: don't allow half-closed socket in the host
>
> drivers/vhost/vsock.c | 17 ++++++++++++++++-
> net/vmw_vsock/af_vsock.c | 4 ++++
> 2 files changed, 20 insertions(+), 1 deletion(-)
>
> --
> 2.21.0

2019-10-11 14:30:12

by Michael S. Tsirkin

[permalink] [raw]
Subject: Re: [PATCH net 2/2] vhost/vsock: don't allow half-closed socket in the host

On Fri, Oct 11, 2019 at 03:07:58PM +0200, Stefano Garzarella wrote:
> vmci_transport never allowed half-closed socket on the host side.
> In order to provide the same behaviour, we changed the
> vhost_transport_stream_has_data() to return 0 (no data available)
> if the peer (guest) closed the connection.
>
> Signed-off-by: Stefano Garzarella <[email protected]>

I don't think we should copy bugs like this.
Applications don't actually depend on this VMCI limitation, in fact
it looks like a working application can get broken by this.

So this looks like a userspace visible ABI change
which we can't really do.

If it turns out some application cares, it can always
fully close the connection. Or add an ioctl so the application
can find out whether half close works.

> ---
> drivers/vhost/vsock.c | 17 ++++++++++++++++-
> 1 file changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c
> index 9f57736fe15e..754120aa4478 100644
> --- a/drivers/vhost/vsock.c
> +++ b/drivers/vhost/vsock.c
> @@ -58,6 +58,21 @@ static u32 vhost_transport_get_local_cid(void)
> return VHOST_VSOCK_DEFAULT_HOST_CID;
> }
>
> +static s64 vhost_transport_stream_has_data(struct vsock_sock *vsk)
> +{
> + /* vmci_transport doesn't allow half-closed socket on the host side.
> + * recv() on the host side returns EOF when the guest closes a
> + * connection, also if some data is still in the receive queue.
> + *
> + * In order to provide the same behaviour, we always return 0
> + * (no data available) if the peer (guest) closed the connection.
> + */
> + if (vsk->peer_shutdown == SHUTDOWN_MASK)
> + return 0;
> +
> + return virtio_transport_stream_has_data(vsk);
> +}
> +
> /* Callers that dereference the return value must hold vhost_vsock_mutex or the
> * RCU read lock.
> */
> @@ -804,7 +819,7 @@ static struct virtio_transport vhost_transport = {
>
> .stream_enqueue = virtio_transport_stream_enqueue,
> .stream_dequeue = virtio_transport_stream_dequeue,
> - .stream_has_data = virtio_transport_stream_has_data,
> + .stream_has_data = vhost_transport_stream_has_data,
> .stream_has_space = virtio_transport_stream_has_space,
> .stream_rcvhiwat = virtio_transport_stream_rcvhiwat,
> .stream_is_active = virtio_transport_stream_is_active,
> --
> 2.21.0

2019-10-11 14:40:19

by Stefano Garzarella

[permalink] [raw]
Subject: Re: [PATCH net 2/2] vhost/vsock: don't allow half-closed socket in the host

On Fri, Oct 11, 2019 at 10:26:34AM -0400, Michael S. Tsirkin wrote:
> On Fri, Oct 11, 2019 at 03:07:58PM +0200, Stefano Garzarella wrote:
> > vmci_transport never allowed half-closed socket on the host side.
> > In order to provide the same behaviour, we changed the
> > vhost_transport_stream_has_data() to return 0 (no data available)
> > if the peer (guest) closed the connection.
> >
> > Signed-off-by: Stefano Garzarella <[email protected]>
>
> I don't think we should copy bugs like this.
> Applications don't actually depend on this VMCI limitation, in fact
> it looks like a working application can get broken by this.
>
> So this looks like a userspace visible ABI change
> which we can't really do.
>
> If it turns out some application cares, it can always
> fully close the connection. Or add an ioctl so the application
> can find out whether half close works.
>

I got your point.
Discard this patch.

Thanks,
Stefano

2019-10-11 14:45:22

by Stefano Garzarella

[permalink] [raw]
Subject: Re: [PATCH net 0/2] vsock: don't allow half-closed socket in the host transports

On Fri, Oct 11, 2019 at 10:19:13AM -0400, Michael S. Tsirkin wrote:
> On Fri, Oct 11, 2019 at 03:07:56PM +0200, Stefano Garzarella wrote:
> > We are implementing a test suite for the VSOCK sockets and we discovered
> > that vmci_transport never allowed half-closed socket on the host side.
> >
> > As Jorgen explained [1] this is due to the implementation of VMCI.
> >
> > Since we want to have the same behaviour across all transports, this
> > series adds a section in the "Implementation notes" to exaplain this
> > behaviour, and changes the vhost_transport to behave the same way.
> >
> > [1] https://patchwork.ozlabs.org/cover/847998/#1831400
>
> Half closed sockets are very useful, and lots of
> applications use tricks to swap a vsock for a tcp socket,
> which might as a result break.

Got it!

>
> If VMCI really cares it can implement an ioctl to
> allow applications to detect that half closed sockets aren't supported.
>
> It does not look like VMCI wants to bother (users do not read
> kernel implementation notes) so it does not really care.
> So why do we want to cripple other transports intentionally?

The main reason is that we are developing the test suite and we noticed
the miss match. Since we want to make sure that applications behave in
the same way on different transports, we thought we would solve it that
way.

But what you are saying (also in the reply of the patches) is actually
quite right. Not being publicized, applications do not expect this behavior,
so please discard this series.

My problem during the tests, was trying to figure out if half-closed
sockets were supported or not, so as you say adding an IOCTL or maybe
better a getsockopt() could solve the problem.

What do you think?

Thanks,
Stefano

2019-10-12 22:42:20

by Michael S. Tsirkin

[permalink] [raw]
Subject: Re: [PATCH net 0/2] vsock: don't allow half-closed socket in the host transports

On Fri, Oct 11, 2019 at 04:34:57PM +0200, Stefano Garzarella wrote:
> On Fri, Oct 11, 2019 at 10:19:13AM -0400, Michael S. Tsirkin wrote:
> > On Fri, Oct 11, 2019 at 03:07:56PM +0200, Stefano Garzarella wrote:
> > > We are implementing a test suite for the VSOCK sockets and we discovered
> > > that vmci_transport never allowed half-closed socket on the host side.
> > >
> > > As Jorgen explained [1] this is due to the implementation of VMCI.
> > >
> > > Since we want to have the same behaviour across all transports, this
> > > series adds a section in the "Implementation notes" to exaplain this
> > > behaviour, and changes the vhost_transport to behave the same way.
> > >
> > > [1] https://patchwork.ozlabs.org/cover/847998/#1831400
> >
> > Half closed sockets are very useful, and lots of
> > applications use tricks to swap a vsock for a tcp socket,
> > which might as a result break.
>
> Got it!
>
> >
> > If VMCI really cares it can implement an ioctl to
> > allow applications to detect that half closed sockets aren't supported.
> >
> > It does not look like VMCI wants to bother (users do not read
> > kernel implementation notes) so it does not really care.
> > So why do we want to cripple other transports intentionally?
>
> The main reason is that we are developing the test suite and we noticed
> the miss match. Since we want to make sure that applications behave in
> the same way on different transports, we thought we would solve it that
> way.
>
> But what you are saying (also in the reply of the patches) is actually
> quite right. Not being publicized, applications do not expect this behavior,
> so please discard this series.
>
> My problem during the tests, was trying to figure out if half-closed
> sockets were supported or not, so as you say adding an IOCTL or maybe
> better a getsockopt() could solve the problem.
>
> What do you think?
>
> Thanks,
> Stefano

Sure, why not.

2019-10-15 12:19:26

by Stefan Hajnoczi

[permalink] [raw]
Subject: Re: [PATCH net 0/2] vsock: don't allow half-closed socket in the host transports

On Sat, Oct 12, 2019 at 06:38:46PM -0400, Michael S. Tsirkin wrote:
> On Fri, Oct 11, 2019 at 04:34:57PM +0200, Stefano Garzarella wrote:
> > On Fri, Oct 11, 2019 at 10:19:13AM -0400, Michael S. Tsirkin wrote:
> > > On Fri, Oct 11, 2019 at 03:07:56PM +0200, Stefano Garzarella wrote:
> > > > We are implementing a test suite for the VSOCK sockets and we discovered
> > > > that vmci_transport never allowed half-closed socket on the host side.
> > > >
> > > > As Jorgen explained [1] this is due to the implementation of VMCI.
> > > >
> > > > Since we want to have the same behaviour across all transports, this
> > > > series adds a section in the "Implementation notes" to exaplain this
> > > > behaviour, and changes the vhost_transport to behave the same way.
> > > >
> > > > [1] https://patchwork.ozlabs.org/cover/847998/#1831400
> > >
> > > Half closed sockets are very useful, and lots of
> > > applications use tricks to swap a vsock for a tcp socket,
> > > which might as a result break.
> >
> > Got it!
> >
> > >
> > > If VMCI really cares it can implement an ioctl to
> > > allow applications to detect that half closed sockets aren't supported.
> > >
> > > It does not look like VMCI wants to bother (users do not read
> > > kernel implementation notes) so it does not really care.
> > > So why do we want to cripple other transports intentionally?
> >
> > The main reason is that we are developing the test suite and we noticed
> > the miss match. Since we want to make sure that applications behave in
> > the same way on different transports, we thought we would solve it that
> > way.
> >
> > But what you are saying (also in the reply of the patches) is actually
> > quite right. Not being publicized, applications do not expect this behavior,
> > so please discard this series.
> >
> > My problem during the tests, was trying to figure out if half-closed
> > sockets were supported or not, so as you say adding an IOCTL or maybe
> > better a getsockopt() could solve the problem.
> >
> > What do you think?
> >
> > Thanks,
> > Stefano
>
> Sure, why not.

The aim is for applications using AF_VSOCK sockets to run on any
transport. When the semantics differ between transports it creates a
compatibility problem.

That said, I do think keeping the standard sockets behavior is
reasonable. If applications have problems on VMCI a sockopt may be
necessary :(.

Stefan


Attachments:
(No filename) (2.40 kB)
signature.asc (499.00 B)
Download all attachments