qemu-arm
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH RFC] hw/arm/virt: Avoid unexpected warning from Linux guest o


From: Zhenyu Zhang
Subject: Re: [PATCH RFC] hw/arm/virt: Avoid unexpected warning from Linux guest on host with Fujitsu CPUs
Date: Fri, 7 Jun 2024 20:19:27 +0800

On Thu, Jun 6, 2024 at 7:57 PM Peter Maydell <peter.maydell@linaro.org> wrote:
>
> On Thu, 6 Jun 2024 at 11:48, Zhenyu Zhang <zhenyzha@redhat.com> wrote:
> >
> > 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 #1
> > [    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.
>
> For QEMU emulated all our DMA is always coherent, so where we
> have DMA-capable devices we should definitely tell the kernel
> that that DMA is coherent.
>
> Our pl011 does not do DMA, though (we do not set the dmas property), so
> it's kind of bogus for the kernel to complain about that.
>
> So I think we should take these changes where they refer to DMA
> capable devices and ask the kernel folks to fix the warnings
> where they refer to devices that aren't doing DMA. Looking through
> the patch, though, my initial impression is that all these are
> in the latter category...
My initial thought was to fix it in the kernel too.
However, through preliminary research, I discovered some
'legacy reasons' mentioned in the discussion above.
So I'm worried that the fix will bring new risks.

>
> > diff --git a/hw/arm/boot.c b/hw/arm/boot.c
> > index d480a7da02..cdf99966e6 100644
> > --- a/hw/arm/boot.c
> > +++ b/hw/arm/boot.c
> > @@ -509,6 +509,7 @@ static void fdt_add_psci_node(void *fdt)
> >      qemu_fdt_setprop_cell(fdt, "/psci", "cpu_off", cpu_off_fn);
> >      qemu_fdt_setprop_cell(fdt, "/psci", "cpu_on", cpu_on_fn);
> >      qemu_fdt_setprop_cell(fdt, "/psci", "migrate", migrate_fn);
> > +    qemu_fdt_setprop(fdt, "/psci", "dma-coherent", NULL, 0);
>
> The PSCI node is describing the firmware interface for
> HVC or SMC calls -- I don't think it makes any sense
> to think of this as doing DMA. So I would query the kernel
> folks about this warning.
Thanks a lot for your help!
>
> >  }
> >
> >  int arm_load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
> > diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> > index 3c93c0c0a6..d3e5f512e2 100644
> > --- a/hw/arm/virt.c
> > +++ b/hw/arm/virt.c
> > @@ -652,6 +652,7 @@ static void fdt_add_pmu_nodes(const VirtMachineState 
> > *vms)
> >          qemu_fdt_setprop_cells(ms->fdt, "/pmu", "interrupts",
> >                                 GIC_FDT_IRQ_TYPE_PPI,
> >                                 INTID_TO_PPI(VIRTUAL_PMU_IRQ), irqflags);
> > +        qemu_fdt_setprop(ms->fdt, "/pmu", "dma-coherent", NULL, 0);
>
> What DMA interface does the PMU have?
]# dmesg | grep PMU
hw perfevents: enabled with armv8_pmuv3_0 PMU driver, 9 counters available

>
> >      }
> >  }
> >
> > @@ -936,6 +937,7 @@ static void create_uart(const VirtMachineState *vms, 
> > int uart,
> >                                 vms->clock_phandle, vms->clock_phandle);
> >      qemu_fdt_setprop(ms->fdt, nodename, "clock-names",
> >                           clocknames, sizeof(clocknames));
> > +    qemu_fdt_setprop(ms->fdt, nodename, "dma-coherent", NULL, 0);
>
> As above, our PL011 doesn't do any DMA and we do not advertise
> to the kernel that it does.
Indeed so.

