• Yoshihiro Shimoda's avatar
    dmaengine: shdma: fix a race condition in __ld_cleanup() · 26fd830a
    Yoshihiro Shimoda authored
    This patch fixes a race condition about a list of shdma-base driver.
    If we don't apply this patch, a dma slave driver (especially a usb
    peripheral driver) may not be able to start the transfer.
    
    If a dma slave driver has a callback, __ld_cleanup() will call
    the callback before this driver removes the list. After the callback,
    since the return value of __ld_cleanup() is not zero,
    shdma_chan_ld_cleanup() calls __ld_cleanup() again. And, __ld_clean()
    will removes the list.
    
    At this time, if a dma slave driver calls dmaengine_submit() before
    this driver removes the list, this driver will set schan->pm_state
    to SHDMA_PM_PENDING in shdma_tx_submit(). And then, even if a dma
    slave driver calls dma_async_issue_pending(), this driver don't
    start the transfer because the schan->pm_state is SHDMA_PM_PENDING
    in shdma_issue_pending().
    
    So, this patch adds a new condition in __ld_clean() to check if the
    schan->pm_state is SHDMA_PM_PENDING or not.
    Signed-off-by: default avatarYoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
    Signed-off-by: default avatarVinod Koul <vinod.koul@intel.com>
    26fd830a
shdma-base.c 27.2 KB