mirror of
https://github.com/apache/nuttx.git
synced 2026-05-31 23:40:19 +08:00
drivers/vhost: add vhost_get_vq_buffers() to collect scatter-gather buffers
Add vhost_get_vq_buffers() API to retrieve all chained buffers from a virtqueue in one call. This simplifies handling of scatter-gather I/O where data spans multiple descriptors. The function populates an array of virtqueue_buf structures with buffer pointers and lengths, returning the descriptor head index on success. Signed-off-by: Bowen Wang <wangbowen6@xiaomi.com> Signed-off-by: hongfengchen <hongfengchen@xiaomi.com>
This commit is contained in:
@@ -164,6 +164,52 @@ static void vhost_defered_probe_work(FAR void *arg)
|
|||||||
* Public Functions
|
* 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
|
* Name: vhost_register_driver
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|||||||
@@ -88,6 +88,9 @@ int vhost_register_device(FAR struct vhost_device *hdev);
|
|||||||
int vhost_register_driver(FAR struct vhost_driver *hdrv);
|
int vhost_register_driver(FAR struct vhost_driver *hdrv);
|
||||||
int vhost_unregister_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_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
|
* Name: vhost_register_drivers
|
||||||
|
|||||||
Reference in New Issue
Block a user