Commit 93505ee7 authored by Christian König's avatar Christian König

dma-buf: fix busy wait for new shared fences

When reservation_object_add_shared_fence is replacing an old fence with a new
one we should not drop the old one before the new one is in place.

Otherwise other cores can busy wait for the new one to appear.
Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/322030/
parent 178e5f3a
...@@ -196,6 +196,7 @@ void reservation_object_add_shared_fence(struct reservation_object *obj, ...@@ -196,6 +196,7 @@ void reservation_object_add_shared_fence(struct reservation_object *obj,
struct dma_fence *fence) struct dma_fence *fence)
{ {
struct reservation_object_list *fobj; struct reservation_object_list *fobj;
struct dma_fence *old;
unsigned int i, count; unsigned int i, count;
dma_fence_get(fence); dma_fence_get(fence);
...@@ -209,18 +210,16 @@ void reservation_object_add_shared_fence(struct reservation_object *obj, ...@@ -209,18 +210,16 @@ void reservation_object_add_shared_fence(struct reservation_object *obj,
write_seqcount_begin(&obj->seq); write_seqcount_begin(&obj->seq);
for (i = 0; i < count; ++i) { for (i = 0; i < count; ++i) {
struct dma_fence *old_fence;
old_fence = rcu_dereference_protected(fobj->shared[i], old = rcu_dereference_protected(fobj->shared[i],
reservation_object_held(obj)); reservation_object_held(obj));
if (old_fence->context == fence->context || if (old->context == fence->context ||
dma_fence_is_signaled(old_fence)) { dma_fence_is_signaled(old))
dma_fence_put(old_fence);
goto replace; goto replace;
} }
}
BUG_ON(fobj->shared_count >= fobj->shared_max); BUG_ON(fobj->shared_count >= fobj->shared_max);
old = NULL;
count++; count++;
replace: replace:
...@@ -230,6 +229,7 @@ void reservation_object_add_shared_fence(struct reservation_object *obj, ...@@ -230,6 +229,7 @@ void reservation_object_add_shared_fence(struct reservation_object *obj,
write_seqcount_end(&obj->seq); write_seqcount_end(&obj->seq);
preempt_enable(); preempt_enable();
dma_fence_put(old);
} }
EXPORT_SYMBOL(reservation_object_add_shared_fence); EXPORT_SYMBOL(reservation_object_add_shared_fence);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment