• Jason Ekstrand's avatar
    drm/syncobj: Add a race-free drm_syncobj_fence_get helper (v2) · 309a5482
    Jason Ekstrand authored
    The atomic exchange operation in drm_syncobj_replace_fence is sufficient
    for the case where it races with itself.  However, if you have a race
    between a replace_fence and dma_fence_get(syncobj->fence), you may end
    up with the entire replace_fence happening between the point in time
    where the one thread gets the syncobj->fence pointer and when it calls
    dma_fence_get() on it.  If this happens, then the reference may be
    dropped before we get a chance to get a new one.  The new helper uses
    dma_fence_get_rcu_safe to get rid of the race.
    
    This is also needed because it allows us to do a bit more than just get
    a reference in drm_syncobj_fence_get should we wish to do so.
    
    v2:
     - RCU isn't that scary
     - Call rcu_read_lock/unlock
     - Don't rename fence to _fence
     - Make the helper static inline
    Signed-off-by: default avatarJason Ekstrand <jason@jlekstrand.net>
    Acked-by: Christian König <christian.koenig@amd.com> (v1)
    Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
    309a5482
drm_syncobj.c 10.4 KB