@samitouri / QOSamiQemu / commits / 7291b1a5f8

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 /**