]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
virtio_ring: factor out split detaching logic
authorJason Wang <jasowang@redhat.com>
Tue, 30 Dec 2025 06:46:48 +0000 (14:46 +0800)
committerMichael S. Tsirkin <mst@redhat.com>
Wed, 31 Dec 2025 10:47:50 +0000 (05:47 -0500)
This patch factors out the split core detaching logic that could be
reused by in order feature into a dedicated function.

Acked-by: Eugenio Pérez <eperezma@redhat.com>
Reviewed-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
Reviewed-by: Eugenio Pérez <eperezma@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Message-Id: <20251230064649.55597-19-jasowang@redhat.com>

drivers/virtio/virtio_ring.c

index c0eaa907c67b368b6c210dbab45f30f9604483b8..a0fa816203338157f6a00e06192e2dcd09859b90 100644 (file)
@@ -805,8 +805,9 @@ static void detach_indirect_split(struct vring_virtqueue *vq,
        vq->split.desc_state[head].indir_desc = NULL;
 }
 
-static void detach_buf_split(struct vring_virtqueue *vq, unsigned int head,
-                            void **ctx)
+static unsigned detach_buf_split_in_order(struct vring_virtqueue *vq,
+                                         unsigned int head,
+                                         void **ctx)
 {
        struct vring_desc_extra *extra;
        unsigned int i;
@@ -826,8 +827,6 @@ static void detach_buf_split(struct vring_virtqueue *vq, unsigned int head,
        }
 
        vring_unmap_one_split(vq, &extra[i]);
-       extra[i].next = vq->free_head;
-       vq->free_head = head;
 
        /* Plus final descriptor */
        vq->vq.num_free++;
@@ -836,6 +835,17 @@ static void detach_buf_split(struct vring_virtqueue *vq, unsigned int head,
                detach_indirect_split(vq, head);
        else if (ctx)
                *ctx = vq->split.desc_state[head].indir_desc;
+
+       return i;
+}
+
+static void detach_buf_split(struct vring_virtqueue *vq, unsigned int head,
+                            void **ctx)
+{
+       unsigned int i = detach_buf_split_in_order(vq, head, ctx);
+
+       vq->split.desc_extra[i].next = vq->free_head;
+       vq->free_head = head;
 }
 
 static bool virtqueue_poll_split(const struct vring_virtqueue *vq,