• Lars-Peter Clausen's avatar
    dmaengine: xilinx: Introduce synchronize() callback · 50db2050
    Lars-Peter Clausen authored
    The Xilinx dmaengine driver uses a tasklet to process completed
    descriptors and execute their callbacks.
    
    Currently consumers of the DMA channel have to no method of synchronization
    against this tasklet when using the Xilinx dmaengine drivers. This can lead
    to race conditions when the consumer frees resources that are accessed in
    the callback before the tasklet has finished running.
    
    It is not enough to just call dmaengine_terminal_all() since on a
    multi-processor system the tasklet can run concurrently to it and might
    call the callback after dmaengine_terminate_all() has already finished.
    
    To mitigate this issue implement the synchronize() callback for the driver,
    which will wait until the tasklet has finished.
    Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
    Link: https://lore.kernel.org/r/20210313125311.4823-1-lars@metafoo.deSigned-off-by: default avatarVinod Koul <vkoul@kernel.org>
    50db2050
xilinx_dma.c 88.4 KB