linux/sound/soc
Cristian Ciocaltea c4b603c6e2
ASoC: SOF: amd: Fix locking in ACP IRQ handler
A recent change in acp_irq_thread() was meant to address a potential race
condition while trying to acquire the hardware semaphore responsible for
the synchronization between firmware and host IPC interrupts.

This resulted in an improper use of the IPC spinlock, causing normal
kernel memory allocations (which may sleep) inside atomic contexts:

1707255557.133976 kernel: BUG: sleeping function called from invalid context at include/linux/sched/mm.h:315

...

1707255557.134757 kernel:  sof_ipc3_rx_msg+0x70/0x130 [snd_sof]
1707255557.134793 kernel:  acp_sof_ipc_irq_thread+0x1e0/0x550 [snd_sof_amd_acp]
1707255557.134855 kernel:  acp_irq_thread+0xa3/0x130 [snd_sof_amd_acp]
1707255557.134904 kernel:  ? irq_thread+0xb5/0x1e0
1707255557.134947 kernel:  ? __pfx_irq_thread_fn+0x10/0x10
1707255557.134985 kernel:  irq_thread_fn+0x23/0x60

Moreover, there are attempts to lock a mutex from the same atomic
context:

1707255557.136357 kernel: =============================
1707255557.136393 kernel: [ BUG: Invalid wait context ]
1707255557.136413 kernel: 6.8.0-rc3-next-20240206-audio-next #9 Tainted: G        W
1707255557.136432 kernel: -----------------------------
1707255557.136451 kernel: irq/66-AudioDSP/502 is trying to lock:
1707255557.136470 kernel: ffff965152f26af8 (&sb->s_type->i_mutex_key#2){+.+.}-{3:3}, at: start_creating.part.0+0x5f/0x180

...

1707255557.137429 kernel:  start_creating.part.0+0x5f/0x180
1707255557.137457 kernel:  __debugfs_create_file+0x61/0x210
1707255557.137475 kernel:  snd_sof_debugfs_io_item+0x75/0xc0 [snd_sof]
1707255557.137494 kernel:  sof_ipc3_do_rx_work+0x7cf/0x9f0 [snd_sof]
1707255557.137513 kernel:  sof_ipc3_rx_msg+0xb3/0x130 [snd_sof]
1707255557.137532 kernel:  acp_sof_ipc_irq_thread+0x1e0/0x550 [snd_sof_amd_acp]
1707255557.137551 kernel:  acp_irq_thread+0xa3/0x130 [snd_sof_amd_acp]

Fix the issues by reducing the lock scope in acp_irq_thread(), so that
it guards only the hardware semaphore acquiring attempt.  Additionally,
restore the initial locking in acp_sof_ipc_irq_thread() to synchronize
the handling of immediate replies from DSP core.

Fixes: 802134c8c2 ("ASoC: SOF: amd: Refactor spinlock_irq(&sdev->ipc_lock) sequence in irq_handler")
Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
Link: https://lore.kernel.org/r/20240208234315.2182048-1-cristian.ciocaltea@collabora.com
Signed-off-by: Mark Brown <broonie@kernel.org>
2024-02-11 16:58:50 +00:00
..
adi ASoC: adi: merge DAI call back functions into ops 2023-08-14 13:10:03 +01:00
amd ASoC: amd: yc: Add DMI quirk for Lenovo Ideapad Pro 5 16ARP8 2024-02-06 09:56:05 +00:00
apple ASoC: apple: mca: Annotate struct mca_data with __counted_by 2023-10-10 22:10:07 +01:00
atmel ASoC: Explicitly include correct DT includes 2023-10-09 13:13:56 +01:00
au1x ASoC: au1x: convert not to use asoc_xxx() 2023-09-25 14:16:24 +02:00
bcm ASoC: Explicitly include correct DT includes 2023-10-09 13:13:56 +01:00
cirrus ASoC: cirrus: edb93xx: Drop legacy include 2023-12-01 16:59:22 +00:00
codecs ASoC: rt5645: Fix deadlock in rt5645_jack_detect_work() 2024-02-11 16:58:49 +00:00
dwc Linux 6.6-rc7 2023-10-23 19:38:22 +01:00
fsl sound updates for 6.8-rc1 2024-01-12 11:55:28 -08:00
generic ASoC: audio-graph-card2: fix index check on graph_parse_node_multi_nm() 2024-01-12 14:13:53 +00:00
google ASoC: google: convert not to use asoc_xxx() 2023-09-25 14:16:32 +02:00
hisilicon ASoC: hisilicon: Drop GPIO include 2023-12-18 14:03:29 +00:00
img ASoC: img: convert not to use asoc_xxx() 2023-09-25 14:16:21 +02:00
intel ASoC: Intel: avs: Fix dynamic port assignment when TDM is set 2024-02-07 15:23:49 +00:00
jz4740 ASoC: jz4740: merge DAI call back functions into ops 2023-08-14 13:10:21 +01:00
kirkwood ASoC: kirkwood: convert not to use asoc_xxx() 2023-09-25 14:16:36 +02:00
loongson ASoC: loongson: convert not to use asoc_xxx() 2023-09-25 14:16:37 +02:00
mediatek ASoC: Fixes for v6.8 2024-01-16 17:37:17 +01:00
meson ASoC: meson: g12a-tohdmitx: Fix event generation for S/PDIF mux 2024-01-03 18:37:02 +00:00
mxs ASoC: Explicitly include correct DT includes 2023-10-09 13:13:56 +01:00
pxa ASoC: pxa: sspa: Don't select SND_ARM 2023-12-29 17:41:15 +00:00
qcom ASoC: qcom: sc8280xp: limit speaker volumes 2024-01-22 19:38:10 +00:00
rockchip i2c: make i2c_bus_type const 2024-01-18 21:10:43 +01:00
samsung ASoC: samsung: odroid: don't need DUMMY Platform 2023-12-19 13:23:43 +00:00
sh ASoC: sh: convert not to use dma_request_slave_channel() 2023-11-27 13:44:06 +00:00
sof ASoC: SOF: amd: Fix locking in ACP IRQ handler 2024-02-11 16:58:50 +00:00
spear
sprd ASoC: sprd: Simplify memory allocation in sprd_platform_compr_dma_config() 2023-12-19 14:02:50 +00:00
starfive ASoC: starfive/jh7110-pwmdac: Convert to platform remove callback returning void 2023-10-23 13:29:44 +01:00
sti ASoC: sti-uniperf: Use default pcm_config instead 2023-11-13 01:26:07 +00:00
stm ASoC: Use device_get_match_data() 2023-10-09 13:13:59 +01:00
sunxi ASoC: sunxi: sun4i-spdif: Add support for Allwinner H616 2024-01-29 16:55:18 +00:00
tegra ASoC: tegra: tegra20_ac97: Convert to use GPIO descriptors 2023-12-18 14:03:32 +00:00
ti ASoC: ti: omap-mcbsp: Fix runtime PM underflow warnings 2023-10-30 13:30:20 +00:00
uniphier ASoC: uniphier: Make uniphier_aio_remove() return void 2023-10-23 13:29:48 +01:00
ux500 ASoC: ux500: convert not to use asoc_xxx() 2023-09-25 14:16:31 +02:00
xilinx
xtensa ASoC: extensa: convert not to use asoc_xxx() 2023-09-25 14:16:35 +02:00
Kconfig
Makefile
soc-ac97.c
soc-acpi.c
soc-card.c
soc-component.c ASoC: Merge fixes for consistent cs42l43 schema 2023-10-10 17:07:17 +01:00
soc-compress.c ASoC: soc-compress: convert not to use asoc_xxx() 2023-09-25 14:16:52 +02:00
soc-core.c ASoC: allow up to eight CPU/codec DAIs 2024-01-22 15:31:16 +00:00
soc-dai.c ASoC: Merge up workaround for CODECs that play noise on stopped stream 2023-10-27 22:33:15 +01:00
soc-dapm.c ASoC: makes CPU/Codec channel connection map more generic 2023-11-27 13:44:00 +00:00
soc-devres.c
soc-generic-dmaengine-pcm.c ASoC: Merge up fixes 2023-09-26 16:14:44 +02:00
soc-jack.c ASoC: soc-jack: calling snd_soc_jack_report causes a null pointer access 2023-08-14 22:10:35 +01:00
soc-link.c ASoC: soc-link: convert not to use asoc_xxx() 2023-09-25 14:16:50 +02:00
soc-ops.c ASoC: ops: add correct range check for limiting volume 2023-12-04 16:20:25 +00:00
soc-pcm.c ASoC: Updates for v6.8 2024-01-08 08:18:02 +01:00
soc-topology-test.c ASoC: topology: Replace fake root_device with kunit_device in tests 2023-12-18 13:28:08 -07:00
soc-topology.c ASoC: soc-topology: convert not to use asoc_xxx() 2023-09-25 14:16:52 +02:00
soc-utils-test.c
soc-utils.c ASoC: soc-utils: convert not to use asoc_xxx() 2023-09-25 14:16:51 +02:00