All of lore.kernel.org
 help / color / mirror / Atom feed
* [linux-next:master 1083/1266] drivers/dma/sun6i-dma.c:777 sun6i_dma_prep_slave_sg() error: dereferencing freed memory 'v_lli'
@ 2024-03-26 10:19 kernel test robot
  0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2024-03-26 10:19 UTC (permalink / raw)
  To: oe-kbuild; +Cc: lkp, Dan Carpenter

BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
CC: Linux Memory Management List <linux-mm@kvack.org>
TO: Suren Baghdasaryan <surenb@google.com>
CC: Andrew Morton <akpm@linux-foundation.org>
CC: Linux Memory Management List <linux-mm@kvack.org>
CC: Kent Overstreet <kent.overstreet@linux.dev>
CC: Kees Cook <keescook@chromium.org>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
head:   084c8e315db34b59d38d06e684b1a0dd07d30287
commit: c64e38ed88d13557ebeb4cb8def02390a8f3dfc4 [1083/1266] mm/slab: enable slab allocation tagging for kmalloc and friends
:::::: branch date: 5 hours ago
:::::: commit date: 3 days ago
config: m68k-randconfig-r071-20240326 (https://download.01.org/0day-ci/archive/20240326/202403261808.c8ovEmC1-lkp@intel.com/config)
compiler: m68k-linux-gcc (GCC) 13.2.0

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202403261808.c8ovEmC1-lkp@intel.com/

smatch warnings:
drivers/dma/sun6i-dma.c:777 sun6i_dma_prep_slave_sg() error: dereferencing freed memory 'v_lli'
drivers/dma/sun6i-dma.c:848 sun6i_dma_prep_dma_cyclic() error: dereferencing freed memory 'v_lli'

vim +/v_lli +777 drivers/dma/sun6i-dma.c

555859308723d8 Maxime Ripard       2014-07-17  699  
555859308723d8 Maxime Ripard       2014-07-17  700  static struct dma_async_tx_descriptor *sun6i_dma_prep_slave_sg(
555859308723d8 Maxime Ripard       2014-07-17  701  		struct dma_chan *chan, struct scatterlist *sgl,
555859308723d8 Maxime Ripard       2014-07-17  702  		unsigned int sg_len, enum dma_transfer_direction dir,
555859308723d8 Maxime Ripard       2014-07-17  703  		unsigned long flags, void *context)
555859308723d8 Maxime Ripard       2014-07-17  704  {
555859308723d8 Maxime Ripard       2014-07-17  705  	struct sun6i_dma_dev *sdev = to_sun6i_dma_dev(chan->device);
555859308723d8 Maxime Ripard       2014-07-17  706  	struct sun6i_vchan *vchan = to_sun6i_vchan(chan);
555859308723d8 Maxime Ripard       2014-07-17  707  	struct dma_slave_config *sconfig = &vchan->cfg;
555859308723d8 Maxime Ripard       2014-07-17  708  	struct sun6i_dma_lli *v_lli, *prev = NULL;
555859308723d8 Maxime Ripard       2014-07-17  709  	struct sun6i_desc *txd;
555859308723d8 Maxime Ripard       2014-07-17  710  	struct scatterlist *sg;
555859308723d8 Maxime Ripard       2014-07-17  711  	dma_addr_t p_lli;
52c871798ff84b Jean-Francois Moine 2016-04-22  712  	u32 lli_cfg;
555859308723d8 Maxime Ripard       2014-07-17  713  	int i, ret;
555859308723d8 Maxime Ripard       2014-07-17  714  
555859308723d8 Maxime Ripard       2014-07-17  715  	if (!sgl)
555859308723d8 Maxime Ripard       2014-07-17  716  		return NULL;
555859308723d8 Maxime Ripard       2014-07-17  717  
52c871798ff84b Jean-Francois Moine 2016-04-22  718  	ret = set_config(sdev, sconfig, dir, &lli_cfg);
52c871798ff84b Jean-Francois Moine 2016-04-22  719  	if (ret) {
52c871798ff84b Jean-Francois Moine 2016-04-22  720  		dev_err(chan2dev(chan), "Invalid DMA configuration\n");
52c871798ff84b Jean-Francois Moine 2016-04-22  721  		return NULL;
52c871798ff84b Jean-Francois Moine 2016-04-22  722  	}
52c871798ff84b Jean-Francois Moine 2016-04-22  723  
555859308723d8 Maxime Ripard       2014-07-17  724  	txd = kzalloc(sizeof(*txd), GFP_NOWAIT);
555859308723d8 Maxime Ripard       2014-07-17  725  	if (!txd)
555859308723d8 Maxime Ripard       2014-07-17  726  		return NULL;
555859308723d8 Maxime Ripard       2014-07-17  727  
555859308723d8 Maxime Ripard       2014-07-17  728  	for_each_sg(sgl, sg, sg_len, i) {
ec31c5c5949275 Samuel Holland      2022-04-24  729  		v_lli = dma_pool_alloc(sdev->pool, GFP_DMA32 | GFP_NOWAIT, &p_lli);
4fbd804e009ae9 Maxime Ripard       2014-07-30  730  		if (!v_lli)
4fbd804e009ae9 Maxime Ripard       2014-07-30  731  			goto err_lli_free;
555859308723d8 Maxime Ripard       2014-07-17  732  
52c871798ff84b Jean-Francois Moine 2016-04-22  733  		v_lli->len = sg_dma_len(sg);
52c871798ff84b Jean-Francois Moine 2016-04-22  734  		v_lli->para = NORMAL_WAIT;
555859308723d8 Maxime Ripard       2014-07-17  735  
52c871798ff84b Jean-Francois Moine 2016-04-22  736  		if (dir == DMA_MEM_TO_DEV) {
ec31c5c5949275 Samuel Holland      2022-04-24  737  			sun6i_dma_set_addr(sdev, v_lli,
ec31c5c5949275 Samuel Holland      2022-04-24  738  					   sg_dma_address(sg),
ec31c5c5949275 Samuel Holland      2022-04-24  739  					   sconfig->dst_addr);
802440bdf3b787 Jernej Skrabec      2019-05-27  740  			v_lli->cfg = lli_cfg;
67f34055118cb6 Jernej Skrabec      2019-05-27  741  			sdev->cfg->set_drq(&v_lli->cfg, DRQ_SDRAM, vchan->port);
802440bdf3b787 Jernej Skrabec      2019-05-27  742  			sdev->cfg->set_mode(&v_lli->cfg, LINEAR_MODE, IO_MODE);
555859308723d8 Maxime Ripard       2014-07-17  743  
555859308723d8 Maxime Ripard       2014-07-17  744  			dev_dbg(chan2dev(chan),
7f5e03e7367293 Vinod Koul          2014-07-28  745  				"%s; chan: %d, dest: %pad, src: %pad, len: %u. flags: 0x%08lx\n",
555859308723d8 Maxime Ripard       2014-07-17  746  				__func__, vchan->vc.chan.chan_id,
555859308723d8 Maxime Ripard       2014-07-17  747  				&sconfig->dst_addr, &sg_dma_address(sg),
555859308723d8 Maxime Ripard       2014-07-17  748  				sg_dma_len(sg), flags);
555859308723d8 Maxime Ripard       2014-07-17  749  
555859308723d8 Maxime Ripard       2014-07-17  750  		} else {
ec31c5c5949275 Samuel Holland      2022-04-24  751  			sun6i_dma_set_addr(sdev, v_lli,
ec31c5c5949275 Samuel Holland      2022-04-24  752  					   sconfig->src_addr,
ec31c5c5949275 Samuel Holland      2022-04-24  753  					   sg_dma_address(sg));
802440bdf3b787 Jernej Skrabec      2019-05-27  754  			v_lli->cfg = lli_cfg;
67f34055118cb6 Jernej Skrabec      2019-05-27  755  			sdev->cfg->set_drq(&v_lli->cfg, vchan->port, DRQ_SDRAM);
802440bdf3b787 Jernej Skrabec      2019-05-27  756  			sdev->cfg->set_mode(&v_lli->cfg, IO_MODE, LINEAR_MODE);
555859308723d8 Maxime Ripard       2014-07-17  757  
555859308723d8 Maxime Ripard       2014-07-17  758  			dev_dbg(chan2dev(chan),
7f5e03e7367293 Vinod Koul          2014-07-28  759  				"%s; chan: %d, dest: %pad, src: %pad, len: %u. flags: 0x%08lx\n",
555859308723d8 Maxime Ripard       2014-07-17  760  				__func__, vchan->vc.chan.chan_id,
555859308723d8 Maxime Ripard       2014-07-17  761  				&sg_dma_address(sg), &sconfig->src_addr,
555859308723d8 Maxime Ripard       2014-07-17  762  				sg_dma_len(sg), flags);
555859308723d8 Maxime Ripard       2014-07-17  763  		}
555859308723d8 Maxime Ripard       2014-07-17  764  
555859308723d8 Maxime Ripard       2014-07-17  765  		prev = sun6i_dma_lli_add(prev, v_lli, p_lli, txd);
555859308723d8 Maxime Ripard       2014-07-17  766  	}
555859308723d8 Maxime Ripard       2014-07-17  767  
555859308723d8 Maxime Ripard       2014-07-17  768  	dev_dbg(chan2dev(chan), "First: %pad\n", &txd->p_lli);
9aa48806edb8c3 Samuel Holland      2022-04-24  769  	for (p_lli = txd->p_lli, v_lli = txd->v_lli; v_lli;
9aa48806edb8c3 Samuel Holland      2022-04-24  770  	     p_lli = v_lli->p_lli_next, v_lli = v_lli->v_lli_next)
9aa48806edb8c3 Samuel Holland      2022-04-24  771  		sun6i_dma_dump_lli(vchan, v_lli, p_lli);
555859308723d8 Maxime Ripard       2014-07-17  772  
555859308723d8 Maxime Ripard       2014-07-17  773  	return vchan_tx_prep(&vchan->vc, &txd->vd, flags);
555859308723d8 Maxime Ripard       2014-07-17  774  
4fbd804e009ae9 Maxime Ripard       2014-07-30  775  err_lli_free:
9aa48806edb8c3 Samuel Holland      2022-04-24  776  	for (p_lli = txd->p_lli, v_lli = txd->v_lli; v_lli;
9aa48806edb8c3 Samuel Holland      2022-04-24 @777  	     p_lli = v_lli->p_lli_next, v_lli = v_lli->v_lli_next)
9aa48806edb8c3 Samuel Holland      2022-04-24  778  		dma_pool_free(sdev->pool, v_lli, p_lli);
4fbd804e009ae9 Maxime Ripard       2014-07-30  779  	kfree(txd);
555859308723d8 Maxime Ripard       2014-07-17  780  	return NULL;
555859308723d8 Maxime Ripard       2014-07-17  781  }
555859308723d8 Maxime Ripard       2014-07-17  782  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  783  static struct dma_async_tx_descriptor *sun6i_dma_prep_dma_cyclic(
a90e173f3faf29 Jean-Francois Moine 2016-04-28  784  					struct dma_chan *chan,
a90e173f3faf29 Jean-Francois Moine 2016-04-28  785  					dma_addr_t buf_addr,
a90e173f3faf29 Jean-Francois Moine 2016-04-28  786  					size_t buf_len,
a90e173f3faf29 Jean-Francois Moine 2016-04-28  787  					size_t period_len,
a90e173f3faf29 Jean-Francois Moine 2016-04-28  788  					enum dma_transfer_direction dir,
a90e173f3faf29 Jean-Francois Moine 2016-04-28  789  					unsigned long flags)
a90e173f3faf29 Jean-Francois Moine 2016-04-28  790  {
a90e173f3faf29 Jean-Francois Moine 2016-04-28  791  	struct sun6i_dma_dev *sdev = to_sun6i_dma_dev(chan->device);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  792  	struct sun6i_vchan *vchan = to_sun6i_vchan(chan);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  793  	struct dma_slave_config *sconfig = &vchan->cfg;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  794  	struct sun6i_dma_lli *v_lli, *prev = NULL;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  795  	struct sun6i_desc *txd;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  796  	dma_addr_t p_lli;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  797  	u32 lli_cfg;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  798  	unsigned int i, periods = buf_len / period_len;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  799  	int ret;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  800  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  801  	ret = set_config(sdev, sconfig, dir, &lli_cfg);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  802  	if (ret) {
a90e173f3faf29 Jean-Francois Moine 2016-04-28  803  		dev_err(chan2dev(chan), "Invalid DMA configuration\n");
a90e173f3faf29 Jean-Francois Moine 2016-04-28  804  		return NULL;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  805  	}
a90e173f3faf29 Jean-Francois Moine 2016-04-28  806  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  807  	txd = kzalloc(sizeof(*txd), GFP_NOWAIT);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  808  	if (!txd)
a90e173f3faf29 Jean-Francois Moine 2016-04-28  809  		return NULL;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  810  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  811  	for (i = 0; i < periods; i++) {
ec31c5c5949275 Samuel Holland      2022-04-24  812  		v_lli = dma_pool_alloc(sdev->pool, GFP_DMA32 | GFP_NOWAIT, &p_lli);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  813  		if (!v_lli) {
a90e173f3faf29 Jean-Francois Moine 2016-04-28  814  			dev_err(sdev->slave.dev, "Failed to alloc lli memory\n");
a90e173f3faf29 Jean-Francois Moine 2016-04-28  815  			goto err_lli_free;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  816  		}
a90e173f3faf29 Jean-Francois Moine 2016-04-28  817  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  818  		v_lli->len = period_len;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  819  		v_lli->para = NORMAL_WAIT;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  820  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  821  		if (dir == DMA_MEM_TO_DEV) {
ec31c5c5949275 Samuel Holland      2022-04-24  822  			sun6i_dma_set_addr(sdev, v_lli,
ec31c5c5949275 Samuel Holland      2022-04-24  823  					   buf_addr + period_len * i,
ec31c5c5949275 Samuel Holland      2022-04-24  824  					   sconfig->dst_addr);
802440bdf3b787 Jernej Skrabec      2019-05-27  825  			v_lli->cfg = lli_cfg;
67f34055118cb6 Jernej Skrabec      2019-05-27  826  			sdev->cfg->set_drq(&v_lli->cfg, DRQ_SDRAM, vchan->port);
802440bdf3b787 Jernej Skrabec      2019-05-27  827  			sdev->cfg->set_mode(&v_lli->cfg, LINEAR_MODE, IO_MODE);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  828  		} else {
ec31c5c5949275 Samuel Holland      2022-04-24  829  			sun6i_dma_set_addr(sdev, v_lli,
ec31c5c5949275 Samuel Holland      2022-04-24  830  					   sconfig->src_addr,
ec31c5c5949275 Samuel Holland      2022-04-24  831  					   buf_addr + period_len * i);
802440bdf3b787 Jernej Skrabec      2019-05-27  832  			v_lli->cfg = lli_cfg;
67f34055118cb6 Jernej Skrabec      2019-05-27  833  			sdev->cfg->set_drq(&v_lli->cfg, vchan->port, DRQ_SDRAM);
802440bdf3b787 Jernej Skrabec      2019-05-27  834  			sdev->cfg->set_mode(&v_lli->cfg, IO_MODE, LINEAR_MODE);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  835  		}
a90e173f3faf29 Jean-Francois Moine 2016-04-28  836  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  837  		prev = sun6i_dma_lli_add(prev, v_lli, p_lli, txd);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  838  	}
a90e173f3faf29 Jean-Francois Moine 2016-04-28  839  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  840  	prev->p_lli_next = txd->p_lli;		/* cyclic list */
a90e173f3faf29 Jean-Francois Moine 2016-04-28  841  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  842  	vchan->cyclic = true;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  843  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  844  	return vchan_tx_prep(&vchan->vc, &txd->vd, flags);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  845  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  846  err_lli_free:
9aa48806edb8c3 Samuel Holland      2022-04-24  847  	for (p_lli = txd->p_lli, v_lli = txd->v_lli; v_lli;
9aa48806edb8c3 Samuel Holland      2022-04-24 @848  	     p_lli = v_lli->p_lli_next, v_lli = v_lli->v_lli_next)
9aa48806edb8c3 Samuel Holland      2022-04-24  849  		dma_pool_free(sdev->pool, v_lli, p_lli);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  850  	kfree(txd);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  851  	return NULL;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  852  }
a90e173f3faf29 Jean-Francois Moine 2016-04-28  853  

:::::: The code at line 777 was first introduced by commit
:::::: 9aa48806edb8c37e82532dbc6098b03f6bd4245e dmaengine: sun6i: Do not use virt_to_phys

:::::: TO: Samuel Holland <samuel@sholland.org>
:::::: CC: Vinod Koul <vkoul@kernel.org>

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 3+ messages in thread
* [linux-next:master 1083/1266] drivers/dma/sun6i-dma.c:777 sun6i_dma_prep_slave_sg() error: dereferencing freed memory 'v_lli'
@ 2024-03-26 14:53 Dan Carpenter
  2024-03-26 16:15 ` Suren Baghdasaryan
  0 siblings, 1 reply; 3+ messages in thread
From: Dan Carpenter @ 2024-03-26 14:53 UTC (permalink / raw)
  To: oe-kbuild, Maxime Ripard, Samuel Holland, Suren Baghdasaryan
  Cc: lkp, oe-kbuild-all, Kees Cook

[ I guess Suren Baghdasaryan's patches exposed a much older use after
  free in this driver.  -dan ]

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
head:   084c8e315db34b59d38d06e684b1a0dd07d30287
commit: c64e38ed88d13557ebeb4cb8def02390a8f3dfc4 [1083/1266] mm/slab: enable slab allocation tagging for kmalloc and friends
config: m68k-randconfig-r071-20240326 (https://download.01.org/0day-ci/archive/20240326/202403261808.c8ovEmC1-lkp@intel.com/config)
compiler: m68k-linux-gcc (GCC) 13.2.0

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
| Closes: https://lore.kernel.org/r/202403261808.c8ovEmC1-lkp@intel.com/

smatch warnings:
drivers/dma/sun6i-dma.c:777 sun6i_dma_prep_slave_sg() error: dereferencing freed memory 'v_lli'
drivers/dma/sun6i-dma.c:848 sun6i_dma_prep_dma_cyclic() error: dereferencing freed memory 'v_lli'

vim +/v_lli +777 drivers/dma/sun6i-dma.c

555859308723d8 Maxime Ripard       2014-07-17  700  static struct dma_async_tx_descriptor *sun6i_dma_prep_slave_sg(
555859308723d8 Maxime Ripard       2014-07-17  701  		struct dma_chan *chan, struct scatterlist *sgl,
555859308723d8 Maxime Ripard       2014-07-17  702  		unsigned int sg_len, enum dma_transfer_direction dir,
555859308723d8 Maxime Ripard       2014-07-17  703  		unsigned long flags, void *context)
555859308723d8 Maxime Ripard       2014-07-17  704  {
555859308723d8 Maxime Ripard       2014-07-17  705  	struct sun6i_dma_dev *sdev = to_sun6i_dma_dev(chan->device);
555859308723d8 Maxime Ripard       2014-07-17  706  	struct sun6i_vchan *vchan = to_sun6i_vchan(chan);
555859308723d8 Maxime Ripard       2014-07-17  707  	struct dma_slave_config *sconfig = &vchan->cfg;
555859308723d8 Maxime Ripard       2014-07-17  708  	struct sun6i_dma_lli *v_lli, *prev = NULL;
555859308723d8 Maxime Ripard       2014-07-17  709  	struct sun6i_desc *txd;
555859308723d8 Maxime Ripard       2014-07-17  710  	struct scatterlist *sg;
555859308723d8 Maxime Ripard       2014-07-17  711  	dma_addr_t p_lli;
52c871798ff84b Jean-Francois Moine 2016-04-22  712  	u32 lli_cfg;
555859308723d8 Maxime Ripard       2014-07-17  713  	int i, ret;
555859308723d8 Maxime Ripard       2014-07-17  714  
555859308723d8 Maxime Ripard       2014-07-17  715  	if (!sgl)
555859308723d8 Maxime Ripard       2014-07-17  716  		return NULL;
555859308723d8 Maxime Ripard       2014-07-17  717  
52c871798ff84b Jean-Francois Moine 2016-04-22  718  	ret = set_config(sdev, sconfig, dir, &lli_cfg);
52c871798ff84b Jean-Francois Moine 2016-04-22  719  	if (ret) {
52c871798ff84b Jean-Francois Moine 2016-04-22  720  		dev_err(chan2dev(chan), "Invalid DMA configuration\n");
52c871798ff84b Jean-Francois Moine 2016-04-22  721  		return NULL;
52c871798ff84b Jean-Francois Moine 2016-04-22  722  	}
52c871798ff84b Jean-Francois Moine 2016-04-22  723  
555859308723d8 Maxime Ripard       2014-07-17  724  	txd = kzalloc(sizeof(*txd), GFP_NOWAIT);
555859308723d8 Maxime Ripard       2014-07-17  725  	if (!txd)
555859308723d8 Maxime Ripard       2014-07-17  726  		return NULL;
555859308723d8 Maxime Ripard       2014-07-17  727  
555859308723d8 Maxime Ripard       2014-07-17  728  	for_each_sg(sgl, sg, sg_len, i) {
ec31c5c5949275 Samuel Holland      2022-04-24  729  		v_lli = dma_pool_alloc(sdev->pool, GFP_DMA32 | GFP_NOWAIT, &p_lli);
4fbd804e009ae9 Maxime Ripard       2014-07-30  730  		if (!v_lli)
4fbd804e009ae9 Maxime Ripard       2014-07-30  731  			goto err_lli_free;
555859308723d8 Maxime Ripard       2014-07-17  732  
52c871798ff84b Jean-Francois Moine 2016-04-22  733  		v_lli->len = sg_dma_len(sg);
52c871798ff84b Jean-Francois Moine 2016-04-22  734  		v_lli->para = NORMAL_WAIT;
555859308723d8 Maxime Ripard       2014-07-17  735  
52c871798ff84b Jean-Francois Moine 2016-04-22  736  		if (dir == DMA_MEM_TO_DEV) {
ec31c5c5949275 Samuel Holland      2022-04-24  737  			sun6i_dma_set_addr(sdev, v_lli,
ec31c5c5949275 Samuel Holland      2022-04-24  738  					   sg_dma_address(sg),
ec31c5c5949275 Samuel Holland      2022-04-24  739  					   sconfig->dst_addr);
802440bdf3b787 Jernej Skrabec      2019-05-27  740  			v_lli->cfg = lli_cfg;
67f34055118cb6 Jernej Skrabec      2019-05-27  741  			sdev->cfg->set_drq(&v_lli->cfg, DRQ_SDRAM, vchan->port);
802440bdf3b787 Jernej Skrabec      2019-05-27  742  			sdev->cfg->set_mode(&v_lli->cfg, LINEAR_MODE, IO_MODE);
555859308723d8 Maxime Ripard       2014-07-17  743  
555859308723d8 Maxime Ripard       2014-07-17  744  			dev_dbg(chan2dev(chan),
7f5e03e7367293 Vinod Koul          2014-07-28  745  				"%s; chan: %d, dest: %pad, src: %pad, len: %u. flags: 0x%08lx\n",
555859308723d8 Maxime Ripard       2014-07-17  746  				__func__, vchan->vc.chan.chan_id,
555859308723d8 Maxime Ripard       2014-07-17  747  				&sconfig->dst_addr, &sg_dma_address(sg),
555859308723d8 Maxime Ripard       2014-07-17  748  				sg_dma_len(sg), flags);
555859308723d8 Maxime Ripard       2014-07-17  749  
555859308723d8 Maxime Ripard       2014-07-17  750  		} else {
ec31c5c5949275 Samuel Holland      2022-04-24  751  			sun6i_dma_set_addr(sdev, v_lli,
ec31c5c5949275 Samuel Holland      2022-04-24  752  					   sconfig->src_addr,
ec31c5c5949275 Samuel Holland      2022-04-24  753  					   sg_dma_address(sg));
802440bdf3b787 Jernej Skrabec      2019-05-27  754  			v_lli->cfg = lli_cfg;
67f34055118cb6 Jernej Skrabec      2019-05-27  755  			sdev->cfg->set_drq(&v_lli->cfg, vchan->port, DRQ_SDRAM);
802440bdf3b787 Jernej Skrabec      2019-05-27  756  			sdev->cfg->set_mode(&v_lli->cfg, IO_MODE, LINEAR_MODE);
555859308723d8 Maxime Ripard       2014-07-17  757  
555859308723d8 Maxime Ripard       2014-07-17  758  			dev_dbg(chan2dev(chan),
7f5e03e7367293 Vinod Koul          2014-07-28  759  				"%s; chan: %d, dest: %pad, src: %pad, len: %u. flags: 0x%08lx\n",
555859308723d8 Maxime Ripard       2014-07-17  760  				__func__, vchan->vc.chan.chan_id,
555859308723d8 Maxime Ripard       2014-07-17  761  				&sg_dma_address(sg), &sconfig->src_addr,
555859308723d8 Maxime Ripard       2014-07-17  762  				sg_dma_len(sg), flags);
555859308723d8 Maxime Ripard       2014-07-17  763  		}
555859308723d8 Maxime Ripard       2014-07-17  764  
555859308723d8 Maxime Ripard       2014-07-17  765  		prev = sun6i_dma_lli_add(prev, v_lli, p_lli, txd);
555859308723d8 Maxime Ripard       2014-07-17  766  	}
555859308723d8 Maxime Ripard       2014-07-17  767  
555859308723d8 Maxime Ripard       2014-07-17  768  	dev_dbg(chan2dev(chan), "First: %pad\n", &txd->p_lli);
9aa48806edb8c3 Samuel Holland      2022-04-24  769  	for (p_lli = txd->p_lli, v_lli = txd->v_lli; v_lli;
9aa48806edb8c3 Samuel Holland      2022-04-24  770  	     p_lli = v_lli->p_lli_next, v_lli = v_lli->v_lli_next)
9aa48806edb8c3 Samuel Holland      2022-04-24  771  		sun6i_dma_dump_lli(vchan, v_lli, p_lli);
555859308723d8 Maxime Ripard       2014-07-17  772  
555859308723d8 Maxime Ripard       2014-07-17  773  	return vchan_tx_prep(&vchan->vc, &txd->vd, flags);
555859308723d8 Maxime Ripard       2014-07-17  774  
4fbd804e009ae9 Maxime Ripard       2014-07-30  775  err_lli_free:
9aa48806edb8c3 Samuel Holland      2022-04-24  776  	for (p_lli = txd->p_lli, v_lli = txd->v_lli; v_lli;
9aa48806edb8c3 Samuel Holland      2022-04-24 @777  	     p_lli = v_lli->p_lli_next, v_lli = v_lli->v_lli_next)
                                                                     ^^^^^^^                    ^^^^^^^
9aa48806edb8c3 Samuel Holland      2022-04-24  778  		dma_pool_free(sdev->pool, v_lli, p_lli);
                                                                                          ^^^^^
It's illegal to dereference "v_lli" after passing it to
dma_pool_free().

4fbd804e009ae9 Maxime Ripard       2014-07-30  779  	kfree(txd);
555859308723d8 Maxime Ripard       2014-07-17  780  	return NULL;
555859308723d8 Maxime Ripard       2014-07-17  781  }
555859308723d8 Maxime Ripard       2014-07-17  782  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  783  static struct dma_async_tx_descriptor *sun6i_dma_prep_dma_cyclic(
a90e173f3faf29 Jean-Francois Moine 2016-04-28  784  					struct dma_chan *chan,
a90e173f3faf29 Jean-Francois Moine 2016-04-28  785  					dma_addr_t buf_addr,
a90e173f3faf29 Jean-Francois Moine 2016-04-28  786  					size_t buf_len,
a90e173f3faf29 Jean-Francois Moine 2016-04-28  787  					size_t period_len,
a90e173f3faf29 Jean-Francois Moine 2016-04-28  788  					enum dma_transfer_direction dir,
a90e173f3faf29 Jean-Francois Moine 2016-04-28  789  					unsigned long flags)
a90e173f3faf29 Jean-Francois Moine 2016-04-28  790  {
a90e173f3faf29 Jean-Francois Moine 2016-04-28  791  	struct sun6i_dma_dev *sdev = to_sun6i_dma_dev(chan->device);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  792  	struct sun6i_vchan *vchan = to_sun6i_vchan(chan);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  793  	struct dma_slave_config *sconfig = &vchan->cfg;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  794  	struct sun6i_dma_lli *v_lli, *prev = NULL;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  795  	struct sun6i_desc *txd;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  796  	dma_addr_t p_lli;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  797  	u32 lli_cfg;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  798  	unsigned int i, periods = buf_len / period_len;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  799  	int ret;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  800  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  801  	ret = set_config(sdev, sconfig, dir, &lli_cfg);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  802  	if (ret) {
a90e173f3faf29 Jean-Francois Moine 2016-04-28  803  		dev_err(chan2dev(chan), "Invalid DMA configuration\n");
a90e173f3faf29 Jean-Francois Moine 2016-04-28  804  		return NULL;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  805  	}
a90e173f3faf29 Jean-Francois Moine 2016-04-28  806  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  807  	txd = kzalloc(sizeof(*txd), GFP_NOWAIT);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  808  	if (!txd)
a90e173f3faf29 Jean-Francois Moine 2016-04-28  809  		return NULL;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  810  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  811  	for (i = 0; i < periods; i++) {
ec31c5c5949275 Samuel Holland      2022-04-24  812  		v_lli = dma_pool_alloc(sdev->pool, GFP_DMA32 | GFP_NOWAIT, &p_lli);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  813  		if (!v_lli) {
a90e173f3faf29 Jean-Francois Moine 2016-04-28  814  			dev_err(sdev->slave.dev, "Failed to alloc lli memory\n");
a90e173f3faf29 Jean-Francois Moine 2016-04-28  815  			goto err_lli_free;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  816  		}
a90e173f3faf29 Jean-Francois Moine 2016-04-28  817  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  818  		v_lli->len = period_len;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  819  		v_lli->para = NORMAL_WAIT;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  820  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  821  		if (dir == DMA_MEM_TO_DEV) {
ec31c5c5949275 Samuel Holland      2022-04-24  822  			sun6i_dma_set_addr(sdev, v_lli,
ec31c5c5949275 Samuel Holland      2022-04-24  823  					   buf_addr + period_len * i,
ec31c5c5949275 Samuel Holland      2022-04-24  824  					   sconfig->dst_addr);
802440bdf3b787 Jernej Skrabec      2019-05-27  825  			v_lli->cfg = lli_cfg;
67f34055118cb6 Jernej Skrabec      2019-05-27  826  			sdev->cfg->set_drq(&v_lli->cfg, DRQ_SDRAM, vchan->port);
802440bdf3b787 Jernej Skrabec      2019-05-27  827  			sdev->cfg->set_mode(&v_lli->cfg, LINEAR_MODE, IO_MODE);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  828  		} else {
ec31c5c5949275 Samuel Holland      2022-04-24  829  			sun6i_dma_set_addr(sdev, v_lli,
ec31c5c5949275 Samuel Holland      2022-04-24  830  					   sconfig->src_addr,
ec31c5c5949275 Samuel Holland      2022-04-24  831  					   buf_addr + period_len * i);
802440bdf3b787 Jernej Skrabec      2019-05-27  832  			v_lli->cfg = lli_cfg;
67f34055118cb6 Jernej Skrabec      2019-05-27  833  			sdev->cfg->set_drq(&v_lli->cfg, vchan->port, DRQ_SDRAM);
802440bdf3b787 Jernej Skrabec      2019-05-27  834  			sdev->cfg->set_mode(&v_lli->cfg, IO_MODE, LINEAR_MODE);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  835  		}
a90e173f3faf29 Jean-Francois Moine 2016-04-28  836  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  837  		prev = sun6i_dma_lli_add(prev, v_lli, p_lli, txd);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  838  	}
a90e173f3faf29 Jean-Francois Moine 2016-04-28  839  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  840  	prev->p_lli_next = txd->p_lli;		/* cyclic list */
a90e173f3faf29 Jean-Francois Moine 2016-04-28  841  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  842  	vchan->cyclic = true;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  843  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  844  	return vchan_tx_prep(&vchan->vc, &txd->vd, flags);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  845  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  846  err_lli_free:
9aa48806edb8c3 Samuel Holland      2022-04-24  847  	for (p_lli = txd->p_lli, v_lli = txd->v_lli; v_lli;
9aa48806edb8c3 Samuel Holland      2022-04-24 @848  	     p_lli = v_lli->p_lli_next, v_lli = v_lli->v_lli_next)
9aa48806edb8c3 Samuel Holland      2022-04-24  849  		dma_pool_free(sdev->pool, v_lli, p_lli);

Same.

a90e173f3faf29 Jean-Francois Moine 2016-04-28  850  	kfree(txd);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  851  	return NULL;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  852  }

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2024-03-26 16:15 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-03-26 10:19 [linux-next:master 1083/1266] drivers/dma/sun6i-dma.c:777 sun6i_dma_prep_slave_sg() error: dereferencing freed memory 'v_lli' kernel test robot
  -- strict thread matches above, loose matches on Subject: below --
2024-03-26 14:53 Dan Carpenter
2024-03-26 16:15 ` Suren Baghdasaryan

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.