Message ID | 20210413124552.3404877-1-arseny.krasnov@kaspersky.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | virtio/vsock: introduce SOCK_SEQPACKET support | expand |
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@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 >
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; + 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 = {
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@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(+)