RE: [PATCH] dmaengine: move channel device_node deletion to driver

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> -----Original Message-----
> From: Dave Jiang <dave.jiang@xxxxxxxxx>
> Sent: Monday, January 18, 2021 10:59 PM
> To: vkoul@xxxxxxxxxx
> Cc: dmaengine@xxxxxxxxxxxxxxx; Radhey Shyam Pandey
> <radheys@xxxxxxxxxx>; pthomas8589@xxxxxxxxx
> Subject: [PATCH] dmaengine: move channel device_node deletion to driver
> 
> Channel device_node deletion is managed by the device driver rather than
> the dmaengine core. The deletion was accidentally introduced when making
> channel unregister dynamic. It causes xilinx_dma module to crash on unload
> as reported by Radhey. Remove chan->device_node delete in dmaengine
> and
> also fix up idxd driver.
> 
> [   42.142705] Internal error: Oops: 96000044 [#1] SMP
> [   42.147566] Modules linked in: xilinx_dma(-) clk_xlnx_clock_wizard
> uio_pdrv_genirq
> [   42.155139] CPU: 1 PID: 2075 Comm: rmmod Not tainted 5.10.1-00026-
> g3a2e6dd7a05-dirty #192
> [   42.163302] Hardware name: Enclustra XU5 SOM (DT)
> [   42.167992] pstate: 40000005 (nZcv daif -PAN -UAO -TCO BTYPE=--)
> [   42.173996] pc : xilinx_dma_chan_remove+0x74/0xa0 [xilinx_dma]
> [   42.179815] lr : xilinx_dma_chan_remove+0x70/0xa0 [xilinx_dma]
> [   42.185636] sp : ffffffc01112bca0
> [   42.188935] x29: ffffffc01112bca0 x28: ffffff80402ea640
> 
> xilinx_dma_chan_remove+0x74/0xa0:
> __list_del at ./include/linux/list.h:112 (inlined by)
> __list_del_entry at./include/linux/list.h:135 (inlined by)
> list_del at ./include/linux/list.h:146 (inlined by)
> xilinx_dma_chan_remove at drivers/dma/xilinx/xilinx_dma.c:2546
> 
> Reported-by: Radhey Shyam Pandey <radheys@xxxxxxxxxx>
> Signed-off-by: Dave Jiang <dave.jiang@xxxxxxxxx>
> Fixes: e81274cd6b52 ("dmaengine: add support to dynamic
> register/unregister of channels")

For xilinx_dma driver:
Tested-by: Radhey Shyam Pandey <radhey.shyam.pandey@xxxxxxxxxx>
Thanks for the fix!

> ---
>  drivers/dma/dmaengine.c |    1 -
>  drivers/dma/idxd/dma.c  |    5 ++++-
>  2 files changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c
> index 962cbb5e5f7f..fe6a460c4373 100644
> --- a/drivers/dma/dmaengine.c
> +++ b/drivers/dma/dmaengine.c
> @@ -1110,7 +1110,6 @@ static void
> __dma_async_device_channel_unregister(struct dma_device *device,
>  		  "%s called while %d clients hold a reference\n",
>  		  __func__, chan->client_count);
>  	mutex_lock(&dma_list_mutex);
> -	list_del(&chan->device_node);
>  	device->chancnt--;
>  	chan->dev->chan = NULL;
>  	mutex_unlock(&dma_list_mutex);
> diff --git a/drivers/dma/idxd/dma.c b/drivers/dma/idxd/dma.c
> index 90d19d06783a..a15e50126434 100644
> --- a/drivers/dma/idxd/dma.c
> +++ b/drivers/dma/idxd/dma.c
> @@ -206,5 +206,8 @@ int idxd_register_dma_channel(struct idxd_wq *wq)
> 
>  void idxd_unregister_dma_channel(struct idxd_wq *wq)
>  {
> -	dma_async_device_channel_unregister(&wq->idxd->dma_dev, &wq-
> >dma_chan);
> +	struct dma_chan *chan = &wq->dma_chan;
> +
> +	dma_async_device_channel_unregister(&wq->idxd->dma_dev,
> chan);
> +	list_del(&chan->device_node);
>  }
> 





[Index of Archives]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux PCI]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]

  Powered by Linux