[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20220424024044.94749-12-xuanzhuo@linux.alibaba.com>
Date: Sun, 24 Apr 2022 10:40:39 +0800
From: Xuan Zhuo <xuanzhuo@...ux.alibaba.com>
To: linux-kernel@...r.kernel.org
Cc: "Michael S. Tsirkin" <mst@...hat.com>,
Jason Wang <jasowang@...hat.com>,
virtualization@...ts.linux-foundation.org
Subject: [RFC PATCH 11/16] virtio_ring: packed: extract virtqueue_update_packed()
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 <xuanzhuo@...ux.alibaba.com>
---
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
Powered by blists - more mailing lists