Re: [PATCH v1 3/7] dmaengine: tegra-apb: Prevent race conditions on channel's freeing

From: Michał Mirosław
Date: Fri Jan 03 2020 - 03:16:22 EST


On Thu, Jan 02, 2020 at 06:09:45PM +0300, Dmitry Osipenko wrote:
> 30.12.2019 23:50, MichaÅ MirosÅaw ÐÐÑÐÑ:
> > On Mon, Dec 30, 2019 at 09:45:55PM +0100, MichaÅ MirosÅaw wrote:
> >> 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);
> >
> > BTW, maybe you can convert the code to threaded interrupt handler and
> > just get rid of the tasklet instead of fixing it?
>
> This shouldn't bring much benefit because the the code's logic won't be
> changed since we will still have to use the threaded ISR part as the
> bottom-half and then IRQ API doesn't provide a nice way to synchronize
> interrupt's execution, while tasklet_kill() is a nice way to sync it.

What about synchronize_irq()?

BTW, does tegra_dma_terminate_all() prevent further interrupts that might
cause the tasklet to be scheduled again?

Best Regards,
MichaÅÂMirosÅaw