• Jan Kuliga's avatar
    dmaengine: xilinx: xdma: Rework xdma_terminate_all() · 855c2e1d
    Jan Kuliga authored
    Simplify xdma_xfer_stop(). Stop the dma engine and clear its status
    register unconditionally - just do what its name states. This change
    also allows to call it without grabbing a lock, which minimizes
    the total time spent with a spinlock held.
    
    Delete the currently processed vd.node from the vc.desc_issued list
    prior to passing it to vchan_terminate_vdesc(). In case there's more
    than one descriptor pending on vc.desc_issued list, calling
    vchan_terminate_desc() results in losing the link between
    vc.desc_issued list head and the second descriptor on the list. Doing so
    results in resources leakege, as vchan_dma_desc_free_list() won't be
    able to properly free memory resources attached to descriptors,
    resulting in dma_pool_destroy() failure.
    
    Don't call vchan_dma_desc_free_list() from within xdma_terminate_all().
    Move all terminated descriptors to the vc.desc_terminated list instead.
    This allows to postpone freeing memory resources associated with
    descriptors until the call to vchan_synchronize(), which is called from
    xdma_synchronize() callback. This is the right way to do it -
    xdma_terminate_all() should return as soon as possible, while freeing
    resources (that may be time consuming in case of large number of
    descriptors) can be done safely later.
    
    Fixes: f5c392d1 ("dmaengine: xilinx: xdma: Add terminate_all/synchronize callbacks")
    Signed-off-by: default avatarJan Kuliga <jankul@alatek.krakow.pl>
    Link: https://lore.kernel.org/r/20231218113943.9099-5-jankul@alatek.krakow.plSigned-off-by: default avatarVinod Koul <vkoul@kernel.org>
    855c2e1d
xdma.c 30 KB