• Cristian Ciocaltea's avatar
    ASoC: SOF: amd: Fix locking in ACP IRQ handler · c4b603c6
    Cristian Ciocaltea authored
    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: 802134c8 ("ASoC: SOF: amd: Refactor spinlock_irq(&sdev->ipc_lock) sequence in irq_handler")
    Signed-off-by: default avatarCristian Ciocaltea <cristian.ciocaltea@collabora.com>
    Link: https://lore.kernel.org/r/20240208234315.2182048-1-cristian.ciocaltea@collabora.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    c4b603c6
acp.c 16.9 KB