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@xxxxxxxxxxxxxxxxx> --- 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 Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/virtualization