drm/syncobj: Use proper methods for accessing rcu protected pointers
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Thu, 2 Nov 2017 20:03:35 +0000 (22:03 +0200)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
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 <airlied@redhat.com>
Cc: Jason Ekstrand <jason@jlekstrand.net>
Cc: linaro-mm-sig@lists.linaro.org
Cc: linux-media@vger.kernel.org
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: Christian König <christian.koenig@amd.com>
Cc: Sumit Semwal <sumit.semwal@linaro.org>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20171102200336.23347-4-ville.syrjala@linux.intel.com
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Acked-by: Christian König <christian.koenig@amd.com>
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);
 }