FAILED: patch "[PATCH] ASoC: qcom: q6apm-lpass-dais: Fix NULL pointer dereference if" failed to apply to 6.1-stable tree
Subsystems (4)
[email protected]
maintainerThe patch below does not apply to the 6.1-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-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x 68f27f7c7708183e7873c585ded2f1b057ac5b97
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2025092104-booting-overstate-c9cf@gregkh' --subject-prefix 'PATCH 6.1.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 68f27f7c7708183e7873c585ded2f1b057ac5b97 Mon Sep 17 00:00:00 2001
From: Krzysztof Kozlowski <[email protected]>
Date: Thu, 4 Sep 2025 12:18:50 +0200
Subject: [PATCH] ASoC: qcom: q6apm-lpass-dais: Fix NULL pointer dereference if
source graph failed
If earlier opening of source graph fails (e.g. ADSP rejects due to incorrect audioreach topology), the graph is closed and "dai_data->graph[dai->id]" is assigned NULL. Preparing the DAI for sink graph continues though and next call to q6apm_lpass_dai_prepare() receives dai_data->graph[dai->id]=NULL leading to NULL pointer exception:
qcom-apm gprsvc:service:2:1: Error (1) Processing 0x01001002 cmd
qcom-apm gprsvc:service:2:1: DSP returned error[1001002] 1
q6apm-lpass-dais 30000000.remoteproc:glink-edge:gpr:service@1:bedais: fail to start APM port 78
q6apm-lpass-dais 30000000.remoteproc:glink-edge:gpr:service@1:bedais: ASoC: error at snd_soc_pcm_dai_prepare on TX_CODEC_DMA_TX_3: -22
Unable to handle kernel NULL pointer dereference at virtual address 00000000000000a8 ... Call trace: q6apm_graph_media_format_pcm+0x48/0x120 (P) q6apm_lpass_dai_prepare+0x110/0x1b4 snd_soc_pcm_dai_prepare+0x74/0x108 __soc_pcm_prepare+0x44/0x160 dpcm_be_dai_prepare+0x124/0x1c0
Message-ID: <[email protected]>
sound/soc/qcom/qdsp6/q6apm-lpass-dais.c +4 -2
@@ -213,8 +213,10 @@ static int q6apm_lpass_dai_prepare(struct snd_pcm_substream *substream, struct sreturn 0 ; err: -q6apm_graph_close (dai_data->graph[dai->id]); - dai_data->graph[dai->id] =NULL ; +if (substream->stream ==SNDRV_PCM_STREAM_PLAYBACK ) { +q6apm_graph_close (dai_data->graph[dai->id]); + dai_data->graph[dai->id] =NULL ; + }return rc; }
Sasha Levin
maintainerPATCH 1/3 ASoC: qcom: q6apm-lpass-dai: close graphs before opening a new one
From: Srinivas Kandagatla <[email protected]>
[ Upstream commit c52615e494f17f44b076ac8ae5a53cfc0041a0dd ]
On multiple prepare calls, its possible that the playback graphs are not unloaded from the DSP, which can have some wierd side-effects, one of them is that the data not consumed without any errors.
Stable-dep-of: 68f27f7c7708 ("ASoC: qcom: q6apm-lpass-dais: Fix NULL pointer dereference if source graph failed")
--- sound/soc/qcom/qdsp6/q6apm-lpass-dais.c | 3 +++ 1 file changed, 3 insertions(+)
sound/soc/qcom/qdsp6/q6apm-lpass-dais.c +3 -0
@@ -130,6 +130,9 @@ static int q6apm_lpass_dai_prepare(struct snd_pcm_substream *substream, struct sif (dai_data->is_port_started[dai->id]) {q6apm_graph_stop (dai_data->graph[dai->id]); dai_data->is_port_started[dai->id] = false; + +if (substream->stream ==SNDRV_PCM_STREAM_PLAYBACK ) +q6apm_graph_close (dai_data->graph[dai->id]); }/**
Signature · 1 line
2.51.0
Sasha Levin
maintainerPATCH 2/3 ASoC: q6apm-lpass-dai: close graph on prepare errors
From: Srinivas Kandagatla <[email protected]>
[ Upstream commit be1fae62cf253a5b67526cee9fbc07689b97c125 ]
There is an issue around with error handling and graph management with the exising code, none of the error paths close the graph, which result in leaving the loaded graph in dsp, however the driver thinks otherwise.
This can have a nasty side effect specially when we try to load the same graph to dsp, dsp returns error which leaves the board with no sound and requires restart.
Fix this by properly closing the graph when we hit errors between open and close.
Stable-dep-of: 68f27f7c7708 ("ASoC: qcom: q6apm-lpass-dais: Fix NULL pointer dereference if source graph failed")
--- sound/soc/qcom/qdsp6/q6apm-lpass-dais.c | 32 +++++++++++++++---------- 1 file changed, 20 insertions(+), 12 deletions(-)
sound/soc/qcom/qdsp6/q6apm-lpass-dais.c +20 -12
@@ -109,14 +109,17 @@ static void q6apm_lpass_dai_shutdown(struct snd_pcm_substream *substream, structstruct q6apm_lpass_dai_data *dai_data =dev_get_drvdata (dai->dev);int rc; -if (!dai_data->is_port_started[dai->id]) -return ; - rc =q6apm_graph_stop (dai_data->graph[dai->id]); -if (rc <0 ) -dev_err (dai->dev,"fail to close APM port (%d)\n" , rc); +if (dai_data->is_port_started[dai->id]) { + rc =q6apm_graph_stop (dai_data->graph[dai->id]); + dai_data->is_port_started[dai->id] = false; +if (rc <0 ) +dev_err (dai->dev,"fail to close APM port (%d)\n" , rc); + } -q6apm_graph_close (dai_data->graph[dai->id]); - dai_data->is_port_started[dai->id] = false; +if (dai_data->graph[dai->id]) { +q6apm_graph_close (dai_data->graph[dai->id]); + dai_data->graph[dai->id] =NULL ; + } }static int q6apm_lpass_dai_prepare (struct snd_pcm_substream *substream,struct snd_soc_dai *dai)
@@ -131,8 +134,10 @@ static int q6apm_lpass_dai_prepare(struct snd_pcm_substream *substream, struct sq6apm_graph_stop (dai_data->graph[dai->id]); dai_data->is_port_started[dai->id] = false; -if (substream->stream ==SNDRV_PCM_STREAM_PLAYBACK ) +if (substream->stream ==SNDRV_PCM_STREAM_PLAYBACK ) {q6apm_graph_close (dai_data->graph[dai->id]); + dai_data->graph[dai->id] =NULL ; + } }/**
@@ -151,26 +156,29 @@ static int q6apm_lpass_dai_prepare(struct snd_pcm_substream *substream, struct s cfg->direction = substream->stream; rc =q6apm_graph_media_format_pcm (dai_data->graph[dai->id], cfg); -if (rc) {dev_err (dai->dev,"Failed to set media format %d\n" , rc); -return rc; + goto err; } rc =q6apm_graph_prepare (dai_data->graph[dai->id]);if (rc) {dev_err (dai->dev,"Failed to prepare Graph %d\n" , rc); -return rc; + goto err; } rc =q6apm_graph_start (dai_data->graph[dai->id]);if (rc <0 ) {dev_err (dai->dev,"fail to start APM port %x\n" , dai->id); -return rc; + goto err; } dai_data->is_port_started[dai->id] = true;return 0 ; +err: +q6apm_graph_close (dai_data->graph[dai->id]); + dai_data->graph[dai->id] =NULL ; +return rc; }static int q6apm_lpass_dai_startup (struct snd_pcm_substream *substream,struct snd_soc_dai *dai)
Signature · 1 line
2.51.0
Sasha Levin
maintainerPATCH 3/3 ASoC: qcom: q6apm-lpass-dais: Fix NULL pointer dereference if source graph failed
In reply to Sasha LevinFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 68f27f7c7708183e7873c585ded2f1b057ac5b97 ]
If earlier opening of source graph fails (e.g. ADSP rejects due to incorrect audioreach topology), the graph is closed and "dai_data->graph[dai->id]" is assigned NULL. Preparing the DAI for sink graph continues though and next call to q6apm_lpass_dai_prepare() receives dai_data->graph[dai->id]=NULL leading to NULL pointer exception:
qcom-apm gprsvc:service:2:1: Error (1) Processing 0x01001002 cmd
qcom-apm gprsvc:service:2:1: DSP returned error[1001002] 1
q6apm-lpass-dais 30000000.remoteproc:glink-edge:gpr:service@1:bedais: fail to start APM port 78
q6apm-lpass-dais 30000000.remoteproc:glink-edge:gpr:service@1:bedais: ASoC: error at snd_soc_pcm_dai_prepare on TX_CODEC_DMA_TX_3: -22
Unable to handle kernel NULL pointer dereference at virtual address 00000000000000a8 ... Call trace: q6apm_graph_media_format_pcm+0x48/0x120 (P) q6apm_lpass_dai_prepare+0x110/0x1b4 snd_soc_pcm_dai_prepare+0x74/0x108 __soc_pcm_prepare+0x44/0x160 dpcm_be_dai_prepare+0x124/0x1c0
Message-ID: <[email protected]>
--- sound/soc/qcom/qdsp6/q6apm-lpass-dais.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
sound/soc/qcom/qdsp6/q6apm-lpass-dais.c +4 -2
@@ -176,8 +176,10 @@ static int q6apm_lpass_dai_prepare(struct snd_pcm_substream *substream, struct sreturn 0 ; err: -q6apm_graph_close (dai_data->graph[dai->id]); - dai_data->graph[dai->id] =NULL ; +if (substream->stream ==SNDRV_PCM_STREAM_PLAYBACK ) { +q6apm_graph_close (dai_data->graph[dai->id]); + dai_data->graph[dai->id] =NULL ; + }return rc; }
Signature · 1 line
2.51.0