diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c index 1d74723b345..b41bc5abb72 100644 --- a/drivers/vhost/vhost.c +++ b/drivers/vhost/vhost.c @@ -164,6 +164,52 @@ static void vhost_defered_probe_work(FAR void *arg) * Public Functions ****************************************************************************/ +/**************************************************************************** + * Name: vhost_get_vq_buf + ****************************************************************************/ + +int vhost_get_vq_buffers(FAR struct virtqueue *vq, + FAR struct virtqueue_buf *vb, size_t vbsize, + FAR size_t *vbcnt) +{ + FAR void *buf; + uint16_t head; + uint16_t idx; + uint32_t len; + size_t i; + + DEBUGASSERT(vb != NULL && vbsize >= 1 && vbcnt != NULL); + + buf = virtqueue_get_first_avail_buffer(vq, &head, &len); + if (buf == NULL) + { + return -ENOMEM; + } + + vb[0].buf = buf; + vb[0].len = len; + + for (i = 1, idx = head; ; i++) + { + buf = virtqueue_get_next_avail_buffer(vq, idx, &idx, &len); + if (buf == NULL) + { + break; + } + else if (i >= vbsize) + { + vhosterr("vbsize %zu is not enough\n", vbsize); + return -EINVAL; + } + + vb[i].buf = buf; + vb[i].len = len; + } + + *vbcnt = i; + return head; +} + /**************************************************************************** * Name: vhost_register_driver ****************************************************************************/ diff --git a/include/nuttx/vhost/vhost.h b/include/nuttx/vhost/vhost.h index 940aa06876a..bef97150861 100644 --- a/include/nuttx/vhost/vhost.h +++ b/include/nuttx/vhost/vhost.h @@ -88,6 +88,9 @@ int vhost_register_device(FAR struct vhost_device *hdev); int vhost_register_driver(FAR struct vhost_driver *hdrv); int vhost_unregister_driver(FAR struct vhost_driver *hdrv); int vhost_unregister_device(FAR struct vhost_device *hdev); +int vhost_get_vq_buffers(FAR struct virtqueue *vq, + FAR struct virtqueue_buf *vb, size_t vbsize, + FAR size_t *vbcnt); /**************************************************************************** * Name: vhost_register_drivers