From: sashiko-bot@kernel.org
To: "Vijendar Mukunda" <Vijendar.Mukunda@amd.com>
Cc: linux-sound@vger.kernel.org
Subject: Re: [PATCH v5 22/25] soundwire: amd: fix interrupt gate and work drain ordering in PM ops
Date: Sat, 07 Nov 2026 16:25:51 +0000 [thread overview]
Message-ID: <sashiko-outbox-203057@kernel.org> (raw)
In-Reply-To: <20261107154659.3358223-23-Vijendar.Mukunda@amd.com>
Thank you for your contribution! Sashiko AI review found 2 potential
issues to consider:
- [Medium] soundwire: amd: unserialized hard IRQ race with work drain in
amd_suspend()
- [Low] soundwire: amd: commit message describes prior patch revision in
PM ops
--
commit f3586b88e19b93c1d283c25b97e67e7d9da93bab
Author: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
> soundwire: amd: fix interrupt gate and work drain ordering in PM ops
>
> The CLK_STOP_MODE branches in amd_suspend() and amd_suspend_runtime()
> did not close the ACP_EXTERNAL_INTR_CNTL delivery gate before draining
> amd_sdw_irq_thread and amd_sdw_work. An ISR already running when the
> drains completed could re-queue work after cancel_work_sync() returned,
> racing amd_sdw_clock_stop().
>
> In both CLK_STOP_MODE paths, amd_sdw_wake_enable() was also called
> before amd_enable_sdw_interrupts(). Since amd_enable_sdw_interrupts()
> writes the interrupt mask unconditionally, it clobbered the wake bit
> set by amd_sdw_wake_enable().
>
> For both amd_suspend() and amd_suspend_runtime():
> - CLK_STOP_MODE: add amd_disable_sdw_interrupts() and
> cancel_work_sync(irq_thread) before the work drain; reopen the gate
> with amd_enable_sdw_interrupts() after clock stop, then call
> amd_sdw_wake_enable() so the wake bit is not clobbered.
> - POWER_OFF_MODE: add amd_disable_sdw_interrupts() and
> cancel_work_sync(irq_thread) before the work drain; remove the
> redundant post-clock-stop amd_disable_sdw_interrupts() call.
>
> Fixes: 86a4371b7697 ("soundwire: amd: fix for handling slave alerts after link is down")
> Reported-by: Lee Jones <lee@kernel.org>
> Closes: https://sashiko.dev/#/bug/linux-3b774ace-00cf-41e6-82eb-85cd43f5e1d6
> Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
[Severity: Low]
Does the commit message describe an intermediate revision of this series
rather than the parent commit?
In the parent commit, amd_suspend_runtime() did not drain
amd_sdw_irq_thread or amd_sdw_work at all (this patch adds both
cancel_work_sync() calls there), and neither CLK_STOP_MODE path called
amd_enable_sdw_interrupts() before this patch.
> diff --git a/drivers/soundwire/amd_manager.c b/drivers/soundwire/amd_manager.c
> index 2b38b9bf97f50..4e151f7350c96 100644
> --- a/drivers/soundwire/amd_manager.c
> +++ b/drivers/soundwire/amd_manager.c
> @@ -1437,15 +1437,20 @@ static int __maybe_unused amd_suspend(struct device *dev)
> }
>
> if (amd_manager->power_mode_mask & AMD_SDW_CLK_STOP_MODE) {
> + amd_disable_sdw_interrupts(amd_manager);
> + cancel_work_sync(&amd_manager->amd_sdw_irq_thread);
> cancel_work_sync(&amd_manager->amd_sdw_work);
> - amd_sdw_wake_enable(amd_manager, false);
> ret = amd_sdw_host_wake_enable_by_rev(amd_manager, false);
> if (ret)
> return ret;
> ret = amd_sdw_clock_stop(amd_manager);
> if (ret)
> return ret;
> + amd_enable_sdw_interrupts(amd_manager);
> + amd_sdw_wake_enable(amd_manager, false);
[Severity: Medium]
Can an in-flight parent ACP hard IRQ handler still queue
amd_sdw_irq_thread after cancel_work_sync() returns in amd_suspend() and
amd_suspend_runtime()?
None of the parent ACP hard IRQ handlers (such as acp63_irq_handler() in
sound/soc/amd/ps/pci-ps.c) check amd_manager->interrupt_enabled or acquire
acp_sdw_lock before calling schedule_work(&amd_manager->amd_sdw_irq_thread):
sound/soc/amd/ps/pci-ps.c:acp63_irq_handler() {
...
ext_intr_stat = readl(adata->acp63_base + ACP_EXTERNAL_INTR_STAT);
if (ext_intr_stat & ACP_SDW0_STAT) {
writel(ACP_SDW0_STAT, adata->acp63_base + ACP_EXTERNAL_INTR_STAT);
amd_manager = dev_get_drvdata(&adata->sdw->pdev[0]->dev);
if (amd_manager)
schedule_work(&amd_manager->amd_sdw_irq_thread);
...
}
If the hard IRQ fires just before amd_disable_sdw_interrupts() masks
ACP_EXTERNAL_INTR_CNTL, the two contexts can interleave as follows:
CPU0 CPU1 (<hardirq>)
amd_suspend()
acp63_irq_handler()
readl(... + ACP_EXTERNAL_INTR_STAT)
amd_disable_sdw_interrupts()
interrupt_enabled = false
amd_updatel(ACP_EXTERNAL_INTR_CNTL, ...)
cancel_work_sync(&amd_sdw_irq_thread)
cancel_work_sync(&amd_sdw_work)
amd_sdw_clock_stop()
amd_enable_sdw_interrupts()
interrupt_enabled = true
schedule_work(&amd_sdw_irq_thread)
amd_sdw_irq_thread()
schedule_work(&amd_sdw_work)
<-- runs while clock is stopped
Even in AMD_SDW_POWER_OFF_MODE where interrupt_enabled remains false,
amd_sdw_irq_thread() still reads SoundWire MMIO registers and calls
amd_sdw_read_and_process_ping_status() without checking interrupt_enabled,
racing with amd_sdw_clock_stop(), amd_disable_sdw_manager(), and D3 entry.
In AMD_SDW_CLK_STOP_MODE, calling amd_enable_sdw_interrupts() right after
amd_sdw_clock_stop() also sets interrupt_enabled back to true while the
clock is stopped, allowing a late amd_sdw_irq_thread() to schedule
amd_sdw_work and trigger MIPI command timeouts (-ETIMEDOUT).
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261107154659.3358223-1-Vijendar.Mukunda@amd.com?part=22
next prev parent reply other threads:[~2026-11-07 16:25 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-07 15:45 [PATCH v5 00/25] soundwire: amd: SoundWire manager driver bug fixes Vijendar Mukunda
2026-11-07 15:45 ` [PATCH v5 01/25] soundwire: amd: consolidate pad register macros into amd_init.h Vijendar Mukunda
2026-11-07 15:45 ` [PATCH v5 02/25] soundwire: amd: program pad SCHMEN and OE control for ACP 7.0/7.1/7.2 Vijendar Mukunda
2026-11-07 16:13 ` sashiko-bot
2026-11-07 19:00 ` Mukunda,Vijendar
2026-11-07 15:45 ` [PATCH v5 03/25] soundwire: amd: add pad ctrl helpers for D0/D3 PM transitions Vijendar Mukunda
2026-11-07 15:45 ` [PATCH v5 04/25] soundwire: amd: track full pad teardown across suspend/resume Vijendar Mukunda
2026-11-07 15:45 ` [PATCH v5 05/25] soundwire: amd: fix missing wake interrupt and group wake-arming calls in runtime suspend Vijendar Mukunda
2026-11-07 16:04 ` sashiko-bot
2026-11-07 15:45 ` [PATCH v5 06/25] soundwire: amd: fix IRQ thread dropping STATUS_0TO7 on simultaneous wake Vijendar Mukunda
2026-11-07 15:45 ` [PATCH v5 07/25] soundwire: amd: remove STATUS_8TO11 clear from amd_sdw_process_wake_event() Vijendar Mukunda
2026-11-07 15:45 ` [PATCH v5 08/25] soundwire: amd: fix missing wake interrupt for ACP6.3 in POWER_OFF suspend Vijendar Mukunda
2026-11-07 16:02 ` sashiko-bot
2026-11-07 15:45 ` [PATCH v5 09/25] soundwire: amd: fix SDW command timeout return value handling Vijendar Mukunda
2026-11-07 15:45 ` [PATCH v5 10/25] soundwire: amd: return response on IMM status cleanup timeout Vijendar Mukunda
2026-11-07 16:04 ` sashiko-bot
2026-11-07 15:45 ` [PATCH v5 11/25] soundwire: amd: clarify bad-state guard poll omission in IMM_RES_VALID path Vijendar Mukunda
2026-11-07 15:45 ` [PATCH v5 12/25] soundwire: amd: cache ping slave status to avoid spurious disconnect on timeout Vijendar Mukunda
2026-11-07 15:45 ` [PATCH v5 13/25] soundwire: amd: assert msg_lock is held in amd_sdw_read_ping_status() Vijendar Mukunda
2026-11-07 15:45 ` [PATCH v5 14/25] soundwire: amd: fix work drain ordering in remove path Vijendar Mukunda
2026-11-07 16:14 ` sashiko-bot
2026-11-07 19:07 ` Mukunda,Vijendar
2026-11-07 15:45 ` [PATCH v5 15/25] soundwire: amd: defer dev_set_drvdata() until after INIT_WORK() Vijendar Mukunda
2026-11-07 15:45 ` [PATCH v5 16/25] soundwire: amd: pm_runtime guard in remove path Vijendar Mukunda
2026-11-07 16:10 ` sashiko-bot
2026-11-07 15:45 ` [PATCH v5 17/25] soundwire: amd: use interrupt_enabled flag to guard IRQ work scheduling Vijendar Mukunda
2026-11-07 16:21 ` sashiko-bot
2026-11-07 20:29 ` Mukunda,Vijendar
2026-11-07 15:45 ` [PATCH v5 18/25] soundwire: amd: delay *sdw_ctx publication until after startup succeeds Vijendar Mukunda
2026-11-07 16:15 ` sashiko-bot
2026-11-07 20:19 ` Mukunda,Vijendar
2026-11-07 15:45 ` [PATCH v5 19/25] soundwire: amd: propagate amd_init_sdw_manager() error on resume Vijendar Mukunda
2026-11-07 15:45 ` [PATCH v5 20/25] soundwire: amd: drop amd_deinit_sdw_manager() in POWER_OFF suspend Vijendar Mukunda
2026-11-07 15:45 ` [PATCH v5 21/25] soundwire: amd: replace >= ACP70 with explicit switch/case in PM paths Vijendar Mukunda
2026-11-07 15:45 ` [PATCH v5 22/25] soundwire: amd: fix interrupt gate and work drain ordering in PM ops Vijendar Mukunda
2026-11-07 16:25 ` sashiko-bot [this message]
2026-11-07 20:37 ` Mukunda,Vijendar
2026-11-07 15:45 ` [PATCH v5 23/25] soundwire: amd: check for NULL manager drvdata in sdw_amd_startup() Vijendar Mukunda
2026-11-07 15:45 ` [PATCH v5 24/25] soundwire: amd: fix shared-register RMW race in amd_sdw_set_device_state() Vijendar Mukunda
2026-11-07 15:45 ` [PATCH v5 25/25] soundwire: amd: fix shared-register RMW race in amd_sdw_host_wake_enable() Vijendar Mukunda
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=sashiko-outbox-203057@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=Vijendar.Mukunda@amd.com \
--cc=linux-sound@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.