Factor out the core logic for updating last_used_idx to be reused by
the packed in order implementation.

Reviewed-by: Xuan Zhuo <xuanz...@linux.alibaba.com>
Signed-off-by: Jason Wang <jasow...@redhat.com>
---
 drivers/virtio/virtio_ring.c | 43 +++++++++++++++++++++---------------
 1 file changed, 25 insertions(+), 18 deletions(-)

diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index 1bdd332d515e..e8e0d1204f52 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -1757,6 +1757,30 @@ static bool more_used_packed(const struct 
vring_virtqueue *vq)
        return virtqueue_poll_packed(vq, READ_ONCE(vq->last_used_idx));
 }
 
+static void update_last_used_idx_packed(struct vring_virtqueue *vq,
+                                       u16 id, u16 last_used,
+                                       u16 used_wrap_counter)
+{
+       last_used += vq->packed.desc_state[id].num;
+       if (unlikely(last_used >= vq->packed.vring.num)) {
+               last_used -= vq->packed.vring.num;
+               used_wrap_counter ^= 1;
+       }
+
+       last_used = (last_used | (used_wrap_counter << 
VRING_PACKED_EVENT_F_WRAP_CTR));
+       WRITE_ONCE(vq->last_used_idx, last_used);
+
+       /*
+        * If we expect an interrupt for the next entry, tell host
+        * by writing event index and flush out the write before
+        * the read in the next get_buf call.
+        */
+       if (vq->packed.event_flags_shadow == VRING_PACKED_EVENT_FLAG_DESC)
+               virtio_store_mb(vq->weak_barriers,
+                               &vq->packed.vring.driver->off_wrap,
+                               cpu_to_le16(vq->last_used_idx));
+}
+
 static void *virtqueue_get_buf_ctx_packed(struct vring_virtqueue *vq,
                                          unsigned int *len,
                                          void **ctx)
@@ -1800,24 +1824,7 @@ static void *virtqueue_get_buf_ctx_packed(struct 
vring_virtqueue *vq,
        ret = vq->packed.desc_state[id].data;
        detach_buf_packed(vq, id, ctx);
 
-       last_used += vq->packed.desc_state[id].num;
-       if (unlikely(last_used >= vq->packed.vring.num)) {
-               last_used -= vq->packed.vring.num;
-               used_wrap_counter ^= 1;
-       }
-
-       last_used = (last_used | (used_wrap_counter << 
VRING_PACKED_EVENT_F_WRAP_CTR));
-       WRITE_ONCE(vq->last_used_idx, last_used);
-
-       /*
-        * If we expect an interrupt for the next entry, tell host
-        * by writing event index and flush out the write before
-        * the read in the next get_buf call.
-        */
-       if (vq->packed.event_flags_shadow == VRING_PACKED_EVENT_FLAG_DESC)
-               virtio_store_mb(vq->weak_barriers,
-                               &vq->packed.vring.driver->off_wrap,
-                               cpu_to_le16(vq->last_used_idx));
+       update_last_used_idx_packed(vq, id, last_used, used_wrap_counter);
 
        LAST_ADD_TIME_INVALID(vq);
 
-- 
2.31.1


Reply via email to