29 Oct
2015
29 Oct
'15
10:59 p.m.
On Tue, Oct 20, 2015 at 12:46 PM, Lars-Peter Clausen lars@metafoo.de wrote:
The DMAengine API has a long standing race condition that is inherent to the API itself. Calling dmaengine_terminate_all() is supposed to stop and abort any pending or active transfers that have previously been submitted. Unfortunately it is possible that this operation races against a currently running (or with some drivers also scheduled) completion callback.
[]
+/**
- dmaengine_terminate_sync() - Terminate all active DMA transfers
- @chan: The channel for which to terminate the transfers
- Calling this function will terminate all active and pending transfers
- that have previously been submitted to the channel. It is similar to
- dmaengine_terminate_async() but guarantees that the DMA transfer has actually
- stopped and that all complete callbacks have finished running when the
- function returns.
- This function must only be called from non-atomic context and must not be
- called from within a complete callback of a descriptor submitted on the same
- channel.
- */
+static inline int dmaengine_terminate_sync(struct dma_chan *chan) +{
int ret;
Might be a good idea to add might_sleep(); here.
ret = dmaengine_terminate_async(chan);
if (ret)
return ret;
dmaengine_synchronize(chan);
return 0;
+}
--
With Best Regards,
Andy Shevchenko