Separate the logic for updating the vq state from virtqueue_add_packed()
and virtqueue_add_indirect_packed().

In this way, when the subsequent patch implements the logic of reusing
the buffer when resize, we can share this function.

Signed-off-by: Xuan Zhuo <[email protected]>
---
 drivers/virtio/virtio_ring.c | 96 ++++++++++++++++++------------------
 1 file changed, 47 insertions(+), 49 deletions(-)

diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index 219e008a4633..5e6bd9a4e648 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -1403,6 +1403,47 @@ static struct vring_packed_desc 
*alloc_indirect_packed(unsigned int total_sg,
        return desc;
 }
 
+static inline void virtqueue_update_packed(struct vring_virtqueue *vq,
+                                          u32 descs_used,
+                                          u16 curr,
+                                          u16 prev,
+                                          u32 idx,
+                                          __le16 head_flags,
+                                          struct vring_packed_desc *desc,
+                                          void *data)
+{
+       u16 head, id;
+
+       id = vq->free_head;
+       head = vq->packed.next_avail_idx;
+
+       if (idx < head)
+               vq->packed.avail_wrap_counter ^= 1;
+
+       /* We're using some buffers from the free list. */
+       vq->vq.num_free -= descs_used;
+
+       /* Update free pointer */
+       vq->packed.next_avail_idx = idx;
+       vq->free_head = curr;
+
+       /* Store token. */
+       vq->packed.desc_state[id].num = descs_used;
+       vq->packed.desc_state[id].data = data;
+       vq->packed.desc_state[id].indir_desc = desc;
+       vq->packed.desc_state[id].last = prev;
+
+       /*
+        * A driver MUST NOT make the first descriptor in the list
+        * available before all subsequent descriptors comprising
+        * the list are made available.
+        */
+       virtio_wmb(vq->weak_barriers);
+       vq->packed.vring.desc[head].flags = head_flags;
+       vq->num_added += descs_used;
+
+}
+
 static int virtqueue_add_indirect_packed(struct vring_virtqueue *vq,
                                         struct scatterlist *sgs[],
                                         unsigned int total_sg,
@@ -1414,6 +1455,7 @@ static int virtqueue_add_indirect_packed(struct 
vring_virtqueue *vq,
        struct vring_packed_desc *desc;
        struct scatterlist *sg;
        unsigned int i, n, err_idx;
+       __le16 head_flags;
        u16 head, id;
        dma_addr_t addr;
 
@@ -1466,34 +1508,13 @@ static int virtqueue_add_indirect_packed(struct 
vring_virtqueue *vq,
        vq->packed.desc_extra[id].flags = VRING_DESC_F_INDIRECT |
                vq->packed.avail_used_flags;
 
-       /*
-        * A driver MUST NOT make the first descriptor in the list
-        * available before all subsequent descriptors comprising
-        * the list are made available.
-        */
-       virtio_wmb(vq->weak_barriers);
-       vq->packed.vring.desc[head].flags = cpu_to_le16(VRING_DESC_F_INDIRECT |
-                                               vq->packed.avail_used_flags);
-
-       /* We're using some buffers from the free list. */
-       vq->vq.num_free -= 1;
+       head_flags = cpu_to_le16(VRING_DESC_F_INDIRECT | 
vq->packed.avail_used_flags);
 
        /* Update free pointer */
        n = next_idx(vq, head);
 
-       if (n < head)
-               vq->packed.avail_wrap_counter ^= 1;
-
-       vq->packed.next_avail_idx = n;
-       vq->free_head = vq->packed.desc_extra[id].next;
-
-       /* Store token and indirect buffer state. */
-       vq->packed.desc_state[id].num = 1;
-       vq->packed.desc_state[id].data = data;
-       vq->packed.desc_state[id].indir_desc = desc;
-       vq->packed.desc_state[id].last = id;
-
-       vq->num_added += 1;
+       virtqueue_update_packed(vq, 1, vq->packed.desc_extra[id].next, id, n,
+                               head_flags, desc, data);
 
        pr_debug("Added buffer head %i to %p\n", head, vq);
        END_USE(vq);
@@ -1605,31 +1626,8 @@ static inline int virtqueue_add_packed(struct virtqueue 
*_vq,
                }
        }
 
-       if (i < head)
-               vq->packed.avail_wrap_counter ^= 1;
-
-       /* We're using some buffers from the free list. */
-       vq->vq.num_free -= descs_used;
-
-       /* Update free pointer */
-       vq->packed.next_avail_idx = i;
-       vq->free_head = curr;
-
-       /* Store token. */
-       vq->packed.desc_state[id].num = descs_used;
-       vq->packed.desc_state[id].data = data;
-       vq->packed.desc_state[id].indir_desc = ctx;
-       vq->packed.desc_state[id].last = prev;
-
-       /*
-        * A driver MUST NOT make the first descriptor in the list
-        * available before all subsequent descriptors comprising
-        * the list are made available.
-        */
-       virtio_wmb(vq->weak_barriers);
-       vq->packed.vring.desc[head].flags = head_flags;
-       vq->num_added += descs_used;
-
+       virtqueue_update_packed(vq, descs_used, curr, prev, i, head_flags,
+                               ctx, data);
        pr_debug("Added buffer head %i to %p\n", head, vq);
        END_USE(vq);
 
-- 
2.31.0

_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

Reply via email to