From: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
To: vkoul@kernel.org, perex@perex.cz, tiwai@suse.com,
lgirdwood@gmail.com, broonie@kernel.org,
srinivas.kandagatla@oss.qualcomm.com
Cc: linux-sound@vger.kernel.org, kai.vehmanen@linux.intel.com,
yung-chuan.liao@linux.intel.com, pierre-louis.bossart@linux.dev,
daniel.baluta@nxp.com
Subject: [PATCH v4 03/26] ALSA: compress: stop active streams on disconnect
Date: Wed, 16 Sep 2026 15:02:57 +0300 [thread overview]
Message-ID: <20260916120320.18318-4-peter.ujfalusi@linux.intel.com> (raw)
In-Reply-To: <20260916120320.18318-1-peter.ujfalusi@linux.intel.com>
Track open compressed streams per device so disconnect can stop
active streams and wake waiters before snd_unregister_device().
This aligns compressed stream teardown with PCM disconnect behavior
and prevents active userspace streams from running into unregister
races.
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Liam Girdwood <liam.r.girdwood@intel.com>
Reviewed-by: Takashi Iwai <tiwai@suse.de>
---
include/sound/compress_driver.h | 2 ++
sound/core/compress_offload.c | 49 +++++++++++++++++++++++++++------
2 files changed, 42 insertions(+), 9 deletions(-)
diff --git a/include/sound/compress_driver.h b/include/sound/compress_driver.h
index 9e3d801e45ec..84f51edc3f9d 100644
--- a/include/sound/compress_driver.h
+++ b/include/sound/compress_driver.h
@@ -188,6 +188,7 @@ struct snd_compr_ops {
* @card: sound card pointer
* @direction: Playback or capture direction
* @lock: device lock
+ * @open_list: list of open compress files
* @device: device id
* @use_pause_in_draining: allow pause in draining, true when set
*/
@@ -199,6 +200,7 @@ struct snd_compr {
struct snd_card *card;
unsigned int direction;
struct mutex lock;
+ struct list_head open_list;
int device;
bool use_pause_in_draining;
#ifdef CONFIG_SND_VERBOSE_PROCFS
diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c
index 7b720603a9a8..89435e4394ef 100644
--- a/sound/core/compress_offload.c
+++ b/sound/core/compress_offload.c
@@ -42,6 +42,7 @@
#endif
struct snd_compr_file {
+ struct list_head list;
unsigned long caps;
struct snd_compr_stream stream;
};
@@ -124,6 +125,7 @@ static int snd_compr_open(struct inode *inode, struct file *f)
ret = -ENOMEM;
goto __error;
}
+ INIT_LIST_HEAD(&data->list);
INIT_DELAYED_WORK(&data->stream.error_work, error_delayed_work);
@@ -143,8 +145,11 @@ static int snd_compr_open(struct inode *inode, struct file *f)
#endif
data->stream.runtime = runtime;
f->private_data = (void *)data;
- scoped_guard(mutex, &compr->lock)
+ scoped_guard(mutex, &compr->lock) {
ret = compr->ops->open(&data->stream);
+ if (!ret)
+ list_add_tail(&data->list, &compr->open_list);
+ }
__error:
if (ret) {
@@ -161,17 +166,23 @@ static int snd_compr_free(struct inode *inode, struct file *f)
{
struct snd_compr_file *data = f->private_data;
struct snd_compr_runtime *runtime = data->stream.runtime;
+ struct snd_compr *compr = data->stream.device;
cancel_delayed_work_sync(&data->stream.error_work);
- switch (runtime->state) {
- case SNDRV_PCM_STATE_RUNNING:
- case SNDRV_PCM_STATE_DRAINING:
- case SNDRV_PCM_STATE_PAUSED:
- data->stream.ops->trigger(&data->stream, SNDRV_PCM_TRIGGER_STOP);
- break;
- default:
- break;
+ scoped_guard(mutex, &compr->lock) {
+ if (!list_empty(&data->list))
+ list_del_init(&data->list);
+
+ switch (runtime->state) {
+ case SNDRV_PCM_STATE_RUNNING:
+ case SNDRV_PCM_STATE_DRAINING:
+ case SNDRV_PCM_STATE_PAUSED:
+ data->stream.ops->trigger(&data->stream, SNDRV_PCM_TRIGGER_STOP);
+ break;
+ default:
+ break;
+ }
}
snd_compr_task_free_all(&data->stream);
@@ -1449,8 +1460,27 @@ static int snd_compress_dev_register(struct snd_device *device)
static int snd_compress_dev_disconnect(struct snd_device *device)
{
struct snd_compr *compr;
+ struct snd_compr_file *data;
compr = device->device_data;
+ scoped_guard(mutex, &compr->lock) {
+ list_for_each_entry(data, &compr->open_list, list) {
+ switch (data->stream.runtime->state) {
+ case SNDRV_PCM_STATE_RUNNING:
+ case SNDRV_PCM_STATE_DRAINING:
+ case SNDRV_PCM_STATE_PAUSED:
+ data->stream.ops->trigger(&data->stream,
+ SNDRV_PCM_TRIGGER_STOP);
+ break;
+ default:
+ break;
+ }
+
+ data->stream.runtime->state = SNDRV_PCM_STATE_DISCONNECTED;
+ wake_up(&data->stream.runtime->sleep);
+ }
+ }
+
snd_unregister_device(compr->dev);
return 0;
}
@@ -1558,6 +1588,7 @@ int snd_compress_new(struct snd_card *card, int device,
compr->device = device;
compr->direction = dirn;
mutex_init(&compr->lock);
+ INIT_LIST_HEAD(&compr->open_list);
snd_compress_set_id(compr, id);
--
2.55.0
next prev parent reply other threads:[~2026-09-16 12:03 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-16 12:02 [PATCH v4 00/26] ALSA compress / ASoC compress / SOF: Compressed audio support with IPC4 Peter Ujfalusi
2026-09-16 12:02 ` [PATCH v4 01/26] ALSA: compress: pin card module while stream is open Peter Ujfalusi
2026-09-16 12:02 ` [PATCH v4 02/26] ALSA: compress: register the open file with the card Peter Ujfalusi
2026-10-06 10:35 ` Mark Brown
2026-10-06 10:59 ` Péter Ujfalusi
2026-09-16 12:02 ` Peter Ujfalusi [this message]
2026-09-16 12:02 ` [PATCH v4 04/26] ASoC: soc-compress: Provide a runtime for the compressed FE substream Peter Ujfalusi
2026-09-16 12:02 ` [PATCH v4 05/26] ASoC: soc-compress: Implement trigger FE-BE sequencing as with normal PCMs Peter Ujfalusi
2026-10-06 9:12 ` Mark Brown
2026-10-06 9:50 ` Péter Ujfalusi
2026-10-06 10:11 ` Mark Brown
2026-09-16 12:03 ` [PATCH v4 06/26] ASoC: soc-compress: Stop running dpcm on free Peter Ujfalusi
2026-09-16 12:03 ` [PATCH v4 07/26] ASoC: SOF: compress: Move the IPC agnostic helpers to sof-audio.c Peter Ujfalusi
2026-09-16 12:03 ` [PATCH v4 08/26] ASoC: SOF: compress: Rename compress ops with ipc3 prefix Peter Ujfalusi
2026-09-16 12:03 ` [PATCH v4 09/26] ASoC: SOF: sof-audio: Fix the pipeline_list population Peter Ujfalusi
2026-09-16 12:03 ` [PATCH v4 10/26] ASoC: SOF: ipc4-pcm: Serialize the PCM free with the pipeline triggers Peter Ujfalusi
2026-09-16 12:03 ` [PATCH v4 11/26] ASoC: SOF: sof-audio: do not dereference swidget->spipe unconditionally on free Peter Ujfalusi
2026-09-16 12:03 ` [PATCH v4 12/26] ASoC: SOF: sof-audio: Expose a couple of functions Peter Ujfalusi
2026-09-16 12:03 ` [PATCH v4 13/26] ASoC: SOF: pcm: Modify the signature of a couple of PCM IPC ops Peter Ujfalusi
2026-09-16 12:03 ` [PATCH v4 14/26] ASoC: SOF: intel: hda-stream: Clear the current position when releasing stream Peter Ujfalusi
2026-09-16 12:03 ` [PATCH v4 15/26] ASoC: SOF: ipc4: Add definition of module data in init_ext object type Peter Ujfalusi
2026-09-16 12:03 ` [PATCH v4 16/26] ASoC: SOF: ipc4-topology: Support init_ext_module_data for process modules Peter Ujfalusi
2026-09-16 12:03 ` [PATCH v4 17/26] ASoC: SOF: ipc4-pcm: Make the timestamp info usable outside of ipc4-pcm.c Peter Ujfalusi
2026-09-16 12:03 ` [PATCH v4 18/26] ASoC: SOF: ipc4/ipc4-loader: Add SOF_INFO and CODEC_INFO to fw_config_params Peter Ujfalusi
2026-09-16 12:03 ` [PATCH v4 19/26] ASoC: SOF: ipc4-pcm: Handle COMPR DRAIN triggers as EOS pipeline state Peter Ujfalusi
2026-09-16 12:03 ` [PATCH v4 20/26] ASoC: SOF: ipc4-topology: Set FAST_MODE for host copier in compr mode Peter Ujfalusi
2026-09-16 12:03 ` [PATCH v4 21/26] ASoC: SOF: ops: Add new platform-specific ops for compress Peter Ujfalusi
2026-09-16 12:03 ` [PATCH v4 22/26] ASoC: SOF: Add support for IPC4 compressed Peter Ujfalusi
2026-10-06 9:37 ` Mark Brown
2026-10-06 11:32 ` Péter Ujfalusi
2026-09-16 12:03 ` [PATCH v4 23/26] ASoC: SOF: ipc4: Handle compressed drain done notification from firmware Peter Ujfalusi
2026-09-16 12:03 ` [PATCH v4 24/26] ASoC: SOF: Intel: Kconfig: Remove redundant IPC version selects Peter Ujfalusi
2026-09-16 12:03 ` [PATCH v4 25/26] ASoC: SOF: Intel: Kconfig: Select compress support for TGL+ platforms Peter Ujfalusi
2026-09-16 12:03 ` [PATCH v4 26/26] ASoC: SOF: topology: Add support for decoder and encoder widgets Peter Ujfalusi
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=20260916120320.18318-4-peter.ujfalusi@linux.intel.com \
--to=peter.ujfalusi@linux.intel.com \
--cc=broonie@kernel.org \
--cc=daniel.baluta@nxp.com \
--cc=kai.vehmanen@linux.intel.com \
--cc=lgirdwood@gmail.com \
--cc=linux-sound@vger.kernel.org \
--cc=perex@perex.cz \
--cc=pierre-louis.bossart@linux.dev \
--cc=srinivas.kandagatla@oss.qualcomm.com \
--cc=tiwai@suse.com \
--cc=vkoul@kernel.org \
--cc=yung-chuan.liao@linux.intel.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox