[alsa-devel] [bug report] ASoC: rsnd: Request/Release DMA channel each time
Kuninori Morimoto
kuninori.morimoto.gx at renesas.com
Mon Nov 6 01:02:03 CET 2017
Hi Dan
> sound/soc/sh/rcar/dma.c
> 192 static int rsnd_dmaen_nolock_start(struct rsnd_mod *mod,
> 193 struct rsnd_dai_stream *io,
> 194 struct rsnd_priv *priv)
> 195 {
> 196 struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
> 197 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
> 198 struct device *dev = rsnd_priv_to_dev(priv);
> 199
> 200 if (dmaen->chan) {
> 201 dev_err(dev, "it already has dma channel\n");
> 202 return -EIO;
> 203 }
> 204
> 205 /*
> 206 * DMAEngine request uses mutex lock.
> 207 * Thus, it shouldn't be called under spinlock.
> 208 * Let's call it under nolock_start
> 209 */
> 210 dmaen->chan = rsnd_dmaen_request_channel(io,
> 211 dma->mod_from,
> 212 dma->mod_to);
> 213 if (IS_ERR_OR_NULL(dmaen->chan)) {
> 214 int ret = PTR_ERR(dmaen->chan);
> 215
> 216 dmaen->chan = NULL;
> 217 dev_err(dev, "can't get dma channel\n");
> 218 return ret;
>
> PTR_ERR(NULL) is success. Normally when a function returns both NULL
> and error pointers, it means that NULL is not a error. For example,
> you call get_some_resource_pointer() and it returns NULL because your
> computer doesn't have one of those resources plugged in, but it returns
> an error pointer if it's defective or you're out of memory or whatever.
> In this case it really feels like NULL is returned on error so the right
> fix is to make rsnd_dmaen_request_channel() never return NULL and never
> be checked for NULL.
Thank you for your report.
Indeed, I will send fixup patch today.
Best regards
---
Kuninori Morimoto
More information about the Alsa-devel
mailing list