On Tue, May 16, 2017 at 01:09:14AM +0200, Niklas Söderlund wrote: > Hi, > > This series fix resource freeing synchronization by: > > 1. Patch 1/3 > Store the IRQ number in the global struct so it can be used later > together with synchronize_irq(). > > 2. Patch 2/3 > Adding support for the device_synchronize() callback in patch 2/3. > > 3. Patch 3/3 > Waiting for any ISR that might still be running after the channel is > halted prior to freeing its resources. This was patch previously part > of a patch sent out by Yoshihiro Shimoda and authored by Hiroyuki > Yokoyama, see [1]. > > In that thread it was suggested by Lars-Peter Clausen to instead > implement the device_synchronize() callback. Unfortunately this is not > enough to solve the issue. In rcar_dmac_free_chan_resources() the > channel is halted by a call to rcar_dmac_chan_halt() and then directly > moves on to freeing resources, here it is still needed to add a wait > for any ISR to finish before freeing the resources, despite that a > device_synchronize() have been added. This is because call chain: > > dma_release_channel() > dma_chan_put() > dmaengine_synchronize() > rcar_dmac_free_chan_resources() > rcar_dmac_chan_halt() > > Here dmaengine_synchronize() is called prior to rcar_dmac_chan_halt() > so an extra synchronisation to wait for any running ISR is still > needed. > > By both adding a device_synchronize() which can be used in conjunction > with device_terminate_all() and fiends and by adding an explicit > synchronize_irq() when freeing channel resources I feel the > synchronisation for freeing channel resources are in a much better > shape. It also solves the issue in the original mail thread. Applied now, thanks -- ~Vinod