vhost: factor out the detach buf logic in SVQ
This code path is modified to handle in order devices. Abstract here so we can generalize on the caller. Signed-off-by: Eugenio Pérez <eperezma@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Message-Id: <20260304173535.2702587-6-eperezma@redhat.com>
Eugenio Pérez committed
Mar 4, 2026 at 18:35 UTC
7291b1a5f8b0c2dfa95e544dd59fa8144dde72fc
1 file changed
+16
-8
hw/virtio/vhost-shadow-virtqueue.c
+16
-8
@@ -473,11 +473,24 @@ static uint16_t vhost_svq_last_desc_of_chain(const VhostShadowVirtqueue *svq,
473
return i;
474
}
475
476
+G_GNUC_WARN_UNUSED_RESULT
477
+static VirtQueueElement *vhost_svq_detach_buf(VhostShadowVirtqueue *svq,
478
+ uint16_t id)
479
+{
480
+ uint16_t num = svq->desc_state[id].ndescs;
481
+ uint16_t last_used_chain = vhost_svq_last_desc_of_chain(svq, num, id);
482
+
483
+ svq->desc_state[last_used_chain].next = svq->free_head;
484
+ svq->free_head = id;
485
+
486
+ return g_steal_pointer(&svq->desc_state[id].elem);
487
+}
488
+
489
G_GNUC_WARN_UNUSED_RESULT
490
static VirtQueueElement *vhost_svq_get_buf(VhostShadowVirtqueue *svq,
491
uint32_t *len)
492
{
480
- uint16_t last_used, last_used_chain, num;
493
+ uint16_t last_used;
494
495
if (!vhost_svq_more_used(svq)) {
496
return NULL;
@@ -500,14 +513,9 @@ static VirtQueueElement *vhost_svq_get_buf(VhostShadowVirtqueue *svq,
513
return NULL;
514
}
515
503
- num = svq->desc_state[last_used].ndescs;
516
+ svq->num_free += svq->desc_state[last_used].ndescs;
517
svq->desc_state[last_used].ndescs = 0;
505
- last_used_chain = vhost_svq_last_desc_of_chain(svq, num, last_used);
506
- svq->desc_state[last_used_chain].next = svq->free_head;
507
- svq->free_head = last_used;
508
- svq->num_free += num;
509
-
510
- return g_steal_pointer(&svq->desc_state[last_used].elem);
518
+ return vhost_svq_detach_buf(svq, last_used);
519
}
520
521
/**