Skip to content
  • Tomi Valkeinen's avatar
    drm/omap: fix race conditon in DMM · 7439507f
    Tomi Valkeinen authored
    
    
    The omapdrm DMM code sometimes crashes with:
    
    WARNING: CPU: 0 PID: 1235 at lib/list_debug.c:36 __list_add+0x8c/0xbc()
    list_add double add: new=e9265368, prev=e90139c4, next=e9265368.
    
    This is caused by the code calling release_engine() twice for the same
    engine.
    
    dmm_txn_commit(wait=true) call is supposed to wait until the DMM
    transaction has been finished. And it does that, but it does not wait
    for the irq handler to finish.
    
    What happens is that the irq handler is triggered, and it either wakes
    up the thread that called dmm_txn_commit(), or that thread never even
    slept because the transaction was finished in the HW very quickly. That
    thread then continues executing, even if the irq handler is not yet
    finished, and a new transaction may be initiated. If that transaction is
    async (i.e. wait=false), a 'async' flag is set to true. The original irq
    handler, which has yet not finished, then sees the transaction as
    'async', even if it was supposed to be 'sync'.
    
    When that happens, the irq handler does an extra release_engine() call
    because it thinks it need to release the engine, leading to the crash.
    
    This patch fixes the issue by using completion to ensure that the irq
    handler has finished before a dmm_txn_commit(wait=true) may continue.
    
    Signed-off-by: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
    7439507f