[alsa-devel] [bug report] ASoC: rsnd: Request/Release DMA channel each time

Dan Carpenter dan.carpenter at oracle.com
Thu Nov 2 09:09:31 CET 2017


Hello Kuninori Morimoto,

The patch edce5c496c6a: "ASoC: rsnd: Request/Release DMA channel each
time" from Nov 14, 2016, leads to the following static checker
warning:

	sound/soc/sh/rcar/dma.c:214 rsnd_dmaen_nolock_start()
	warn: passing zero to 'PTR_ERR'

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.

   219          }
   220  
   221          return 0;
   222  }

regards,
dan carpenter


More information about the Alsa-devel mailing list