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