>
> >      if (uart == VIRT_UART) {
> >          qemu_fdt_setprop_string(ms->fdt, "/chosen", "stdout-path", 
> > nodename);
> > @@ -972,6 +974,7 @@ static void create_rtc(const VirtMachineState *vms)
> >                             GIC_FDT_IRQ_FLAGS_LEVEL_HI);
> >      qemu_fdt_setprop_cell(ms->fdt, nodename, "clocks", vms->clock_phandle);
> >      qemu_fdt_setprop_string(ms->fdt, nodename, "clock-names", "apb_pclk");
> > +    qemu_fdt_setprop(ms->fdt, nodename, "dma-coherent", NULL, 0);
> >      g_free(nodename);
> >  }
>
> What DMA does the pl031 do?
I hit the warning on rtc-pl031

[    2.176009] ------------[ cut here ]------------
[    2.177959] rtc-pl031 9010000.pl031: ARCH_DMA_MINALIGN smaller than
CTR_EL0.CWG (128 < 256)
[    2.177975] WARNING: CPU: 0 PID: 1 at
arch/arm64/mm/dma-mapping.c:54 arch_setup_dma_ops+0xc0/0xe0
[    2.177998] Modules linked in:
[    2.178006] CPU: 0 PID: 1 Comm: swapper/0 Tainted: G S
  -------  ---  6.9.0-7.el10.aarch64 #1
[    2.178015] Hardware name: linux,dummy-virt (DT)
[    2.178020] pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[    2.178028] pc : arch_setup_dma_ops+0xc0/0xe0
[    2.178037] lr : arch_setup_dma_ops+0xc0/0xe0
[    2.178044] sp : ffff80008003bac0
[    2.178048] x29: ffff80008003bac0 x28: 0000000000000000 x27: 0000000000000000
[    2.178059] x26: 0000000000000000 x25: 0000000000000000 x24: 00000000ffffffed
[    2.178070] x23: 0000000000000000 x22: 0000000000000100 x21: 0000000000000000
[    2.178080] x20: 0000000100000000 x19: ffff277b80311400 x18: ffffffffffffffff
[    2.178091] x17: 000000002e2c3887 x16: 000000006b071b85 x15: ffffab158b0e45eb
[    2.178101] x14: 0000000000000000 x13: ffffab158b0e45f0 x12: ffffab158adec6c0
[    2.178112] x11: ffffab158ab2c718 x10: ffffab158adec718 x9 : ffffab158894a9d0
[    2.178122] x8 : 0000000000000001 x7 : 00000000000bffe8 x6 : c0000000ffff7fff
[    2.178132] x5 : 00000000002bffa8 x4 : ffffab158ab2c4c8 x3 : 0000000000000001
[    2.178142] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff277b802c2a00
[    2.178152] Call trace:
[    2.178155]  arch_setup_dma_ops+0xc0/0xe0
[    2.178164]  of_dma_configure_id+0x29c/0x3f0
[    2.178178]  amba_dma_configure+0x38/0xd0
[    2.178188]  really_probe+0x7c/0x3a0
[    2.178196]  __driver_probe_device+0x84/0x160
[    2.178202]  driver_probe_device+0x44/0x130
[    2.178208]  __driver_attach+0xcc/0x208
[    2.178214]  bus_for_each_dev+0x84/0x100
[    2.178223]  driver_attach+0x2c/0x40
[    2.178229]  bus_add_driver+0x11c/0x238
[    2.178237]  driver_register+0x70/0x138
[    2.178244]  amba_driver_register+0x2c/0x48
[    2.178251]  pl031_driver_init+0x20/0x38
[    2.178260]  do_one_initcall+0x60/0x378
[    2.178268]  do_initcalls+0x114/0x158
[    2.178277]  kernel_init_freeable+0x1c4/0x228
[    2.178284]  kernel_init+0x28/0x158
[    2.178292]  ret_from_fork+0x10/0x20
[    2.178299] ---[ end trace 0000000000000000 ]---
[    2.178951] rtc-pl031 9010000.pl031: registered as rtc0
[    2.270706] rtc-pl031 9010000.pl031: setting system clock to
2024-06-07T08:14:37 UTC (1717748077)
[    2.282868] hid: raw HID events driver (C) Jiri Kosina
[    2.285235] usbcore: registered new interface driver usbhid
[    2.287579] usbhid: USB HID core driver

