Re: spinlock recursion when running q800 emulation in qemu

Michael Schmitz
2024-03-09T20:57:05Z

Hi Finn,

Am 09.03.2024 um 18:02 schrieb Finn Thain:
>
> On Sat, 9 Mar 2024, Michael Schmitz wrote:
>
>>
>> I notice legacy_timer_tick() states it must be called with interrupts
>> disabled. We do not explicitly do that in via_timer_handler(), but rely
>> on the IPL remaining high. Maybe adding local_irq_save(flags) /
>> local_irq_restore(flags) around the legacy_timer_tick() call would help
>> debug this?
>>
>
> If legacy_timer_tick() is sensitive to execution context, why not test the
> IPL with an assertion? That way you can catch that problem on Aranym as
> well as Qemu.

Done that, and so far haven't seen the expected BUG message yet.

But I've now got this in ARAnyM:

BUG: spinlock recursion on CPU#0, pool_workqueue_/3
lock: 0x435670, .magic: dead4ead, .owner: pool_workqueue_/3, .owner_cpu: 0
CPU: 0 PID: 3 Comm: pool_workqueue_ Not tainted
6.8.0-rc7-atari-fpuemu-spinlocktest+ #1693
Stack from 00835eb4:
00835eb4 003d5726 003d5726 00000000 0000000d 003273b0 003d5726
0003a38a
00435670 003cbec0 00840be0 000330f6 00435670 00814080 0003f5f2
0004ca60
00002604 0000714c 00000000 00000000 0003f666 0000000d 00000000
00000000
0032b7a6 0032b864 000186e6 00468958 004689b4 00000000 00000000
0003f716
00468958 00000000 00468958 0003f76e 00468958 004689b4 00468958
004689b4
00468958 00041c8e 00468958 00468958 0002dc58 00000000 0003f21c
00468958
Call Trace: [<003273b0>] dump_stack+0xc/0x10
[<0003a38a>] do_raw_spin_lock+0x34/0x58
[<000330f6>] scheduler_tick+0x18/0x6e
[<0003f5f2>] __irq_wake_thread+0x0/0x40
[<0004ca60>] update_process_times+0x5e/0x66
[<00002604>] trap+0x10/0x28
[<0000714c>] mfp_timer_c_handler+0x2c/0x3c
[<0003f666>] __handle_irq_event_percpu+0x34/0xd4
[<0032b7a6>] _raw_spin_lock+0x0/0xe
[<0032b864>] _raw_spin_unlock+0x0/0xe
[<000186e6>] kernel_thread+0x0/0x6c
[<0003f716>] handle_irq_event_percpu+0x10/0x3a
[<0003f76e>] handle_irq_event+0x2e/0x54
[<00041c8e>] handle_simple_irq+0x56/0x66
[<0002dc58>] kthread+0x0/0xa6
[<0003f21c>] handle_irq_desc+0x1e/0x28
[<00002894>] do_IRQ+0x20/0x32
[<000027c8>] user_irqvec_fixup+0xc/0x14
[<0032b7a6>] _raw_spin_lock+0x0/0xe
[<0032b864>] _raw_spin_unlock+0x0/0xe
[<000186e6>] kernel_thread+0x0/0x6c
[<0000262c>] ret_from_kernel_thread+0x0/0x14

RCU Tasks Trace: Setting shift to 0 and lim to 1 rcu_task_cb_adjust=1.

Happens real early during the boot process.

mfp_timer_c_hander() has a local_irq_save() / local_irq_restore() pair
around the legacy_timer_tick() invocation so this spinlock recursion
does appear to work even without reentering the scheduling timer routine ...

Cheers,

Michael