Re: [PATCH v2] ASoC: meson: aiu-fifo: prevent sleeping when spinlock is held
From: Jerome Brunet
Date: Fri Nov 13 2026 - 12:10:28 EST
On ven. 13 nov. 2026 at 14:56, Valerio Setti <vsetti@xxxxxxxxxxxx> wrote:
> dai_links in the gx-card are atomic which means that the DAI trigger
> callback is called with the spinlock held. This means that usage of
> potentially sleeping functions (e.g. mutexes) is not allowed here.
>
> 'snd_soc_component_write'/'snd_soc_component_read' take the component's
> io_mutex on entry.
>
> Replace usage of these functions in:
> - 'aiu_fifo_i2s_trigger'
> - 'fifo_spdif_trigger'
> - 'aiu_fifo_pointer'
>
> This is meant to resolve the following runtime bug found while starting I2S
> playback on an OdroidC2 device where the kernel was built enabling
> CONFIG_DEBUG_ATOMIC_SLEEP and CONFIG_PROVE_LOCKING:
>
> Playback device is hw:0,0
> Stream parameters are 44100Hz, S16_LE, 2 channels
> Sine wave rate is 1000.0000Hz
> Rate set to 44100Hz (requested 44100Hz)
> Buffer size range from 128 to 262144
> Period size range from 64 [ 21.012074] BUG: sleeping function called from invalid context at kernel/locking/mutex.c:623
> [ 21.018009] in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 267, name: speaker-test
> [ 21.026184] preempt_count: 1, expected: 0
> [ 21.030151] RCU nest depth: 0, expected: 0
> [ 21.034205] locks held by speaker-test/267: 1, last CPU#3:
> [ 21.039638] #0: ffff000003dbd910 (&group->lock#2){....}-{3:3}, at: snd_pcm_stream_lock_irq+0x40/0x60
> [ 21.048782] irq event stamp: 5274
> [ 21.052059] hardirqs last enabled at (5273): [<ffff800081494240>] _raw_spin_unlock_irq+0x38/0x80
> [ 21.060856] hardirqs last disabled at (5274): [<ffff8000814935c8>] _raw_spin_lock_irq+0x80/0x90
> [ 21.069481] softirqs last enabled at (5238): [<ffff8000800f9aec>] handle_softirqs+0x584/0x5e0
> [ 21.078020] softirqs last disabled at (5231): [<ffff800080010324>] __do_softirq+0x1c/0x28
> [ 21.086133] CPU: 3 UID: 0 PID: 267 Comm: speaker-test Not tainted 7.3.0 #2 PREEMPT
> [ 21.086141] Hardware name: Hardkernel ODROID-C2 (DT)
> [ 21.086145] Call trace:
> [ 21.086149] show_stack+0x20/0x40 (C)
> [ 21.086160] dump_stack_lvl+0x6c/0x98
> [ 21.086171] dump_stack+0x18/0x24
> [ 21.086179] __might_resched+0x160/0x230
> [ 21.086189] __might_sleep+0x50/0x90
> [ 21.086197] __mutex_lock+0x64/0x8a0
> [ 21.086206] mutex_lock_nested+0x2c/0x40
> [ 21.086215] snd_soc_component_write+0x38/0x80
> [ 21.086227] aiu_fifo_i2s_trigger+0x74/0x90
> [ 21.086237] soc_dai_trigger.part.0+0x44/0x90
> [ 21.086246] snd_soc_pcm_dai_trigger+0x174/0x280
> [ 21.086255] soc_pcm_trigger+0xe4/0x1f0
> [ 21.086265] dpcm_dai_trigger_fe_be+0x30/0xb0
> [ 21.086276] dpcm_fe_dai_do_trigger+0x11c/0x1a0
> [ 21.086287] dpcm_fe_dai_trigger+0x40/0x60
> [ 21.086296] snd_pcm_do_start+0x4c/0x80
> [ 21.086307] snd_pcm_action_single+0x50/0xc0
> [ 21.086316] snd_pcm_action+0x88/0xb0
> [ 21.086325] snd_pcm_start+0x2c/0x40
> [ 21.086335] __snd_pcm_lib_xfer+0x660/0x810
> [ 21.086345] snd_pcm_common_ioctl+0xa20/0x17e0
> [ 21.086356] snd_pcm_ioctl+0x3c/0x60
> [ 21.086366] __arm64_sys_ioctl+0xac/0x110
> [ 21.086376] invoke_syscall+0x5c/0x120
> [ 21.086386] el0_svc_common.constprop.0+0x48/0xf0
> [ 21.086395] do_el0_svc+0x24/0x40
> [ 21.086404] el0_svc+0x54/0x3b0
> [ 21.086414] el0t_64_sync_handler+0xa0/0xf0
> [ 21.086424] el0t_64_sync+0x198/0x1a0
>
> Note: the return value of 'regmap_read' in 'aiu_fifo_pointer' is
> intentionally ignored. Regmap is MMIO here and read failures shouldn't
> happen. Also 'axg-fifo.c' is doing the same in its 'axg_fifo_pcm_pointer'.
>
> Fixes: e8712315c44d ("ASoC: soc-component: use io_mutex correctly")
> Fixes: 6b59c53c8adc ("ASoC: meson: aiu: fifo-spdif: soft reset the S/PDIF datapath on start/stop")
> Signed-off-by: Valerio Setti <vsetti@xxxxxxxxxxxx>
Reviewed-by: Jerome Brunet <jbrunet@xxxxxxxxxxxx>