• Zack Rusin's avatar
    drm/vmwgfx: Fix a deadlock in dma buf fence polling · e5833710
    Zack Rusin authored
    Introduce a version of the fence ops that on release doesn't remove
    the fence from the pending list, and thus doesn't require a lock to
    fix poll->fence wait->fence unref deadlocks.
    
    vmwgfx overwrites the wait callback to iterate over the list of all
    fences and update their status, to do that it holds a lock to prevent
    the list modifcations from other threads. The fence destroy callback
    both deletes the fence and removes it from the list of pending
    fences, for which it holds a lock.
    
    dma buf polling cb unrefs a fence after it's been signaled: so the poll
    calls the wait, which signals the fences, which are being destroyed.
    The destruction tries to acquire the lock on the pending fences list
    which it can never get because it's held by the wait from which it
    was called.
    
    Old bug, but not a lot of userspace apps were using dma-buf polling
    interfaces. Fix those, in particular this fixes KDE stalls/deadlock.
    Signed-off-by: default avatarZack Rusin <zack.rusin@broadcom.com>
    Fixes: 2298e804 ("drm/vmwgfx: rework to new fence interface, v2")
    Cc: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
    Cc: dri-devel@lists.freedesktop.org
    Cc: <stable@vger.kernel.org> # v6.2+
    Reviewed-by: default avatarMaaz Mombasawala <maaz.mombasawala@broadcom.com>
    Reviewed-by: default avatarMartin Krastev <martin.krastev@broadcom.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20240722184313.181318-2-zack.rusin@broadcom.com
    e5833710
vmwgfx_fence.c 28.6 KB