OSDN Git Service

dma-buf: try to replace a signaled fence in reservation_object_add_shared_inplace
authorChristian König <ckoenig.leichtzumerken@gmail.com>
Tue, 14 Nov 2017 14:24:36 +0000 (15:24 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 14 Nov 2017 17:01:45 +0000 (12:01 -0500)
The amdgpu issue to also need signaled fences in the reservation objects should
be fixed by now.

Optimize the handling by replacing a signaled fence when adding a new
shared one.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20171114142436.1360-2-christian.koenig@amd.com
drivers/dma-buf/reservation.c

index 737885e..b759a56 100644 (file)
@@ -104,7 +104,8 @@ reservation_object_add_shared_inplace(struct reservation_object *obj,
                                      struct reservation_object_list *fobj,
                                      struct dma_fence *fence)
 {
-       u32 i;
+       struct dma_fence *signaled = NULL;
+       u32 i, signaled_idx;
 
        dma_fence_get(fence);
 
@@ -126,17 +127,28 @@ reservation_object_add_shared_inplace(struct reservation_object *obj,
                        dma_fence_put(old_fence);
                        return;
                }
+
+               if (!signaled && dma_fence_is_signaled(old_fence)) {
+                       signaled = old_fence;
+                       signaled_idx = i;
+               }
        }
 
        /*
         * memory barrier is added by write_seqcount_begin,
         * fobj->shared_count is protected by this lock too
         */
-       RCU_INIT_POINTER(fobj->shared[fobj->shared_count], fence);
-       fobj->shared_count++;
+       if (signaled) {
+               RCU_INIT_POINTER(fobj->shared[signaled_idx], fence);
+       } else {
+               RCU_INIT_POINTER(fobj->shared[fobj->shared_count], fence);
+               fobj->shared_count++;
+       }
 
        write_seqcount_end(&obj->seq);
        preempt_enable();
+
+       dma_fence_put(signaled);
 }
 
 static void