>
> >
> > @@ -1077,6 +1080,7 @@ static void create_gpio_devices(const 
> > VirtMachineState *vms, int gpio,
> >      qemu_fdt_setprop_cell(ms->fdt, nodename, "clocks", vms->clock_phandle);
> >      qemu_fdt_setprop_string(ms->fdt, nodename, "clock-names", "apb_pclk");
> >      qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle", phandle);
> > +    qemu_fdt_setprop(ms->fdt, nodename, "dma-coherent", NULL, 0);
>
> As far as I know the PL061 is also not a DMA-capable device.
For the same reason, this is the warning I hit on pl061_gpio

[    1.479175] ------------[ cut here ]------------
[    1.570587] pl061_gpio 9030000.pl061: ARCH_DMA_MINALIGN smaller
than CTR_EL0.CWG (128 < 256)
[    1.570606] WARNING: CPU: 0 PID: 1 at
arch/arm64/mm/dma-mapping.c:54 arch_setup_dma_ops+0xc0/0xe0
[    1.570629] Modules linked in:
[    1.570638] CPU: 0 PID: 1 Comm: swapper/0 Tainted: G S
  -------  ---  6.9.0-7.el10.aarch64 #1
[    1.570646] Hardware name: linux,dummy-virt (DT)
[    1.570652] pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[    1.570660] pc : arch_setup_dma_ops+0xc0/0xe0
[    1.570669] lr : arch_setup_dma_ops+0xc0/0xe0
[    1.570677] sp : ffff80008003bac0
[    1.570680] x29: ffff80008003bac0 x28: 0000000000000000 x27: 0000000000000000
[    1.570691] x26: 0000000000000000 x25: 0000000000000000 x24: 00000000ffffffed
[    1.570702] x23: 0000000000000000 x22: 0000000000000100 x21: 0000000000000000
[    1.570712] x20: 0000000100000000 x19: ffff277b8030c000 x18: ffffffffffffffff
[    1.570723] x17: 3061326332303862 x16: 3737326666666620 x15: ffffab158b0e1524
[    1.570733] x14: 0000000000000000 x13: ffffab158b0e1529 x12: ffffab158adec6c0
[    1.570743] x11: ffffab158ab2c718 x10: ffffab158adec718 x9 : ffffab158894a9d0
[    1.570754] x8 : 0000000000000001 x7 : 00000000000bffe8 x6 : c0000000ffff7fff
[    1.570764] x5 : 00000000002bffa8 x4 : ffffab158ab2c4c8 x3 : 0000000000000001
[    1.570773] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff277b802c2a00
[    1.570783] Call trace:
[    1.570787]  arch_setup_dma_ops+0xc0/0xe0
[    1.570796]  of_dma_configure_id+0x29c/0x3f0
[    1.570810]  amba_dma_configure+0x38/0xd0
[    1.570820]  really_probe+0x7c/0x3a0
[    1.570828]  __driver_probe_device+0x84/0x160
[    1.570834]  driver_probe_device+0x44/0x130
[    1.570839]  __driver_attach+0xcc/0x208
[    1.570845]  bus_for_each_dev+0x84/0x100
[    1.570855]  driver_attach+0x2c/0x40
[    1.570860]  bus_add_driver+0x11c/0x238
[    1.570868]  driver_register+0x70/0x138
[    1.570875]  amba_driver_register+0x2c/0x48
[    1.570882]  pl061_gpio_driver_init+0x20/0x38
[    1.570895]  do_one_initcall+0x60/0x378
[    1.570902]  do_initcalls+0x114/0x158
[    1.570911]  kernel_init_freeable+0x1c4/0x228
[    1.570918]  kernel_init+0x28/0x158
[    1.570926]  ret_from_fork+0x10/0x20
[    1.570934] ---[ end trace 0000000000000000 ]---

>
> >      if (gpio != VIRT_GPIO) {
> >          /* Mark as not usable by the normal world */
> > diff --git a/hw/core/sysbus-fdt.c b/hw/core/sysbus-fdt.c
> > index eebcd28f9a..da47071a95 100644
> > --- a/hw/core/sysbus-fdt.c
> > +++ b/hw/core/sysbus-fdt.c
> > @@ -554,6 +554,7 @@ void platform_bus_add_all_fdt_nodes(void *fdt, const 
> > char *intc, hwaddr addr,
> >      qemu_fdt_setprop_cells(fdt, node, "ranges", 0, addr >> 32, addr, 
> > bus_size);
> >
> >      qemu_fdt_setprop_phandle(fdt, node, "interrupt-parent", intc);
> > +    qemu_fdt_setprop(fdt, node, "dma-coherent", NULL, 0);
>
> Isn't this the fdt node for a bus, not a device?
Yes, since I hit the same warning messages.
So I want to fix it together.
Sorry for not describing it clearly.

[    1.476145] ------------[ cut here ]------------
[    1.478210] simple-pm-bus platform-bus@c000000: ARCH_DMA_MINALIGN
smaller than CTR_EL0.CWG (128 < 256)
[    1.478225] WARNING: CPU: 0 PID: 1 at
arch/arm64/mm/dma-mapping.c:54 arch_setup_dma_ops+0xc0/0xe0
[    1.478248] Modules linked in:
[    1.478257] CPU: 0 PID: 1 Comm: swapper/0 Tainted: G S
  -------  ---  6.9.0-7.el10.aarch64 #1
[    1.478266] Hardware name: linux,dummy-virt (DT)
[    1.478270] pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[    1.478279] pc : arch_setup_dma_ops+0xc0/0xe0
[    1.478287] lr : arch_setup_dma_ops+0xc0/0xe0
[    1.478295] sp : ffff80008003bac0
[    1.478299] x29: ffff80008003bac0 x28: 0000000000000000 x27: 0000000000000000
[    1.478310] x26: 0000000000000000 x25: 0000000000000000 x24: 00000000ffffffed
[    1.478321] x23: 0000000000000000 x22: 0000000000000100 x21: 0000000000000000
[    1.478331] x20: 0000000100000000 x19: ffff277b80300010 x18: ffffffffffffffff
[    1.478342] x17: 0000000098c949f4 x16: 00000000099ae637 x15: ffffab158b0e0c2e
[    1.478352] x14: 0000000000000000 x13: ffffab158b0e0c33 x12: ffffab158adec6c0
[    1.478363] x11: ffffab158ab2c718 x10: ffffab158adec718 x9 : ffffab158894a9d0
[    1.478373] x8 : 0000000000000001 x7 : 00000000000bffe8 x6 : c0000000ffff7fff
[    1.478383] x5 : 00000000002bffa8 x4 : ffffab158ab2c4c8 x3 : 0000000000000001
[    1.478393] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff277b802c2a00
[    1.478403] Call trace:
[    1.478406]  arch_setup_dma_ops+0xc0/0xe0
[    1.478415]  of_dma_configure_id+0x29c/0x3f0
[    1.478429]  platform_dma_configure+0x108/0x120
[    1.478439]  really_probe+0x7c/0x3a0
[    1.478445]  __driver_probe_device+0x84/0x160
[    1.478451]  driver_probe_device+0x44/0x130
[    1.478457]  __driver_attach+0xcc/0x208
[    1.478462]  bus_for_each_dev+0x84/0x100
[    1.478472]  driver_attach+0x2c/0x40
[    1.478477]  bus_add_driver+0x11c/0x238
[    1.478485]  driver_register+0x70/0x138
[    1.478491]  __platform_driver_register+0x30/0x48
[    1.478498]  simple_pm_bus_driver_init+0x24/0x38
[    1.478511]  do_one_initcall+0x60/0x378
[    1.478518]  do_initcalls+0x114/0x158
[    1.478527]  kernel_init_freeable+0x1c4/0x228
[    1.478534]  kernel_init+0x28/0x158
[    1.478542]  ret_from_fork+0x10/0x20
[    1.478550] ---[ end trace 0000000000000000 ]---
[    1.479175] ------------[ cut here ]------------

>
> thanks
> -- PMM
>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]