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: Jason Wang <jasowang@redhat.com> Link: https://lore.kernel.org/r/20210604055350.58753-6-jasowang@redhat.com Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
Родитель
44593865b7
Коммит
fe4c3862df
|
@ -415,6 +415,20 @@ static struct vring_desc *alloc_indirect_split(struct virtqueue *_vq,
|
|||
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,
|
||||
struct scatterlist *sgs[],
|
||||
unsigned int total_sg,
|
||||
|
@ -487,11 +501,9 @@ static inline int virtqueue_add_split(struct virtqueue *_vq,
|
|||
if (vring_mapping_error(vq, addr))
|
||||
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;
|
||||
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++) {
|
||||
|
@ -500,11 +512,11 @@ static inline int virtqueue_add_split(struct virtqueue *_vq,
|
|||
if (vring_mapping_error(vq, addr))
|
||||
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;
|
||||
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. */
|
||||
|
@ -518,13 +530,10 @@ static inline int virtqueue_add_split(struct virtqueue *_vq,
|
|||
if (vring_mapping_error(vq, addr))
|
||||
goto unmap_release;
|
||||
|
||||
vq->split.vring.desc[head].flags = cpu_to_virtio16(_vq->vdev,
|
||||
VRING_DESC_F_INDIRECT);
|
||||
vq->split.vring.desc[head].addr = cpu_to_virtio64(_vq->vdev,
|
||||
addr);
|
||||
|
||||
vq->split.vring.desc[head].len = cpu_to_virtio32(_vq->vdev,
|
||||
total_sg * sizeof(struct vring_desc));
|
||||
virtqueue_add_desc_split(_vq, vq->split.vring.desc,
|
||||
head, addr,
|
||||
total_sg * sizeof(struct vring_desc),
|
||||
VRING_DESC_F_INDIRECT);
|
||||
}
|
||||
|
||||
/* We're using some buffers from the free list. */
|
||||
|
|
Загрузка…
Ссылка в новой задаче