virtio_ring: introduce virtqueue_desc_add_split()
authorJason Wang <jasowang@redhat.com>
Fri, 4 Jun 2021 05:53:48 +0000 (13:53 +0800)
committerMichael S. Tsirkin <mst@redhat.com>
Thu, 8 Jul 2021 11:49:01 +0000 (07:49 -0400)
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>
drivers/virtio/virtio_ring.c

index 00e5411..c7d9a6f 100644 (file)
@@ -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. */