lkml.org 
[lkml]   [2022]   [Apr]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[RFC PATCH 11/16] virtio_ring: packed: extract virtqueue_update_packed()
Date
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@linux.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
\
 
 \ /
  Last update: 2022-04-24 04:41    [W:0.125 / U:0.056 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site