Commit fe4c3862 authored by Jason Wang's avatar Jason Wang Committed by Michael S. Tsirkin

virtio_ring: introduce virtqueue_desc_add_split()

This patch introduces a helper for storing descriptor in the
descriptor table for split virtqueue.
Signed-off-by: default avatarJason Wang <jasowang@redhat.com>
Link: https://lore.kernel.org/r/20210604055350.58753-6-jasowang@redhat.comSigned-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent 44593865
...@@ -415,6 +415,20 @@ static struct vring_desc *alloc_indirect_split(struct virtqueue *_vq, ...@@ -415,6 +415,20 @@ static struct vring_desc *alloc_indirect_split(struct virtqueue *_vq,
return desc; return desc;
} }
static inline unsigned int virtqueue_add_desc_split(struct virtqueue *vq,
struct vring_desc *desc,
unsigned int i,
dma_addr_t addr,
unsigned int len,
u16 flags)
{
desc[i].flags = cpu_to_virtio16(vq->vdev, flags);
desc[i].addr = cpu_to_virtio64(vq->vdev, addr);
desc[i].len = cpu_to_virtio32(vq->vdev, len);
return virtio16_to_cpu(vq->vdev, desc[i].next);
}
static inline int virtqueue_add_split(struct virtqueue *_vq, static inline int virtqueue_add_split(struct virtqueue *_vq,
struct scatterlist *sgs[], struct scatterlist *sgs[],
unsigned int total_sg, unsigned int total_sg,
...@@ -487,11 +501,9 @@ static inline int virtqueue_add_split(struct virtqueue *_vq, ...@@ -487,11 +501,9 @@ static inline int virtqueue_add_split(struct virtqueue *_vq,
if (vring_mapping_error(vq, addr)) if (vring_mapping_error(vq, addr))
goto unmap_release; goto unmap_release;
desc[i].flags = cpu_to_virtio16(_vq->vdev, VRING_DESC_F_NEXT);
desc[i].addr = cpu_to_virtio64(_vq->vdev, addr);
desc[i].len = cpu_to_virtio32(_vq->vdev, sg->length);
prev = i; prev = i;
i = virtio16_to_cpu(_vq->vdev, desc[i].next); i = virtqueue_add_desc_split(_vq, desc, i, addr, sg->length,
VRING_DESC_F_NEXT);
} }
} }
for (; n < (out_sgs + in_sgs); n++) { for (; n < (out_sgs + in_sgs); n++) {
...@@ -500,11 +512,11 @@ static inline int virtqueue_add_split(struct virtqueue *_vq, ...@@ -500,11 +512,11 @@ static inline int virtqueue_add_split(struct virtqueue *_vq,
if (vring_mapping_error(vq, addr)) if (vring_mapping_error(vq, addr))
goto unmap_release; goto unmap_release;
desc[i].flags = cpu_to_virtio16(_vq->vdev, VRING_DESC_F_NEXT | VRING_DESC_F_WRITE);
desc[i].addr = cpu_to_virtio64(_vq->vdev, addr);
desc[i].len = cpu_to_virtio32(_vq->vdev, sg->length);
prev = i; prev = i;
i = virtio16_to_cpu(_vq->vdev, desc[i].next); i = virtqueue_add_desc_split(_vq, desc, i, addr,
sg->length,
VRING_DESC_F_NEXT |
VRING_DESC_F_WRITE);
} }
} }
/* Last one doesn't continue. */ /* Last one doesn't continue. */
...@@ -518,13 +530,10 @@ static inline int virtqueue_add_split(struct virtqueue *_vq, ...@@ -518,13 +530,10 @@ static inline int virtqueue_add_split(struct virtqueue *_vq,
if (vring_mapping_error(vq, addr)) if (vring_mapping_error(vq, addr))
goto unmap_release; goto unmap_release;
vq->split.vring.desc[head].flags = cpu_to_virtio16(_vq->vdev, virtqueue_add_desc_split(_vq, vq->split.vring.desc,
VRING_DESC_F_INDIRECT); head, addr,
vq->split.vring.desc[head].addr = cpu_to_virtio64(_vq->vdev, total_sg * sizeof(struct vring_desc),
addr); VRING_DESC_F_INDIRECT);
vq->split.vring.desc[head].len = cpu_to_virtio32(_vq->vdev,
total_sg * sizeof(struct vring_desc));
} }
/* We're using some buffers from the free list. */ /* We're using some buffers from the free list. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment