Re: [PATCH 1/2] riscv: Fix warning by declaring arch_cpu_idle() as noinstr

Andy Chiu
2024-03-27T14:23:19Z

On Wed, Mar 27, 2024 at 4:33 AM Alexandre Ghiti <alexghiti@rivosinc.com> wrote:
>
> The following warning appears when using ftrace:
>
> [89855.443413] RCU not on for: arch_cpu_idle+0x0/0x1c
> [89855.445640] WARNING: CPU: 5 PID: 0 at include/linux/trace_recursion.h:162 arch_ftrace_ops_list_func+0x208/0x228
> [89855.445824] Modules linked in: xt_conntrack(E) nft_chain_nat(E) xt_MASQUERADE(E) nf_conntrack_netlink(E) xt_addrtype(E) nft_compat(E) nf_tables(E) nfnetlink(E) br_netfilter(E) cfg80211(E) nls_iso8859_1(E) ofpart(E) redboot(E) cmdlinepart(E) cfi_cmdset_0001(E) virtio_net(E) cfi_probe(E) cfi_util(E) 9pnet_virtio(E) gen_probe(E) net_failover(E) virtio_rng(E) failover(E) 9pnet(E) physmap(E) map_funcs(E) chipreg(E) mtd(E) uio_pdrv_genirq(E) uio(E) dm_multipath(E) scsi_dh_rdac(E) scsi_dh_emc(E) scsi_dh_alua(E) drm(E) efi_pstore(E) backlight(E) ip_tables(E) x_tables(E) raid10(E) raid456(E) async_raid6_recov(E) async_memcpy(E) async_pq(E) async_xor(E) xor(E) async_tx(E) raid6_pq(E) raid1(E) raid0(E) virtio_blk(E)
> [89855.451563] CPU: 5 PID: 0 Comm: swapper/5 Tainted: G E 6.8.0-rc6ubuntu-defconfig #2
> [89855.451726] Hardware name: riscv-virtio,qemu (DT)
> [89855.451899] epc : arch_ftrace_ops_list_func+0x208/0x228
> [89855.452016] ra : arch_ftrace_ops_list_func+0x208/0x228
> [89855.452119] epc : ffffffff8016b216 ra : ffffffff8016b216 sp : ffffaf808090fdb0
> [89855.452171] gp : ffffffff827c7680 tp : ffffaf808089ad40 t0 : ffffffff800c0dd8
> [89855.452216] t1 : 0000000000000001 t2 : 0000000000000000 s0 : ffffaf808090fe30
> [89855.452306] s1 : 0000000000000000 a0 : 0000000000000026 a1 : ffffffff82cd6ac8
> [89855.452423] a2 : ffffffff800458c8 a3 : ffffaf80b1870640 a4 : 0000000000000000
> [89855.452646] a5 : 0000000000000000 a6 : 00000000ffffffff a7 : ffffffffffffffff
> [89855.452698] s2 : ffffffff82766872 s3 : ffffffff80004caa s4 : ffffffff80ebea90
> [89855.452743] s5 : ffffaf808089bd40 s6 : 8000000a00006e00 s7 : 0000000000000008
> [89855.452787] s8 : 0000000000002000 s9 : 0000000080043700 s10: 0000000000000000
> [89855.452831] s11: 0000000000000000 t3 : 0000000000100000 t4 : 0000000000000064
> [89855.452874] t5 : 000000000000000c t6 : ffffaf80b182dbfc
> [89855.452929] status: 0000000200000100 badaddr: 0000000000000000 cause: 0000000000000003
> [89855.453053] [<ffffffff8016b216>] arch_ftrace_ops_list_func+0x208/0x228
> [89855.453191] [<ffffffff8000e082>] ftrace_call+0x8/0x22
> [89855.453265] [<ffffffff800a149c>] do_idle+0x24c/0x2ca
> [89855.453357] [<ffffffff8000da54>] return_to_handler+0x0/0x26
> [89855.453429] [<ffffffff8000b716>] smp_callin+0x92/0xb6
> [89855.453785] ---[ end trace 0000000000000000 ]---
>
> To fix this, mark arch_cpu_idle() as noinstr, like it is done in commit
> a9cbc1b471d2 ("s390/idle: mark arch_cpu_idle() noinstr").
>
> Reported-by: Evgenii Shatokhin <e.shatokhin@yadro.com>
> Closes: https://lore.kernel.org/linux-riscv/51f21b87-ebed-4411-afbc-c00d3dea2bab@yadro.com/
> Fixes: cfbc4f81c9d0 ("riscv: Select ARCH_WANTS_NO_INSTR")
> Signed-off-by: Alexandre Ghiti <alexghiti@rivosinc.com>

Reviewed-by: Andy Chiu <andy.chiu@sifive.com>
Tested-by: Andy Chiu <andy.chiu@sifive.com>

> ---
> arch/riscv/kernel/process.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/arch/riscv/kernel/process.c b/arch/riscv/kernel/process.c
> index 92922dbd5b5c..6abeecbfc51d 100644
> --- a/arch/riscv/kernel/process.c
> +++ b/arch/riscv/kernel/process.c
> @@ -37,7 +37,7 @@ EXPORT_SYMBOL(__stack_chk_guard);
>
> extern asmlinkage void ret_from_fork(void);
>
> -void arch_cpu_idle(void)
> +void noinstr arch_cpu_idle(void)
> {
> cpu_do_idle();
> }
> --
> 2.39.2
>
>
> _______________________________________________
> linux-riscv mailing list
> linux-riscv@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-riscv