You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
5.5 KiB
121 lines
5.5 KiB
1 month ago
|
From 41c4083269ec772b406c6c57b496ca2011f928c7 Mon Sep 17 00:00:00 2001
|
||
|
From: Zhenyu Zhang <zhenyzha@redhat.com>
|
||
|
Date: Tue, 9 Jul 2024 23:08:59 -0400
|
||
|
Subject: [PATCH 2/2] hw/arm/virt: Avoid unexpected warning from Linux guest on
|
||
|
host with Fujitsu CPUs
|
||
|
|
||
|
RH-Author: zhenyzha <None>
|
||
|
RH-MergeRequest: 256: hw/arm/virt: Avoid unexpected warning from Linux guest on host with Fujitsu CPUs
|
||
|
RH-Jira: RHEL-39936
|
||
|
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||
|
RH-Acked-by: Sebastian Ott <sebott@redhat.com>
|
||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||
|
RH-Commit: [1/1] fdf156fd05b219a06e2e2ca409fff0f728c1e2cf (zhenyzha/qemu-kvm)
|
||
|
|
||
|
JIRA: https://issues.redhat.com/browse/RHEL-39936
|
||
|
|
||
|
Multiple warning messages and corresponding backtraces are observed when Linux
|
||
|
guest is booted on the host with Fujitsu CPUs. One of them is shown as below.
|
||
|
|
||
|
[ 0.032443] ------------[ cut here ]------------
|
||
|
[ 0.032446] uart-pl011 9000000.pl011: ARCH_DMA_MINALIGN smaller than
|
||
|
CTR_EL0.CWG (128 < 256)
|
||
|
[ 0.032454] WARNING: CPU: 0 PID: 1 at arch/arm64/mm/dma-mapping.c:54
|
||
|
arch_setup_dma_ops+0xbc/0xcc
|
||
|
[ 0.032470] Modules linked in:
|
||
|
[ 0.032475] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.14.0-452.el9.aarch64
|
||
|
[ 0.032481] Hardware name: linux,dummy-virt (DT)
|
||
|
[ 0.032484] pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
|
||
|
[ 0.032490] pc : arch_setup_dma_ops+0xbc/0xcc
|
||
|
[ 0.032496] lr : arch_setup_dma_ops+0xbc/0xcc
|
||
|
[ 0.032501] sp : ffff80008003b860
|
||
|
[ 0.032503] x29: ffff80008003b860 x28: 0000000000000000 x27: ffffaae4b949049c
|
||
|
[ 0.032510] x26: 0000000000000000 x25: 0000000000000000 x24: 0000000000000000
|
||
|
[ 0.032517] x23: 0000000000000100 x22: 0000000000000000 x21: 0000000000000000
|
||
|
[ 0.032523] x20: 0000000100000000 x19: ffff2f06c02ea400 x18: ffffffffffffffff
|
||
|
[ 0.032529] x17: 00000000208a5f76 x16: 000000006589dbcb x15: ffffaae4ba071c89
|
||
|
[ 0.032535] x14: 0000000000000000 x13: ffffaae4ba071c84 x12: 455f525443206e61
|
||
|
[ 0.032541] x11: 68742072656c6c61 x10: 0000000000000029 x9 : ffffaae4b7d21da4
|
||
|
[ 0.032547] x8 : 0000000000000029 x7 : 4c414e494d5f414d x6 : 0000000000000029
|
||
|
[ 0.032553] x5 : 000000000000000f x4 : ffffaae4b9617a00 x3 : 0000000000000001
|
||
|
[ 0.032558] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff2f06c029be40
|
||
|
[ 0.032564] Call trace:
|
||
|
[ 0.032566] arch_setup_dma_ops+0xbc/0xcc
|
||
|
[ 0.032572] of_dma_configure_id+0x138/0x300
|
||
|
[ 0.032591] amba_dma_configure+0x34/0xc0
|
||
|
[ 0.032600] really_probe+0x78/0x3dc
|
||
|
[ 0.032614] __driver_probe_device+0x108/0x160
|
||
|
[ 0.032619] driver_probe_device+0x44/0x114
|
||
|
[ 0.032624] __device_attach_driver+0xb8/0x14c
|
||
|
[ 0.032629] bus_for_each_drv+0x88/0xe4
|
||
|
[ 0.032634] __device_attach+0xb0/0x1e0
|
||
|
[ 0.032638] device_initial_probe+0x18/0x20
|
||
|
[ 0.032643] bus_probe_device+0xa8/0xb0
|
||
|
[ 0.032648] device_add+0x4b4/0x6c0
|
||
|
[ 0.032652] amba_device_try_add.part.0+0x48/0x360
|
||
|
[ 0.032657] amba_device_add+0x104/0x144
|
||
|
[ 0.032662] of_amba_device_create.isra.0+0x100/0x1c4
|
||
|
[ 0.032666] of_platform_bus_create+0x294/0x35c
|
||
|
[ 0.032669] of_platform_populate+0x5c/0x150
|
||
|
[ 0.032672] of_platform_default_populate_init+0xd0/0xec
|
||
|
[ 0.032697] do_one_initcall+0x4c/0x2e0
|
||
|
[ 0.032701] do_initcalls+0x100/0x13c
|
||
|
[ 0.032707] kernel_init_freeable+0x1c8/0x21c
|
||
|
[ 0.032712] kernel_init+0x28/0x140
|
||
|
[ 0.032731] ret_from_fork+0x10/0x20
|
||
|
[ 0.032735] ---[ end trace 0000000000000000 ]---
|
||
|
|
||
|
In Linux, a check is applied to every device which is exposed through
|
||
|
device-tree node. The warning message is raised when the device isn't
|
||
|
DMA coherent and the cache line size is larger than ARCH_DMA_MINALIGN
|
||
|
(128 bytes). The cache line is sorted from CTR_EL0[CWG], which corresponds
|
||
|
to 256 bytes on the guest CPUs. The DMA coherent capability is claimed
|
||
|
through 'dma-coherent' in their device-tree nodes or parent nodes.
|
||
|
This happens even when the device doesn't implement or use DMA at all,
|
||
|
for legacy reasons.
|
||
|
|
||
|
Fix the issue by adding 'dma-coherent' property to the device-tree root
|
||
|
node, meaning all devices are capable of DMA coherent by default.
|
||
|
This both suppresses the spurious kernel warnings and also guards
|
||
|
against possible future QEMU bugs where we add a DMA-capable device
|
||
|
and forget to mark it as dma-coherent.
|
||
|
|
||
|
Signed-off-by: Zhenyu Zhang <zhenyzha@redhat.com>
|
||
|
Reviewed-by: Gavin Shan <gshan@redhat.com>
|
||
|
Reviewed-by: Donald Dutile <ddutile@redhat.com
|
||
|
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
|
||
|
Message-id: 20240612020506.307793-1-zhenyzha@redhat.com
|
||
|
[PMM: tweaked commit message]
|
||
|
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||
|
(cherry picked from commit dda533087ad5559674ff486e7031c88dc01e0abd)
|
||
|
Signed-off-by: Zhenyu Zhang <zhenyzha@redhat.com>
|
||
|
---
|
||
|
hw/arm/virt.c | 11 +++++++++++
|
||
|
1 file changed, 11 insertions(+)
|
||
|
|
||
|
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||
|
index 3f0496cdb9..6ece67f11d 100644
|
||
|
--- a/hw/arm/virt.c
|
||
|
+++ b/hw/arm/virt.c
|
||
|
@@ -330,6 +330,17 @@ static void create_fdt(VirtMachineState *vms)
|
||
|
qemu_fdt_setprop_cell(fdt, "/", "#size-cells", 0x2);
|
||
|
qemu_fdt_setprop_string(fdt, "/", "model", "linux,dummy-virt");
|
||
|
|
||
|
+ /*
|
||
|
+ * For QEMU, all DMA is coherent. Advertising this in the root node
|
||
|
+ * has two benefits:
|
||
|
+ *
|
||
|
+ * - It avoids potential bugs where we forget to mark a DMA
|
||
|
+ * capable device as being dma-coherent
|
||
|
+ * - It avoids spurious warnings from the Linux kernel about
|
||
|
+ * devices which can't do DMA at all
|
||
|
+ */
|
||
|
+ qemu_fdt_setprop(fdt, "/", "dma-coherent", NULL, 0);
|
||
|
+
|
||
|
/* /chosen must exist for load_dtb to fill in necessary properties later */
|
||
|
qemu_fdt_add_subnode(fdt, "/chosen");
|
||
|
if (vms->dtb_randomness) {
|
||
|
--
|
||
|
2.39.3
|
||
|
|