On 2024-12-18 17:01, Steven Rostedt wrote:

> Hmm, we do have recursion protection, but it allows one loop to handle
> transitions between normal and interrupt context. If we stop that
> transition for archs that use the generic atomic64, I wonder if that would
> fix things.
> 
> Can you try this patch?

Thanks!

I applied the patch and did some testing and the initial issue I reported
seems to have been fixed but unfortunately I'm still able to trigger
a spinlock recursion.

The following sequence works fine with the patch applied:
# echo function > current_tracer
# echo 1 > tracing_on
# usleep 1
# echo 0 > tracing_on
# cat trace
# ...

But this triggers a spinlock recursion:
# echo 1 > tracing_on
# find /

[   61.276675] BUG: spinlock recursion on CPU#0, find/119
[   61.277571]  lock: 0xc1c076c0, .magic: dead4ead, .owner: find/119, 
.owner_cpu: 0
[   61.278365] CPU: 0 UID: 0 PID: 119 Comm: find Not tainted 6.13.0-rc3 #5
[   61.278724] Hardware name: riscv-virtio,qemu (DT)
[   61.278994] Call Trace:
[   61.279351] dump_backtrace (arch/riscv/kernel/stacktrace.c:131)
[   61.279848] show_stack (arch/riscv/kernel/stacktrace.c:137)
[   61.280022] dump_stack_lvl (lib/dump_stack.c:122)
[   61.280202] dump_stack (lib/dump_stack.c:130)
[   61.280372] spin_dump (kernel/locking/spinlock_debug.c:71)
[   61.280534] do_raw_spin_lock (kernel/locking/spinlock_debug.c:78 
kernel/locking/spinlock_debug.c:87 kernel/locking/spinlock_debug.c:115)
[   61.280714] _raw_spin_lock_irqsave (kernel/locking/spinlock.c:163)
[   61.280905] generic_atomic64_read (lib/atomic64.c:51)
[   61.281091] __rb_reserve_next.constprop.0 (kernel/trace/ring_buffer.c:608 
kernel/trace/ring_buffer.c:4265)
[   61.281299] ring_buffer_lock_reserve (kernel/trace/ring_buffer.c:4457 
(discriminator 2) kernel/trace/ring_buffer.c:4514 (discriminator 2))
[   61.281496] trace_function (kernel/trace/trace.c:1021 
kernel/trace/trace.c:2906)
[   61.281672] function_trace_call (kernel/trace/trace_functions.c:222)
[   61.281859] ftrace_call (arch/riscv/kernel/mcount-dyn.S:178)
[   61.282030] inode_query_iversion (fs/libfs.c:2050)
[   61.282217] ext4_readdir (fs/ext4/dir.c:597 fs/ext4/dir.c:143)
[   61.282393] iterate_dir (fs/readdir.c:109)
[   61.282562] __se_sys_getdents64 (fs/readdir.c:403 fs/readdir.c:389)
[   61.282758] __riscv_sys_getdents64 (fs/readdir.c:389)
[   61.282945] do_trap_ecall_u (./arch/riscv/include/asm/syscall.h:90 
(discriminator 1) arch/riscv/kernel/traps.c:331 (discriminator 1))
[   61.283121] handle_exception (arch/riscv/kernel/entry.S:198)

// Ludwig

Reply via email to