This adds zerocopy callback to vhost transport. Signed-off-by: Arseniy Krasnov <AVKrasnov@xxxxxxxxxxxxxx> --- drivers/vhost/vsock.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c index 0dc2229f18f7..dcb8182f5ac9 100644 --- a/drivers/vhost/vsock.c +++ b/drivers/vhost/vsock.c @@ -481,6 +481,43 @@ static bool vhost_vsock_more_replies(struct vhost_vsock *vsock) return val < vq->num; } +static int vhost_transport_zerocopy_set(struct vsock_sock *vsk, bool enable) +{ + struct vhost_vsock *vsock; + + rcu_read_lock(); + vsock = vhost_vsock_get(vsk->remote_addr.svm_cid); + + if (!vsock) { + rcu_read_unlock(); + return -ENODEV; + } + + vsock->zerocopy_rx_on = enable; + rcu_read_unlock(); + + return 0; +} + +static int vhost_transport_zerocopy_get(struct vsock_sock *vsk) +{ + struct vhost_vsock *vsock; + bool res; + + rcu_read_lock(); + vsock = vhost_vsock_get(vsk->remote_addr.svm_cid); + + if (!vsock) { + rcu_read_unlock(); + return -ENODEV; + } + + res = vsock->zerocopy_rx_on; + rcu_read_unlock(); + + return res; +} + static bool vhost_transport_seqpacket_allow(u32 remote_cid); static struct virtio_transport vhost_transport = { @@ -508,6 +545,9 @@ static struct virtio_transport vhost_transport = { .stream_rcvhiwat = virtio_transport_stream_rcvhiwat, .stream_is_active = virtio_transport_stream_is_active, .stream_allow = virtio_transport_stream_allow, + .zerocopy_dequeue = virtio_transport_zerocopy_dequeue, + .rx_zerocopy_set = vhost_transport_zerocopy_set, + .rx_zerocopy_get = vhost_transport_zerocopy_get, .seqpacket_dequeue = virtio_transport_seqpacket_dequeue, .seqpacket_enqueue = virtio_transport_seqpacket_enqueue, -- 2.25.1