2019-04-26 16:49:12

by Ross Zwisler

[permalink] [raw]
Subject: [PATCH] ASoC: Intel: avoid Oops if DMA setup fails

Currently in sst_dsp_new() if we get an error return from sst_dma_new()
we just print an error message and then still complete the function
successfully. This means that we are trying to run without sst->dma
properly set up, which will result in NULL pointer dereference when
sst->dma is later used. This was happening for me in
sst_dsp_dma_get_channel():

struct sst_dma *dma = dsp->dma;
...
dma->ch = dma_request_channel(mask, dma_chan_filter, dsp);

This resulted in:

BUG: unable to handle kernel NULL pointer dereference at 0000000000000018
IP: sst_dsp_dma_get_channel+0x4f/0x125 [snd_soc_sst_firmware]

Fix this by adding proper error handling for the case where we fail to
set up DMA.

Signed-off-by: Ross Zwisler <[email protected]>
Cc: [email protected]
---
sound/soc/intel/common/sst-firmware.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/sound/soc/intel/common/sst-firmware.c b/sound/soc/intel/common/sst-firmware.c
index 1e067504b6043..9be3a793a55e3 100644
--- a/sound/soc/intel/common/sst-firmware.c
+++ b/sound/soc/intel/common/sst-firmware.c
@@ -1251,11 +1251,15 @@ struct sst_dsp *sst_dsp_new(struct device *dev,
goto irq_err;

err = sst_dma_new(sst);
- if (err)
+ if (err) {
dev_warn(dev, "sst_dma_new failed %d\n", err);
+ goto dma_err;
+ }

return sst;

+dma_err:
+ free_irq(sst->irq, sst);
irq_err:
if (sst->ops->free)
sst->ops->free(sst);
--
2.21.0.593.g511ec345e18-goog


2019-04-26 21:07:01

by Pierre-Louis Bossart

[permalink] [raw]
Subject: Re: [PATCH] ASoC: Intel: avoid Oops if DMA setup fails

On 4/26/19 11:47 AM, Ross Zwisler wrote:
> Currently in sst_dsp_new() if we get an error return from sst_dma_new()
> we just print an error message and then still complete the function
> successfully. This means that we are trying to run without sst->dma
> properly set up, which will result in NULL pointer dereference when
> sst->dma is later used. This was happening for me in
> sst_dsp_dma_get_channel():
>
> struct sst_dma *dma = dsp->dma;
> ...
> dma->ch = dma_request_channel(mask, dma_chan_filter, dsp);
>
> This resulted in:
>
> BUG: unable to handle kernel NULL pointer dereference at 0000000000000018
> IP: sst_dsp_dma_get_channel+0x4f/0x125 [snd_soc_sst_firmware]
>
> Fix this by adding proper error handling for the case where we fail to
> set up DMA.
>
> Signed-off-by: Ross Zwisler <[email protected]>
> Cc: [email protected]
> ---
> sound/soc/intel/common/sst-firmware.c | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/sound/soc/intel/common/sst-firmware.c b/sound/soc/intel/common/sst-firmware.c
> index 1e067504b6043..9be3a793a55e3 100644
> --- a/sound/soc/intel/common/sst-firmware.c
> +++ b/sound/soc/intel/common/sst-firmware.c
> @@ -1251,11 +1251,15 @@ struct sst_dsp *sst_dsp_new(struct device *dev,
> goto irq_err;
>
> err = sst_dma_new(sst);
> - if (err)
> + if (err) {
> dev_warn(dev, "sst_dma_new failed %d\n", err);
> + goto dma_err;
> + }

Thanks for the patch.
The fix looks correct, but does it make sense to keep a dev_warn() here?
Should it be changed to dev_err() instead since as you mentioned it's
fatal to keep going.
Also you may want to mention in the commit message that this should only
impact Broadwell and maybe the legacy Baytrail driver. IIRC we don't use
the DMAs in other cases.

>
> return sst;
>
> +dma_err:
> + free_irq(sst->irq, sst);
> irq_err:
> if (sst->ops->free)
> sst->ops->free(sst);
>

2019-04-29 17:03:40

by Ross Zwisler

[permalink] [raw]
Subject: Re: [PATCH] ASoC: Intel: avoid Oops if DMA setup fails

On Fri, Apr 26, 2019 at 04:03:47PM -0500, Pierre-Louis Bossart wrote:
> On 4/26/19 11:47 AM, Ross Zwisler wrote:
> > Currently in sst_dsp_new() if we get an error return from sst_dma_new()
> > we just print an error message and then still complete the function
> > successfully. This means that we are trying to run without sst->dma
> > properly set up, which will result in NULL pointer dereference when
> > sst->dma is later used. This was happening for me in
> > sst_dsp_dma_get_channel():
> >
> > struct sst_dma *dma = dsp->dma;
> > ...
> > dma->ch = dma_request_channel(mask, dma_chan_filter, dsp);
> >
> > This resulted in:
> >
> > BUG: unable to handle kernel NULL pointer dereference at 0000000000000018
> > IP: sst_dsp_dma_get_channel+0x4f/0x125 [snd_soc_sst_firmware]
> >
> > Fix this by adding proper error handling for the case where we fail to
> > set up DMA.
> >
> > Signed-off-by: Ross Zwisler <[email protected]>
> > Cc: [email protected]
> > ---
> > sound/soc/intel/common/sst-firmware.c | 6 +++++-
> > 1 file changed, 5 insertions(+), 1 deletion(-)
> >
> > diff --git a/sound/soc/intel/common/sst-firmware.c b/sound/soc/intel/common/sst-firmware.c
> > index 1e067504b6043..9be3a793a55e3 100644
> > --- a/sound/soc/intel/common/sst-firmware.c
> > +++ b/sound/soc/intel/common/sst-firmware.c
> > @@ -1251,11 +1251,15 @@ struct sst_dsp *sst_dsp_new(struct device *dev,
> > goto irq_err;
> > err = sst_dma_new(sst);
> > - if (err)
> > + if (err) {
> > dev_warn(dev, "sst_dma_new failed %d\n", err);
> > + goto dma_err;
> > + }
>
> Thanks for the patch.
> The fix looks correct, but does it make sense to keep a dev_warn() here?
> Should it be changed to dev_err() instead since as you mentioned it's fatal
> to keep going.
> Also you may want to mention in the commit message that this should only
> impact Broadwell and maybe the legacy Baytrail driver. IIRC we don't use the
> DMAs in other cases.

Sure, I'll address both of these in a v2. Thank you for the quick review.

2019-04-29 18:27:00

by Ross Zwisler

[permalink] [raw]
Subject: [PATCH v2] ASoC: Intel: avoid Oops if DMA setup fails

Currently in sst_dsp_new() if we get an error return from sst_dma_new()
we just print an error message and then still complete the function
successfully. This means that we are trying to run without sst->dma
properly set up, which will result in NULL pointer dereference when
sst->dma is later used. This was happening for me in
sst_dsp_dma_get_channel():

struct sst_dma *dma = dsp->dma;
...
dma->ch = dma_request_channel(mask, dma_chan_filter, dsp);

This resulted in:

BUG: unable to handle kernel NULL pointer dereference at 0000000000000018
IP: sst_dsp_dma_get_channel+0x4f/0x125 [snd_soc_sst_firmware]

Fix this by adding proper error handling for the case where we fail to
set up DMA.

This change only affects Haswell and Broadwell systems. Baytrail
systems explicilty opt-out of DMA via sst->pdata->resindex_dma_base
being set to -1.

Signed-off-by: Ross Zwisler <[email protected]>
Cc: [email protected]
---

Changes in v2:
- Upgraded the sst_dma_new() failure message from dev_warn() to dev_err()
(Pierre-Louis).
- Noted in the changelog that this change only affects Haswell and
Broadwell (Pierre-Louis).

---
sound/soc/intel/common/sst-firmware.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/sound/soc/intel/common/sst-firmware.c b/sound/soc/intel/common/sst-firmware.c
index 1e067504b6043..f830e59f93eaa 100644
--- a/sound/soc/intel/common/sst-firmware.c
+++ b/sound/soc/intel/common/sst-firmware.c
@@ -1251,11 +1251,15 @@ struct sst_dsp *sst_dsp_new(struct device *dev,
goto irq_err;

err = sst_dma_new(sst);
- if (err)
- dev_warn(dev, "sst_dma_new failed %d\n", err);
+ if (err) {
+ dev_err(dev, "sst_dma_new failed %d\n", err);
+ goto dma_err;
+ }

return sst;

+dma_err:
+ free_irq(sst->irq, sst);
irq_err:
if (sst->ops->free)
sst->ops->free(sst);
--
2.21.0.593.g511ec345e18-goog

2019-04-29 18:28:23

by Ross Zwisler

[permalink] [raw]
Subject: Re: [PATCH] ASoC: Intel: avoid Oops if DMA setup fails

On Fri, Apr 26, 2019 at 06:52:45PM +0000, Sasha Levin wrote:
> Hi,
>
> [This is an automated email]
>
> This commit has been processed because it contains a -stable tag.
> The stable tag indicates that it's relevant for the following trees: all
>
> The bot has tested the following trees: v5.0.9, v4.19.36, v4.14.113, v4.9.170, v4.4.178, v3.18.138.
>
> v5.0.9: Build OK!
> v4.19.36: Build OK!
> v4.14.113: Build OK!
> v4.9.170: Build OK!
> v4.4.178: Failed to apply! Possible dependencies:
> 2bd5bd15a518 ("ASoC: Intel: add bytct-rt5651 machine driver")
> 2dcffcee23a2 ("ASoC: Intel: Create independent acpi match module")
> 595788e475d0 ("ASoC: Intel: tag byt-rt5640 machine driver as deprecated")
> 95f098014815 ("ASoC: Intel: Move apci find machine routines")
> a395bdd6b24b ("ASoC: intel: Fix sst-dsp dependency on dw stuff")
> a92ea59b74e2 ("ASoC: Intel: sst: only select sst-firmware when DW DMAC is built-in")
> cfffcc66a89a ("ASoC: Intel: Load the atom DPCM driver only")
>
> v3.18.138: Failed to apply! Possible dependencies:
> 0d2135ecadb0 ("ASoC: Intel: Work around to fix HW D3 potential crash issue")
> 13735d1cecec ("ASoC: intel - kconfig: remove SND_SOC_INTEL_SST prompt")
> 161aa49ef1b9 ("ASoC: Intel: Add new dependency for Haswell machine")
> 2106241a6803 ("ASoC: Intel: create common folder and move common files in")
> 282a331fe25c ("ASoC: Intel: Add new dependency for Broadwell machine")
> 2e4f75919e5a ("ASoC: Intel: Add PM support to HSW/BDW PCM driver")
> 34084a436703 ("ASoC: intel: Remove superfluous backslash in Kconfig")
> 544c55c810a5 ("ASoC: Intel: Delete an unnecessary check before the function call "sst_dma_free"")
> 63ae1fe7739e ("ASoC: Intel: Add dependency on DesignWare DMA controller")
> 7dd6bd8926f3 ("ASoC: intel: kconfig - Move DW_DMAC_CORE dependency to machines")
> 85b88a8dd0c7 ("ASoC: Intel: Store the entry_point read from FW file")
> 9449d39b990d ("ASoC: Intel: add function to load firmware image")
> a395bdd6b24b ("ASoC: intel: Fix sst-dsp dependency on dw stuff")
> a92ea59b74e2 ("ASoC: Intel: sst: only select sst-firmware when DW DMAC is built-in")
> aed3c7b77c85 ("ASoC: Intel: Add PM support to HSW/BDW IPC driver")
> d96c53a193dd ("ASoC: Intel: Add generic support for DSP wake, sleep and stall")
> e9600bc166d5 ("ASoC: Intel: Make ADSP memory block allocation more generic")
>
>
> How should we proceed with this patch?

After reviews I'll send backport patches for v4.4.X and v3.18.X as necessary.

2019-04-29 18:46:59

by Pierre-Louis Bossart

[permalink] [raw]
Subject: Re: [PATCH v2] ASoC: Intel: avoid Oops if DMA setup fails

On 4/29/19 1:25 PM, Ross Zwisler wrote:
> Currently in sst_dsp_new() if we get an error return from sst_dma_new()
> we just print an error message and then still complete the function
> successfully. This means that we are trying to run without sst->dma
> properly set up, which will result in NULL pointer dereference when
> sst->dma is later used. This was happening for me in
> sst_dsp_dma_get_channel():
>
> struct sst_dma *dma = dsp->dma;
> ...
> dma->ch = dma_request_channel(mask, dma_chan_filter, dsp);
>
> This resulted in:
>
> BUG: unable to handle kernel NULL pointer dereference at 0000000000000018
> IP: sst_dsp_dma_get_channel+0x4f/0x125 [snd_soc_sst_firmware]
>
> Fix this by adding proper error handling for the case where we fail to
> set up DMA.
>
> This change only affects Haswell and Broadwell systems. Baytrail
> systems explicilty opt-out of DMA via sst->pdata->resindex_dma_base
> being set to -1.
>
> Signed-off-by: Ross Zwisler <[email protected]>
> Cc: [email protected]

Acked-by: Pierre-Louis Bossart <[email protected]>

Thanks Ross!

FWIW we should start deprecating this driver now and transition to SOF.
I'll double-check how the upcoming 1.3 release works on my Pixel
2015/Samus device later this week.


> ---
>
> Changes in v2:
> - Upgraded the sst_dma_new() failure message from dev_warn() to dev_err()
> (Pierre-Louis).
> - Noted in the changelog that this change only affects Haswell and
> Broadwell (Pierre-Louis).
>
> ---
> sound/soc/intel/common/sst-firmware.c | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/sound/soc/intel/common/sst-firmware.c b/sound/soc/intel/common/sst-firmware.c
> index 1e067504b6043..f830e59f93eaa 100644
> --- a/sound/soc/intel/common/sst-firmware.c
> +++ b/sound/soc/intel/common/sst-firmware.c
> @@ -1251,11 +1251,15 @@ struct sst_dsp *sst_dsp_new(struct device *dev,
> goto irq_err;
>
> err = sst_dma_new(sst);
> - if (err)
> - dev_warn(dev, "sst_dma_new failed %d\n", err);
> + if (err) {
> + dev_err(dev, "sst_dma_new failed %d\n", err);
> + goto dma_err;
> + }
>
> return sst;
>
> +dma_err:
> + free_irq(sst->irq, sst);
> irq_err:
> if (sst->ops->free)
> sst->ops->free(sst);
>

2019-05-03 05:27:23

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH v2] ASoC: Intel: avoid Oops if DMA setup fails

On Mon, Apr 29, 2019 at 12:25:17PM -0600, Ross Zwisler wrote:
> Currently in sst_dsp_new() if we get an error return from sst_dma_new()
> we just print an error message and then still complete the function
> successfully. This means that we are trying to run without sst->dma

Please don't bury patches in the replies to existing threads, it makes
it harder to spot them.


Attachments:
(No filename) (380.00 B)
signature.asc (499.00 B)
Download all attachments

2019-05-03 06:22:34

by Mark Brown

[permalink] [raw]
Subject: Applied "ASoC: Intel: avoid Oops if DMA setup fails" to the asoc tree

The patch

ASoC: Intel: avoid Oops if DMA setup fails

has been applied to the asoc tree at

https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-5.2

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

From 0efa3334d65b7f421ba12382dfa58f6ff5bf83c4 Mon Sep 17 00:00:00 2001
From: Ross Zwisler <[email protected]>
Date: Mon, 29 Apr 2019 12:25:17 -0600
Subject: [PATCH] ASoC: Intel: avoid Oops if DMA setup fails

Currently in sst_dsp_new() if we get an error return from sst_dma_new()
we just print an error message and then still complete the function
successfully. This means that we are trying to run without sst->dma
properly set up, which will result in NULL pointer dereference when
sst->dma is later used. This was happening for me in
sst_dsp_dma_get_channel():

struct sst_dma *dma = dsp->dma;
...
dma->ch = dma_request_channel(mask, dma_chan_filter, dsp);

This resulted in:

BUG: unable to handle kernel NULL pointer dereference at 0000000000000018
IP: sst_dsp_dma_get_channel+0x4f/0x125 [snd_soc_sst_firmware]

Fix this by adding proper error handling for the case where we fail to
set up DMA.

This change only affects Haswell and Broadwell systems. Baytrail
systems explicilty opt-out of DMA via sst->pdata->resindex_dma_base
being set to -1.

Signed-off-by: Ross Zwisler <[email protected]>
Cc: [email protected]
Acked-by: Pierre-Louis Bossart <[email protected]>
Signed-off-by: Mark Brown <[email protected]>
---
sound/soc/intel/common/sst-firmware.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/sound/soc/intel/common/sst-firmware.c b/sound/soc/intel/common/sst-firmware.c
index 1e067504b604..f830e59f93ea 100644
--- a/sound/soc/intel/common/sst-firmware.c
+++ b/sound/soc/intel/common/sst-firmware.c
@@ -1251,11 +1251,15 @@ struct sst_dsp *sst_dsp_new(struct device *dev,
goto irq_err;

err = sst_dma_new(sst);
- if (err)
- dev_warn(dev, "sst_dma_new failed %d\n", err);
+ if (err) {
+ dev_err(dev, "sst_dma_new failed %d\n", err);
+ goto dma_err;
+ }

return sst;

+dma_err:
+ free_irq(sst->irq, sst);
irq_err:
if (sst->ops->free)
sst->ops->free(sst);
--
2.20.1

2019-05-03 07:24:12

by Mark Brown

[permalink] [raw]
Subject: Applied "ASoC: Intel: avoid Oops if DMA setup fails" to the asoc tree

The patch

ASoC: Intel: avoid Oops if DMA setup fails

has been applied to the asoc tree at

https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-5.2

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

From 0efa3334d65b7f421ba12382dfa58f6ff5bf83c4 Mon Sep 17 00:00:00 2001
From: Ross Zwisler <[email protected]>
Date: Mon, 29 Apr 2019 12:25:17 -0600
Subject: [PATCH] ASoC: Intel: avoid Oops if DMA setup fails

Currently in sst_dsp_new() if we get an error return from sst_dma_new()
we just print an error message and then still complete the function
successfully. This means that we are trying to run without sst->dma
properly set up, which will result in NULL pointer dereference when
sst->dma is later used. This was happening for me in
sst_dsp_dma_get_channel():

struct sst_dma *dma = dsp->dma;
...
dma->ch = dma_request_channel(mask, dma_chan_filter, dsp);

This resulted in:

BUG: unable to handle kernel NULL pointer dereference at 0000000000000018
IP: sst_dsp_dma_get_channel+0x4f/0x125 [snd_soc_sst_firmware]

Fix this by adding proper error handling for the case where we fail to
set up DMA.

This change only affects Haswell and Broadwell systems. Baytrail
systems explicilty opt-out of DMA via sst->pdata->resindex_dma_base
being set to -1.

Signed-off-by: Ross Zwisler <[email protected]>
Cc: [email protected]
Acked-by: Pierre-Louis Bossart <[email protected]>
Signed-off-by: Mark Brown <[email protected]>
---
sound/soc/intel/common/sst-firmware.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/sound/soc/intel/common/sst-firmware.c b/sound/soc/intel/common/sst-firmware.c
index 1e067504b604..f830e59f93ea 100644
--- a/sound/soc/intel/common/sst-firmware.c
+++ b/sound/soc/intel/common/sst-firmware.c
@@ -1251,11 +1251,15 @@ struct sst_dsp *sst_dsp_new(struct device *dev,
goto irq_err;

err = sst_dma_new(sst);
- if (err)
- dev_warn(dev, "sst_dma_new failed %d\n", err);
+ if (err) {
+ dev_err(dev, "sst_dma_new failed %d\n", err);
+ goto dma_err;
+ }

return sst;

+dma_err:
+ free_irq(sst->irq, sst);
irq_err:
if (sst->ops->free)
sst->ops->free(sst);
--
2.20.1

2019-05-03 07:25:32

by Mark Brown

[permalink] [raw]
Subject: Applied "ASoC: Intel: avoid Oops if DMA setup fails" to the asoc tree

The patch

ASoC: Intel: avoid Oops if DMA setup fails

has been applied to the asoc tree at

https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-5.2

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

From 0efa3334d65b7f421ba12382dfa58f6ff5bf83c4 Mon Sep 17 00:00:00 2001
From: Ross Zwisler <[email protected]>
Date: Mon, 29 Apr 2019 12:25:17 -0600
Subject: [PATCH] ASoC: Intel: avoid Oops if DMA setup fails

Currently in sst_dsp_new() if we get an error return from sst_dma_new()
we just print an error message and then still complete the function
successfully. This means that we are trying to run without sst->dma
properly set up, which will result in NULL pointer dereference when
sst->dma is later used. This was happening for me in
sst_dsp_dma_get_channel():

struct sst_dma *dma = dsp->dma;
...
dma->ch = dma_request_channel(mask, dma_chan_filter, dsp);

This resulted in:

BUG: unable to handle kernel NULL pointer dereference at 0000000000000018
IP: sst_dsp_dma_get_channel+0x4f/0x125 [snd_soc_sst_firmware]

Fix this by adding proper error handling for the case where we fail to
set up DMA.

This change only affects Haswell and Broadwell systems. Baytrail
systems explicilty opt-out of DMA via sst->pdata->resindex_dma_base
being set to -1.

Signed-off-by: Ross Zwisler <[email protected]>
Cc: [email protected]
Acked-by: Pierre-Louis Bossart <[email protected]>
Signed-off-by: Mark Brown <[email protected]>
---
sound/soc/intel/common/sst-firmware.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/sound/soc/intel/common/sst-firmware.c b/sound/soc/intel/common/sst-firmware.c
index 1e067504b604..f830e59f93ea 100644
--- a/sound/soc/intel/common/sst-firmware.c
+++ b/sound/soc/intel/common/sst-firmware.c
@@ -1251,11 +1251,15 @@ struct sst_dsp *sst_dsp_new(struct device *dev,
goto irq_err;

err = sst_dma_new(sst);
- if (err)
- dev_warn(dev, "sst_dma_new failed %d\n", err);
+ if (err) {
+ dev_err(dev, "sst_dma_new failed %d\n", err);
+ goto dma_err;
+ }

return sst;

+dma_err:
+ free_irq(sst->irq, sst);
irq_err:
if (sst->ops->free)
sst->ops->free(sst);
--
2.20.1

2019-05-03 19:52:21

by Ross Zwisler

[permalink] [raw]
Subject: [linux-4.4.y PATCH] ASoC: Intel: avoid Oops if DMA setup fails

From: Ross Zwisler <[email protected]>

commit 0efa3334d65b7f421ba12382dfa58f6ff5bf83c4 upstream.

Currently in sst_dsp_new() if we get an error return from sst_dma_new()
we just print an error message and then still complete the function
successfully. This means that we are trying to run without sst->dma
properly set up, which will result in NULL pointer dereference when
sst->dma is later used. This was happening for me in
sst_dsp_dma_get_channel():

struct sst_dma *dma = dsp->dma;
...
dma->ch = dma_request_channel(mask, dma_chan_filter, dsp);

This resulted in:

BUG: unable to handle kernel NULL pointer dereference at 0000000000000018
IP: sst_dsp_dma_get_channel+0x4f/0x125 [snd_soc_sst_firmware]

Fix this by adding proper error handling for the case where we fail to
set up DMA.

This change only affects Haswell and Broadwell systems. Baytrail
systems explicilty opt-out of DMA via sst->pdata->resindex_dma_base
being set to -1.

Signed-off-by: Ross Zwisler <[email protected]>
Cc: [email protected]
Acked-by: Pierre-Louis Bossart <[email protected]>
Signed-off-by: Mark Brown <[email protected]>
---

The upstream patch applied cleanly to all stable trees except
linux-4.4.y and linux-3.18.y. This is the backport for linux-4.4.y, and
the code I'm fixing was introduced in v4.0 so there is no need for a
linux-3.18.y backport.

The upstream patch is currently in Mark Brown's tree:

https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git/log/?h=for-next

Is that good enough, or should I resend after it's been merged in the
v5.2 merge window?

---
sound/soc/intel/common/sst-dsp.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/sound/soc/intel/common/sst-dsp.c b/sound/soc/intel/common/sst-dsp.c
index c9452e02e0dda..c0a50ecb6dbda 100644
--- a/sound/soc/intel/common/sst-dsp.c
+++ b/sound/soc/intel/common/sst-dsp.c
@@ -463,11 +463,15 @@ struct sst_dsp *sst_dsp_new(struct device *dev,
goto irq_err;

err = sst_dma_new(sst);
- if (err)
- dev_warn(dev, "sst_dma_new failed %d\n", err);
+ if (err) {
+ dev_err(dev, "sst_dma_new failed %d\n", err);
+ goto dma_err;
+ }

return sst;

+dma_err:
+ free_irq(sst->irq, sst);
irq_err:
if (sst->ops->free)
sst->ops->free(sst);
--
2.21.0.1020.gf2820cf01a-goog

2019-05-05 13:40:44

by Greg Kroah-Hartman

[permalink] [raw]
Subject: Re: [linux-4.4.y PATCH] ASoC: Intel: avoid Oops if DMA setup fails

On Fri, May 03, 2019 at 01:45:03PM -0600, Ross Zwisler wrote:
> From: Ross Zwisler <[email protected]>
>
> commit 0efa3334d65b7f421ba12382dfa58f6ff5bf83c4 upstream.

This commit id is not in Linus's tree :(

2019-05-09 17:42:54

by Greg Kroah-Hartman

[permalink] [raw]
Subject: Re: [linux-4.4.y PATCH] ASoC: Intel: avoid Oops if DMA setup fails

On Sun, May 05, 2019 at 03:15:53PM +0200, Greg KH wrote:
> On Fri, May 03, 2019 at 01:45:03PM -0600, Ross Zwisler wrote:
> > From: Ross Zwisler <[email protected]>
> >
> > commit 0efa3334d65b7f421ba12382dfa58f6ff5bf83c4 upstream.
>
> This commit id is not in Linus's tree :(
>

Sorry for the noise, I didn't read your note :(

2019-05-09 18:12:26

by Ross Zwisler

[permalink] [raw]
Subject: Re: [linux-4.4.y PATCH] ASoC: Intel: avoid Oops if DMA setup fails

On Thu, May 09, 2019 at 07:41:47PM +0200, Greg KH wrote:
> On Sun, May 05, 2019 at 03:15:53PM +0200, Greg KH wrote:
> > On Fri, May 03, 2019 at 01:45:03PM -0600, Ross Zwisler wrote:
> > > From: Ross Zwisler <[email protected]>
> > >
> > > commit 0efa3334d65b7f421ba12382dfa58f6ff5bf83c4 upstream.
> >
> > This commit id is not in Linus's tree :(
> >
>
> Sorry for the noise, I didn't read your note :(

No worries, sorry for sending early. I'll wait until after it's merged next
time. :) Thanks for pulling it in.