[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20191230204555.GB24135@qmqm.qmqm.pl>
Date: Mon, 30 Dec 2019 21:45:55 +0100
From: Michał Mirosław <mirq-linux@...e.qmqm.pl>
To: Dmitry Osipenko <digetx@...il.com>
Cc: Laxman Dewangan <ldewangan@...dia.com>,
Vinod Koul <vkoul@...nel.org>,
Dan Williams <dan.j.williams@...el.com>,
Thierry Reding <thierry.reding@...il.com>,
Jonathan Hunter <jonathanh@...dia.com>,
dmaengine@...r.kernel.org, linux-tegra@...r.kernel.org,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH v1 3/7] dmaengine: tegra-apb: Prevent race conditions on
channel's freeing
On Sat, Dec 28, 2019 at 11:46:36PM +0300, Dmitry Osipenko wrote:
> It's unsafe to check the channel's "busy" state without taking a lock,
> it is also unsafe to assume that tasklet isn't in-fly.
'in-flight'. Also, the patch seems to have two independent bug-fixes
in it. Second one doesn't look right, at least not without an explanation.
First:
> - if (tdc->busy)
> - tegra_dma_terminate_all(dc);
> + tegra_dma_terminate_all(dc);
Second:
> + tasklet_kill(&tdc->tasklet);
>
> spin_lock_irqsave(&tdc->lock, flags);
> list_splice_init(&tdc->pending_sg_req, &sg_req_list);
> @@ -1543,7 +1543,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);
> @@ -1563,7 +1562,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);
Best Regards,
Michał Mirosław
Powered by blists - more mailing lists