* [PATCH v2] ALSA: hda/core: add cleanup in snd_hdac_bus_alloc_stream_pages()
@ 2026-07-07 2:11 Zhao Dongdong
2026-07-07 14:16 ` Takashi Iwai
0 siblings, 1 reply; 2+ messages in thread
From: Zhao Dongdong @ 2026-07-07 2:11 UTC (permalink / raw)
To: perex, tiwai, joakim.zhang; +Cc: linux-sound, linux-kernel, Zhao Dongdong
From: Zhao Dongdong <zhaodongdong@kylinos.cn>
The current error handling in snd_hdac_bus_alloc_stream_pages()
returns directly on failure without cleaning up already allocated
resources. While callers are supposed to release those via
snd_hdac_bus_free_stream_pages() at destructor, adding explicit
cleanup makes the function more self-contained and safer against
future misuse.
Add proper error cleanup path using goto labels to free previously
allocated BDL DMA buffers, position buffer, and ring buffer in
reverse allocation order.
Signed-off-by: Zhao Dongdong <zhaodongdong@kylinos.cn>
---
v2: Update subject and description.
v1: https://lore.kernel.org/all/87pl108lp1.wl-tiwai@suse.de/
---
sound/hda/core/controller.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
diff --git a/sound/hda/core/controller.c b/sound/hda/core/controller.c
index 69e11d62bbfa..5d8731447ef6 100644
--- a/sound/hda/core/controller.c
+++ b/sound/hda/core/controller.c
@@ -713,7 +713,7 @@ int snd_hdac_bus_alloc_stream_pages(struct hdac_bus *bus)
BDL_SIZE, &s->bdl);
num_streams++;
if (err < 0)
- return -ENOMEM;
+ goto error_bdl;
}
if (WARN_ON(!num_streams))
@@ -722,12 +722,24 @@ int snd_hdac_bus_alloc_stream_pages(struct hdac_bus *bus)
err = snd_dma_alloc_pages(dma_type, bus->dev,
num_streams * 8, &bus->posbuf);
if (err < 0)
- return -ENOMEM;
+ goto error_bdl;
list_for_each_entry(s, &bus->stream_list, list)
s->posbuf = (__le32 *)(bus->posbuf.area + s->index * 8);
/* single page (at least 4096 bytes) must suffice for both ringbuffes */
- return snd_dma_alloc_pages(dma_type, bus->dev, PAGE_SIZE, &bus->rb);
+ err = snd_dma_alloc_pages(dma_type, bus->dev, PAGE_SIZE, &bus->rb);
+ if (err < 0)
+ goto error_posbuf;
+ return 0;
+
+error_posbuf:
+ snd_dma_free_pages(&bus->posbuf);
+error_bdl:
+ list_for_each_entry(s, &bus->stream_list, list) {
+ if (s->bdl.area)
+ snd_dma_free_pages(&s->bdl);
+ }
+ return -ENOMEM;
}
EXPORT_SYMBOL_GPL(snd_hdac_bus_alloc_stream_pages);
--
2.25.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH v2] ALSA: hda/core: add cleanup in snd_hdac_bus_alloc_stream_pages()
2026-07-07 2:11 [PATCH v2] ALSA: hda/core: add cleanup in snd_hdac_bus_alloc_stream_pages() Zhao Dongdong
@ 2026-07-07 14:16 ` Takashi Iwai
0 siblings, 0 replies; 2+ messages in thread
From: Takashi Iwai @ 2026-07-07 14:16 UTC (permalink / raw)
To: Zhao Dongdong
Cc: perex, tiwai, joakim.zhang, linux-sound, linux-kernel,
Zhao Dongdong
On Tue, 07 Jul 2026 04:11:39 +0200,
Zhao Dongdong wrote:
>
> From: Zhao Dongdong <zhaodongdong@kylinos.cn>
>
> The current error handling in snd_hdac_bus_alloc_stream_pages()
> returns directly on failure without cleaning up already allocated
> resources. While callers are supposed to release those via
> snd_hdac_bus_free_stream_pages() at destructor, adding explicit
> cleanup makes the function more self-contained and safer against
> future misuse.
>
> Add proper error cleanup path using goto labels to free previously
> allocated BDL DMA buffers, position buffer, and ring buffer in
> reverse allocation order.
>
> Signed-off-by: Zhao Dongdong <zhaodongdong@kylinos.cn>
> ---
> v2: Update subject and description.
> v1: https://lore.kernel.org/all/87pl108lp1.wl-tiwai@suse.de/
Applied now to for-next branch. Thanks.
Takashi
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-07-07 14:16 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-07 2:11 [PATCH v2] ALSA: hda/core: add cleanup in snd_hdac_bus_alloc_stream_pages() Zhao Dongdong
2026-07-07 14:16 ` Takashi Iwai
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox