Stefano Garzarella
2021-Apr-21 09:22 UTC
[RFC PATCH v8 14/19] virtio/vsock: enable SEQPACKET for transport
On Tue, Apr 13, 2021 at 03:45:49PM +0300, Arseny Krasnov wrote:>This adds >1) SEQPACKET ops for virtio transport and 'seqpacket_allow()' callback. >2) Handling of SEQPACKET bit: guest tries to negotiate it with vhost. > >Signed-off-by: Arseny Krasnov <arseny.krasnov at kaspersky.com> >--- >v7 -> v8: > - This patch merged with patch which adds SEQPACKET feature bit to > virtio transport. > > net/vmw_vsock/virtio_transport.c | 17 +++++++++++++++++ > 1 file changed, 17 insertions(+) > >diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c >index 2700a63ab095..ee99bd919a12 100644 >--- a/net/vmw_vsock/virtio_transport.c >+++ b/net/vmw_vsock/virtio_transport.c >@@ -443,6 +443,8 @@ static void virtio_vsock_rx_done(struct virtqueue >*vq) > queue_work(virtio_vsock_workqueue, &vsock->rx_work); > } > >+static bool virtio_transport_seqpacket_allow(void); >+ > static struct virtio_transport virtio_transport = { > .transport = { > .module = THIS_MODULE, >@@ -469,6 +471,10 @@ static struct virtio_transport virtio_transport = { > .stream_is_active = virtio_transport_stream_is_active, > .stream_allow = virtio_transport_stream_allow, > >+ .seqpacket_dequeue = virtio_transport_seqpacket_dequeue, >+ .seqpacket_enqueue = virtio_transport_seqpacket_enqueue, >+ .seqpacket_allow = virtio_transport_seqpacket_allow, >+ > .notify_poll_in = virtio_transport_notify_poll_in, > .notify_poll_out = > virtio_transport_notify_poll_out, > .notify_recv_init = virtio_transport_notify_recv_init, >@@ -483,8 +489,14 @@ static struct virtio_transport virtio_transport = { > }, > > .send_pkt = virtio_transport_send_pkt, >+ .seqpacket_allow = false > }; > >+static bool virtio_transport_seqpacket_allow(void) >+{ >+ return virtio_transport.seqpacket_allow; >+} >+ > static void virtio_transport_rx_work(struct work_struct *work) > { > struct virtio_vsock *vsock >@@ -612,6 +624,10 @@ static int virtio_vsock_probe(struct virtio_device *vdev) > rcu_assign_pointer(the_virtio_vsock, vsock); > > mutex_unlock(&the_virtio_vsock_mutex); >+ >+ if (vdev->features & (1ULL << VIRTIO_VSOCK_F_SEQPACKET)) >+ virtio_transport.seqpacket_allow = true; >+virtio-vsock devices can be hot-plugged and hot-unplugged, so we should reset virtio_transport.seqpacket_allow at every probe. Now thinking about it more, would it be better to save this information in struct virtio_vsock instead of struct virtio_transport?> return 0; > > out: >@@ -695,6 +711,7 @@ static struct virtio_device_id id_table[] = { > }; > > static unsigned int features[] = { >+ VIRTIO_VSOCK_F_SEQPACKET > }; > > static struct virtio_driver virtio_vsock_driver = { >-- >2.25.1 >