From 1937c00107f7598d5b0632f2eb6045e5bb46f6db Mon Sep 17 00:00:00 2001 From: guping Date: Tue, 9 Jul 2024 12:39:01 +0000 Subject: [PATCH] hw/virtio: Fix obtain the buffer id from the last descriptor cherry-pick from 33abfea239592a706e98269b01c0096249612ea4 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The virtio-1.3 specification writes: 2.8.6 Next Flag: Descriptor Chaining Buffer ID is included in the last descriptor in the list. If the feature (_F_INDIRECT_DESC) has been negotiated, install only one descriptor in the virtqueue. Therefor the buffer id should be obtained from the first descriptor. In descriptor chaining scenarios, the buffer id should be obtained from the last descriptor. Fixes: 86044b24 ("virtio: basic packed virtqueue support") Signed-off-by: default avatarWafer Reviewed-by: Jason Wang's avatarJason Wang Reviewed-by: default avatarEugenio Pérez Acked-by: Jason Wang's avatarJason Wang Message-Id: <20240510072753.26158-2-wafer@jaguarmicro.com> Reviewed-by: MST's avatarMichael S. Tsirkin Signed-off-by: MST's avatarMichael S. Tsirkin Signed-off-by: guping --- hw/virtio/virtio.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c index 80156bfbd5..913b40e1f8 100644 --- a/hw/virtio/virtio.c +++ b/hw/virtio/virtio.c @@ -1635,6 +1635,11 @@ static void *virtqueue_packed_pop(VirtQueue *vq, size_t sz) &indirect_desc_cache); } while (rc == VIRTQUEUE_READ_DESC_MORE); + if (desc_cache != &indirect_desc_cache) { + /* Buffer ID is included in the last descriptor in the list. */ + id = desc.id; + } + /* Now copy what we have collected and mapped */ elem = virtqueue_alloc_element(sz, out_num, in_num); for (i = 0; i < out_num; i++) { -- 2.41.0.windows.1