• John Keeping's avatar
    dmaengine: pl330: fix irq race with terminate_all · e4975654
    John Keeping authored
    In pl330_update() when checking if a channel has been aborted, the
    channel's lock is not taken, only the overall pl330_dmac lock.  But in
    pl330_terminate_all() the aborted flag (req_running==-1) is set under
    the channel lock and not the pl330_dmac lock.
    
    With threaded interrupts, this leads to a potential race:
    
        pl330_terminate_all	        pl330_update
        -------------------         ------------
        lock channel
                                    entry
        lock pl330
        _stop channel
        unlock pl330
                                    lock pl330
                                    check req_running != -1
        req_running = -1
                                    _start channel
    Signed-off-by: default avatarJohn Keeping <john@metanate.com>
    Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
    e4975654
pl330.c 70.3 KB