mirror of https://github.com/xemu-project/xemu.git
vhost: Fix device's used descriptor dequeue
Only the first one of them were properly enqueued back.
Fixes: 100890f7ca
("vhost: Shadow virtqueue buffers forwarding")
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
Message-Id: <20220512175747.142058-3-eperezma@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
495fe3a787
commit
81abfa5724
|
@ -334,12 +334,22 @@ static void vhost_svq_disable_notification(VhostShadowVirtqueue *svq)
|
||||||
svq->vring.avail->flags |= cpu_to_le16(VRING_AVAIL_F_NO_INTERRUPT);
|
svq->vring.avail->flags |= cpu_to_le16(VRING_AVAIL_F_NO_INTERRUPT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint16_t vhost_svq_last_desc_of_chain(const VhostShadowVirtqueue *svq,
|
||||||
|
uint16_t num, uint16_t i)
|
||||||
|
{
|
||||||
|
for (uint16_t j = 0; j < (num - 1); ++j) {
|
||||||
|
i = le16_to_cpu(svq->desc_next[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
static VirtQueueElement *vhost_svq_get_buf(VhostShadowVirtqueue *svq,
|
static VirtQueueElement *vhost_svq_get_buf(VhostShadowVirtqueue *svq,
|
||||||
uint32_t *len)
|
uint32_t *len)
|
||||||
{
|
{
|
||||||
const vring_used_t *used = svq->vring.used;
|
const vring_used_t *used = svq->vring.used;
|
||||||
vring_used_elem_t used_elem;
|
vring_used_elem_t used_elem;
|
||||||
uint16_t last_used;
|
uint16_t last_used, last_used_chain, num;
|
||||||
|
|
||||||
if (!vhost_svq_more_used(svq)) {
|
if (!vhost_svq_more_used(svq)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -365,7 +375,10 @@ static VirtQueueElement *vhost_svq_get_buf(VhostShadowVirtqueue *svq,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
svq->desc_next[used_elem.id] = svq->free_head;
|
num = svq->ring_id_maps[used_elem.id]->in_num +
|
||||||
|
svq->ring_id_maps[used_elem.id]->out_num;
|
||||||
|
last_used_chain = vhost_svq_last_desc_of_chain(svq, num, used_elem.id);
|
||||||
|
svq->desc_next[last_used_chain] = svq->free_head;
|
||||||
svq->free_head = used_elem.id;
|
svq->free_head = used_elem.id;
|
||||||
|
|
||||||
*len = used_elem.len;
|
*len = used_elem.len;
|
||||||
|
|
Loading…
Reference in New Issue