[PATCH] dma-buf/reservation: should keep later one in add fence(v3)
Christian König
ckoenig.leichtzumerken at gmail.com
Tue Mar 6 08:08:28 UTC 2018
And still a NAK, the prerequisite for adding a shared fence is that it
is later than any existing fence in that context.
In other words reservation_object_add_shared_fence() is always called
with a new fence, never with some old one.
So the whole checking here is completely superfluous,
Christian.
Am 06.03.2018 um 08:00 schrieb Monk Liu:
> v2:
> still check context first to avoid warning from dma_fence_is_later
> apply this fix in add_shared_replace as well
>
> v3:
> use a bool falg to indict if fence is need to insert to new slot
> and ignore it if it is an eld fence compared with the one with
> the same context in old->shared
>
> Change-Id: If6a979ba9fd6c923b82212f35f07a9ff31c86767
> Signed-off-by: Monk Liu <Monk.Liu at amd.com>
> ---
> drivers/dma-buf/reservation.c | 28 ++++++++++++++++++++++------
> 1 file changed, 22 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/dma-buf/reservation.c b/drivers/dma-buf/reservation.c
> index 314eb10..a7d0598 100644
> --- a/drivers/dma-buf/reservation.c
> +++ b/drivers/dma-buf/reservation.c
> @@ -118,7 +118,8 @@ reservation_object_add_shared_inplace(struct reservation_object *obj,
> old_fence = rcu_dereference_protected(fobj->shared[i],
> reservation_object_held(obj));
>
> - if (old_fence->context == fence->context) {
> + if (old_fence->context == fence->context &&
> + dma_fence_is_later(fence, old_fence)) {
> /* memory barrier is added by write_seqcount_begin */
> RCU_INIT_POINTER(fobj->shared[i], fence);
> write_seqcount_end(&obj->seq);
> @@ -158,6 +159,7 @@ reservation_object_add_shared_replace(struct reservation_object *obj,
> struct dma_fence *fence)
> {
> unsigned i, j, k;
> + bool wrong_fence = false;
>
> dma_fence_get(fence);
>
> @@ -179,15 +181,29 @@ reservation_object_add_shared_replace(struct reservation_object *obj,
> check = rcu_dereference_protected(old->shared[i],
> reservation_object_held(obj));
>
> - if (check->context == fence->context ||
> - dma_fence_is_signaled(check))
> + if (dma_fence_is_signaled(check)) {
> + /* put check to tail of fobj if signaled */
> RCU_INIT_POINTER(fobj->shared[--k], check);
> - else
> + } else if (check->context == fence->context) {
> + if (dma_fence_is_later(fence, check)) {
> + /* put check to tail of fobj if it is deprecated */
> + RCU_INIT_POINTER(fobj->shared[--k], check);
> + } else {
> + /* this is a wrong operation that add an eld fence */
> + wrong_fence = true;
> + RCU_INIT_POINTER(fobj->shared[j++], check);
> + }
> + } else {
> + /* add fence to new slot */
> RCU_INIT_POINTER(fobj->shared[j++], check);
> + }
> }
> +
> fobj->shared_count = j;
> - RCU_INIT_POINTER(fobj->shared[fobj->shared_count], fence);
> - fobj->shared_count++;
> + if (!wrong_fence) {
> + RCU_INIT_POINTER(fobj->shared[fobj->shared_count], fence);
> + fobj->shared_count++;
> + }
>
> done:
> preempt_disable();
More information about the dri-devel
mailing list