drm/syncobj: Use proper methods for accessing rcu protected pointers
authorVille Syrjälä <[email protected]>
Thu, 2 Nov 2017 20:03:35 +0000 (22:03 +0200)
committerVille Syrjälä <[email protected]>
Thu, 9 Nov 2017 18:34:21 +0000 (20:34 +0200)
Use rcu_dereference_protected() and rcu_assign_pointer() for accessing
the rcu protected syncobj->fence pointer. This eliminates several sparse
warnings.

Cc: Dave Airlie <[email protected]>
Cc: Jason Ekstrand <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: Alex Deucher <[email protected]>
Cc: Christian König <[email protected]>
Cc: Sumit Semwal <[email protected]>
Cc: Chris Wilson <[email protected]>
Signed-off-by: Ville Syrjälä <[email protected]>
Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
Reviewed-by: Daniel Vetter <[email protected]>
Acked-by: Christian König <[email protected]>
drivers/gpu/drm/drm_syncobj.c

index 7081ae601d6f6ab6e25df051765446c64f1e5d2f..7943c215a03ce57f06bbd14d612356b42cc351fa 100644 (file)
@@ -106,7 +106,8 @@ static int drm_syncobj_fence_get_or_add_callback(struct drm_syncobj *syncobj,
         * callback when a fence has already been set.
         */
        if (syncobj->fence) {
-               *fence = dma_fence_get(syncobj->fence);
+               *fence = dma_fence_get(rcu_dereference_protected(syncobj->fence,
+                                                                lockdep_is_held(&syncobj->lock)));
                ret = 1;
        } else {
                *fence = NULL;
@@ -168,8 +169,9 @@ void drm_syncobj_replace_fence(struct drm_syncobj *syncobj,
 
        spin_lock(&syncobj->lock);
 
-       old_fence = syncobj->fence;
-       syncobj->fence = fence;
+       old_fence = rcu_dereference_protected(syncobj->fence,
+                                             lockdep_is_held(&syncobj->lock));
+       rcu_assign_pointer(syncobj->fence, fence);
 
        if (fence != old_fence) {
                list_for_each_entry_safe(cur, tmp, &syncobj->cb_list, node) {
@@ -613,7 +615,8 @@ static void syncobj_wait_syncobj_func(struct drm_syncobj *syncobj,
                container_of(cb, struct syncobj_wait_entry, syncobj_cb);
 
        /* This happens inside the syncobj lock */
-       wait->fence = dma_fence_get(syncobj->fence);
+       wait->fence = dma_fence_get(rcu_dereference_protected(syncobj->fence,
+                                                             lockdep_is_held(&syncobj->lock)));
        wake_up_process(wait->task);
 }