Re: [PATCH v4 04/14] dmaengine: tegra-apb: Clean up tasklet releasing

From: Jon Hunter
Date: Tue Jan 14 2020 - 10:36:06 EST



On 12/01/2020 17:29, Dmitry Osipenko wrote:
> There is no need to kill tasklet when driver's probe fails because tasklet
> can't be scheduled at this time. It is also cleaner to kill tasklet on
> channel's freeing rather than to kill it on driver's removal, otherwise
> tasklet could perform a dummy execution after channel's releasing, which
> isn't very nice.
>
> Signed-off-by: Dmitry Osipenko <digetx@xxxxxxxxx>
> ---
> drivers/dma/tegra20-apb-dma.c | 6 +-----
> 1 file changed, 1 insertion(+), 5 deletions(-)
>
> diff --git a/drivers/dma/tegra20-apb-dma.c b/drivers/dma/tegra20-apb-dma.c
> index 24ad3a5a04e3..1b8a11804962 100644
> --- a/drivers/dma/tegra20-apb-dma.c
> +++ b/drivers/dma/tegra20-apb-dma.c
> @@ -1287,7 +1287,6 @@ static void tegra_dma_free_chan_resources(struct dma_chan *dc)
> struct tegra_dma_sg_req *sg_req;
> struct list_head dma_desc_list;
> struct list_head sg_req_list;
> - unsigned long flags;
>
> INIT_LIST_HEAD(&dma_desc_list);
> INIT_LIST_HEAD(&sg_req_list);
> @@ -1295,15 +1294,14 @@ static void tegra_dma_free_chan_resources(struct dma_chan *dc)
> dev_dbg(tdc2dev(tdc), "Freeing channel %d\n", tdc->id);
>
> tegra_dma_terminate_all(dc);
> + tasklet_kill(&tdc->tasklet);
>
> - spin_lock_irqsave(&tdc->lock, flags);
> list_splice_init(&tdc->pending_sg_req, &sg_req_list);
> list_splice_init(&tdc->free_sg_req, &sg_req_list);
> list_splice_init(&tdc->free_dma_desc, &dma_desc_list);
> INIT_LIST_HEAD(&tdc->cb_desc);
> tdc->config_init = false;
> tdc->isr_handler = NULL;
> - spin_unlock_irqrestore(&tdc->lock, flags);
>
> while (!list_empty(&dma_desc_list)) {
> dma_desc = list_first_entry(&dma_desc_list,
> @@ -1542,7 +1540,6 @@ static int tegra_dma_probe(struct platform_device *pdev)
> struct tegra_dma_channel *tdc = &tdma->channels[i];
>
> free_irq(tdc->irq, tdc);
> - tasklet_kill(&tdc->tasklet);
> }
>
> pm_runtime_disable(&pdev->dev);
> @@ -1562,7 +1559,6 @@ static int tegra_dma_remove(struct platform_device *pdev)
> for (i = 0; i < tdma->chip_data->nr_channels; ++i) {
> tdc = &tdma->channels[i];
> free_irq(tdc->irq, tdc);
> - tasklet_kill(&tdc->tasklet);
> }
>
> pm_runtime_disable(&pdev->dev);

Acked-by: Jon Hunter <jonathanh@xxxxxxxxxx>

Cheers
Jon

--
nvpublic