- pci-host: designware: Limit value range of iATU viewport register - hmat acpi: Fix out of bounds access due to missing use of indirection - migration: Skip only empty block devices - aspeed/hace: Initialize g_autofree pointer - hw/net/vmxnet3: Fix guest-triggerable assert() - qxl: don't assert() if device isn't yet initialized - Avoid unaligned fetch in ladr_match() - linux-user: Fix waitid return of siginfo_t and rusage - hw/net/lan9118: Replace magic '2048' value by MIL_TXFIFO_SIZE definition - stdvga: fix screen blanking - virtio-net: drop too short packets early - ebpf: replace deprecated bpf_program__set_socket_filter - vhsot-user: only read reply of SET_LOG_BASE from vq 0 - cpu: add Tengyun S5000C cpu support - hw/virtio: Fix obtain the buffer id from the last descriptor - hw/core: ensure kernel_end never gets used undefined Signed-off-by: Jiabo Feng <fengjiabo1@huawei.com> (cherry picked from commit 1f9e476e96edb07e34e0133a312f478ddab4b6ff)
58 lines
2.1 KiB
Diff
58 lines
2.1 KiB
Diff
From 1937c00107f7598d5b0632f2eb6045e5bb46f6db Mon Sep 17 00:00:00 2001
|
|
From: guping <guping_yewu@cmss.chinamobile.com>
|
|
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
|
|
<https://docs.oasis-open.org/virtio/virtio/v1.3/virtio-v1.3.html> 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 <wafer@jaguarmicro.com>
|
|
Reviewed-by: Jason Wang's avatarJason Wang <jasowang@redhat.com>
|
|
Reviewed-by: default avatarEugenio Pérez <eperezma@redhat.com>
|
|
Acked-by: Jason Wang's avatarJason Wang <jasowang@redhat.com>
|
|
Message-Id: <20240510072753.26158-2-wafer@jaguarmicro.com>
|
|
Reviewed-by: MST's avatarMichael S. Tsirkin <mst@redhat.com>
|
|
Signed-off-by: MST's avatarMichael S. Tsirkin <mst@redhat.com>
|
|
|
|
Signed-off-by: guping <guping_yewu@cmss.chinamobile.com>
|
|
---
|
|
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
|
|
|