[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <2395e415-c435-0305-b53e-81278ff24d30@nvidia.com>
Date: Tue, 14 Jan 2020 15:36:00 +0000
From: Jon Hunter <jonathanh@...dia.com>
To: Dmitry Osipenko <digetx@...il.com>,
Laxman Dewangan <ldewangan@...dia.com>,
Vinod Koul <vkoul@...nel.org>,
Dan Williams <dan.j.williams@...el.com>,
Thierry Reding <thierry.reding@...il.com>,
Michał Mirosław <mirq-linux@...e.qmqm.pl>
CC: <dmaengine@...r.kernel.org>, <linux-tegra@...r.kernel.org>,
<linux-kernel@...r.kernel.org>
Subject: Re: [PATCH v4 04/14] dmaengine: tegra-apb: Clean up tasklet releasing
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@...il.com>
> ---
> 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@...dia.com>
Cheers
Jon
--
nvpublic
Powered by blists - more mailing lists