[PATCH] dma-buf/reservation: should keep later one in add fence(v2)

zhoucm1 zhoucm1 at amd.com
Tue Mar 6 04:25:00 UTC 2018



On 2018年03月06日 11:53, Monk Liu wrote:
> v2:
> still check context first to avoid warning from dma_fence_is_later
> apply this fix in add_shared_replace as well
>
> Change-Id: If6a979ba9fd6c923b82212f35f07a9ff31c86767
> Signed-off-by: Monk Liu <Monk.Liu at amd.com>
> ---
>   drivers/dma-buf/reservation.c | 6 ++++--
>   1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/dma-buf/reservation.c b/drivers/dma-buf/reservation.c
> index 314eb10..c6e3c86 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);
> @@ -179,7 +180,8 @@ 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 ||
> +		if ((check->context == fence->context &&
> +			dma_fence_is_later(fence, check)) ||
We still need do more for !dma_fence_is_later(fence, check)   case, in 
which, we will don't need add new fence to resv slot.

if ((check->context == fence->context) && dma_fence_is_later(fence, check))
         fobj->shared_count = j;
         RCU_INIT_POINTER(fobj->shared[fobj->shared_count], fence);
         fobj->shared_count++;
} else {
         dma_fence_put(fence);
}


Regards,
David Zhou
>   		    dma_fence_is_signaled(check))
>   			RCU_INIT_POINTER(fobj->shared[--k], check);
>   		else



More information about the dri-devel mailing list