FAILED: patch "[PATCH] ALSA: core: Serialize deferred fasync state checks" failed to apply to 5.15-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.15.y
git checkout FETCH_HEAD
git cherry-pick -x 5337213381df578058e2e41da93cbd0e4639935f
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026051255-pushup-cheek-6781@gregkh' --subject-prefix 'PATCH 5.15.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 5337213381df578058e2e41da93cbd0e4639935f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A1ssio=20Gabriel?= <[email protected]>
Date: Wed, 6 May 2026 00:34:47 -0300
Subject: [PATCH] ALSA: core: Serialize deferred fasync state checks
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
snd_fasync_helper() updates fasync->on under snd_fasync_lock, and snd_fasync_work_fn() now also evaluates fasync->on under the same lock. snd_kill_fasync() still tests the flag before taking the lock, leaving an unsynchronized read against FASYNC enable/disable updates.
Move the enabled-state check into the locked section.
Also clear fasync->on under snd_fasync_lock in snd_fasync_free() before unlinking the pending entry. Together with the locked sender-side check, this publishes teardown before flushing the deferred work and prevents a racing sender from requeueing the entry after free has started.
sound/core/misc.c +6 -2
@@ -148,9 +148,11 @@ EXPORT_SYMBOL_GPL(snd_fasync_helper);void snd_kill_fasync (struct snd_fasync *fasync,int signal,int poll) { -if (!fasync || !fasync->on) +if (!fasync)return ;guard (spinlock_irqsave)(&snd_fasync_lock); +if (!fasync->on) +return ; fasync->signal = signal; fasync->poll = poll;list_move (&fasync->list, &snd_fasync_list);
@@ -163,8 +165,10 @@ void snd_fasync_free(struct snd_fasync *fasync)if (!fasync)return ; - scoped_guard(spinlock_irq, &snd_fasync_lock) + scoped_guard(spinlock_irq, &snd_fasync_lock) { + fasync->on =0 ;list_del_init (&fasync->list); + }flush_work (&snd_fasync_work);kfree (fasync);
Sasha Levin
maintainerPATCH 1/1 ALSA: core: Serialize deferred fasync state checks
From: Cássio Gabriel <[email protected]>
[ Upstream commit 5337213381df578058e2e41da93cbd0e4639935f ]
snd_fasync_helper() updates fasync->on under snd_fasync_lock, and snd_fasync_work_fn() now also evaluates fasync->on under the same lock. snd_kill_fasync() still tests the flag before taking the lock, leaving an unsynchronized read against FASYNC enable/disable updates.
Move the enabled-state check into the locked section.
Also clear fasync->on under snd_fasync_lock in snd_fasync_free() before unlinking the pending entry. Together with the locked sender-side check, this publishes teardown before flushing the deferred work and prevents a racing sender from requeueing the entry after free has started.
--- sound/core/misc.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
sound/core/misc.c +7 -1
@@ -219,9 +219,13 @@ void snd_kill_fasync(struct snd_fasync *fasync, int signal, int poll) {unsigned long flags; -if (!fasync || !fasync->on) +if (!fasync)return ;spin_lock_irqsave (&snd_fasync_lock, flags); +if (!fasync->on) { +spin_unlock_irqrestore (&snd_fasync_lock, flags); +return ; + } fasync->signal = signal; fasync->poll = poll;list_move (&fasync->list, &snd_fasync_list);
@@ -234,7 +238,9 @@ void snd_fasync_free(struct snd_fasync *fasync) {if (!fasync)return ; +spin_lock_irq (&snd_fasync_lock); fasync->on =0 ; +spin_unlock_irq (&snd_fasync_lock);flush_work (&snd_fasync_work);kfree (fasync); }
Signature · 1 line
2.53.0