[PATCH] dma-buf/reservation: should keep later one in add fence(v2)
Liu, Monk
Monk.Liu at amd.com
Tue Mar 6 07:10:46 UTC 2018
Make sense, will give v3
-----Original Message-----
From: Zhou, David(ChunMing)
Sent: 2018年3月6日 14:08
To: Liu, Monk <Monk.Liu at amd.com>; Zhou, David(ChunMing) <David1.Zhou at amd.com>; dri-devel at freedesktop.org
Subject: Re: [PATCH] dma-buf/reservation: should keep later one in add fence(v2)
On 2018年03月06日 13:59, Liu, Monk wrote:
>>
>> - 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);
> }
>
> No you cannot do that, check is changed and not the one you want,
> Besides, we don't need to consider the case you mentioned, take only one fence in obj->staged for example:
>
> You add a fence whose context is equal to this fence (check), so
> current logic will put this check into fobj->shared[++j],
Yes, if !dma_fence_is_later(fence, check), then 'check' will be put to
fobj->shared[++j], so we don't need add new fence to resv slot, don't we?
Regards,
David Zhou
> so in the end
> Obj->fence will point to fobj, and original old would be rcu_kfree()
>
> No additional action actually needed...
>
> /Monk
>
> -----Original Message-----
> From: Zhou, David(ChunMing)
> Sent: 2018年3月6日 12:25
> To: Liu, Monk <Monk.Liu at amd.com>; dri-devel at freedesktop.org
> Subject: Re: [PATCH] dma-buf/reservation: should keep later one in add
> fence(v2)
>
>
>
> 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