From: Takashi Iwai <tiwai@suse.de>
To: Yu-Hsuan Hsu <yuhsuan@chromium.org>
Cc: linux-kernel@vger.kernel.org, "Jaroslav Kysela" <perex@perex.cz>,
"Takashi Iwai" <tiwai@suse.com>,
"Cássio Gabriel" <cassiogabrielcontato@gmail.com>,
linux-sound@vger.kernel.org
Subject: Re: [PATCH] ALSA: aloop: Fix spinlock deadlock in loopback_hrtimer_stop()
Date: Sat, 01 Aug 2026 09:33:02 +0200 [thread overview]
Message-ID: <8733wycn2p.wl-tiwai@suse.de> (raw)
In-Reply-To: <20260731074255.1513402-1-yuhsuan@chromium.org>
On Fri, 31 Jul 2026 09:39:35 +0200,
Yu-Hsuan Hsu wrote:
>
> In loopback_hrtimer_stop(), calling hrtimer_cancel() while holding
> cable->lock triggers an AB-BA spinlock deadlock if the hrtimer softirq
> is executing concurrently on another CPU:
>
> 1) CPU A runs loopback_trigger(STOP), acquires spin_lock(&cable->lock),
> and calls hrtimer_cancel(). Since hrtimer_cancel() is synchronous,
> it spins waiting for the executing callback to complete before
> returning.
> 2) CPU B executes loopback_hrtimer_function(), which immediately tries
> to acquire spin_lock(&cable->lock).
>
> This mutual dependency leads to a CPU hard lockup and NMI watchdog
> panic when multiple streams start and stop concurrently with small
> period sizes.
>
> Replace hrtimer_cancel() in loopback_hrtimer_stop() with the non-blocking
> hrtimer_try_to_cancel(), matching the behavior of jiffies timers
> (timer_delete vs timer_delete_sync). If try_to_cancel returns -1
> because the handler is running, CPU A releases cable->lock cleanly.
> When the running handler subsequently acquires cable->lock, it observes
> that the stream is no longer in running state (cleared by trigger STOP)
> and terminates without re-arming the timer. Synchronous hrtimer_cancel()
> remains preserved in loopback_hrtimer_stop_sync() where cable->lock is
> not held.
>
> Fixes: bf08a5f698dc ("ALSA: aloop: Add 'hrtimer' option to timer_source")
> Signed-off-by: Yu-Hsuan Hsu <yuhsuan@chromium.org>
While I find it's fine to change like this, I wonder whether you
really hit a CPU deadlock. Or it's just hypothetical?
thanks,
Takashi
prev parent reply other threads:[~2026-08-01 7:33 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-31 7:39 [PATCH] ALSA: aloop: Fix spinlock deadlock in loopback_hrtimer_stop() Yu-Hsuan Hsu
2026-08-01 7:33 ` Takashi Iwai [this message]
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=8733wycn2p.wl-tiwai@suse.de \
--to=tiwai@suse.de \
--cc=cassiogabrielcontato@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sound@vger.kernel.org \
--cc=perex@perex.cz \
--cc=tiwai@suse.com \
--cc=yuhsuan@chromium.org \
/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.