[PATCH 1/2] dma-buf: keep only not signaled fence in reservation_object_add_shared_replace

Christian König ckoenig.leichtzumerken at gmail.com
Tue Oct 31 08:42:25 UTC 2017


Looks like v2 never made it to the list. I've just send the V2 patches 
once more.

Christian.

Am 31.10.2017 um 08:26 schrieb Chunming Zhou:
> Any update?
>
>
> On 2017年10月25日 15:28, Christian König wrote:
>> Am 25.10.2017 um 08:42 schrieb Chunming Zhou:
>>>
>>>
>>> On 2017年10月24日 21:55, Christian König wrote:
>>>> From: Christian König <christian.koenig at amd.com>
>>>>
>>>> The amdgpu issue to also need signaled fences in the reservation 
>>>> objects
>>>> should be fixed by now.
>>>>
>>>> Optimize the list by keeping only the not signaled yet fences around.
>>>>
>>>> Signed-off-by: Christian König <christian.koenig at amd.com>
>>>> ---
>>>>   drivers/dma-buf/reservation.c | 31 +++++++++++++++++++++----------
>>>>   1 file changed, 21 insertions(+), 10 deletions(-)
>>>>
>>>> diff --git a/drivers/dma-buf/reservation.c 
>>>> b/drivers/dma-buf/reservation.c
>>>> index b44d9d7db347..4ede77d1bb31 100644
>>>> --- a/drivers/dma-buf/reservation.c
>>>> +++ b/drivers/dma-buf/reservation.c
>>>> @@ -145,8 +145,8 @@ reservation_object_add_shared_replace(struct 
>>>> reservation_object *obj,
>>>>                         struct reservation_object_list *fobj,
>>>>                         struct dma_fence *fence)
>>>>   {
>>>> -    unsigned i;
>>>>       struct dma_fence *old_fence = NULL;
>>>> +    unsigned i, j, k;
>>>>         dma_fence_get(fence);
>>>>   @@ -162,9 +162,7 @@ reservation_object_add_shared_replace(struct 
>>>> reservation_object *obj,
>>>>        * references from the old struct are carried over to
>>>>        * the new.
>>>>        */
>>>> -    fobj->shared_count = old->shared_count;
>>>> -
>>>> -    for (i = 0; i < old->shared_count; ++i) {
>>>> +    for (i = 0, j = 0, k = old->shared_count; i < 
>>>> old->shared_count; ++i) {
>>>>           struct dma_fence *check;
>>>>             check = rcu_dereference_protected(old->shared[i],
>>>> @@ -172,10 +170,14 @@ reservation_object_add_shared_replace(struct 
>>>> reservation_object *obj,
>>>>             if (!old_fence && check->context == fence->context) {
>>>>               old_fence = check;
>>>> -            RCU_INIT_POINTER(fobj->shared[i], fence);
>>>> -        } else
>>>> -            RCU_INIT_POINTER(fobj->shared[i], check);
>>>> +            RCU_INIT_POINTER(fobj->shared[j++], fence);
>>>> +        } else if (!dma_fence_is_signaled(check)) {
>>>> +            RCU_INIT_POINTER(fobj->shared[j++], check);
>>>> +        } else {
>>>> +            RCU_INIT_POINTER(fobj->shared[--k], check);
>>>> +        }
>>>>       }
>>>> +    fobj->shared_count = j;
>>>>       if (!old_fence) {
>>>> RCU_INIT_POINTER(fobj->shared[fobj->shared_count], fence);
>>> Here there is a memory leak for signaled fence slots, since you 
>>> re-order the slots, the j'th slot is storing signaled fence, there 
>>> is no place to put it when you assign to new one.
>>> you cam move it to end or put it here first.
>>
>> Good point, thanks. Going to respin.
>>
>> Regards,
>> Christian.
>>
>>>
>>> Regards,
>>> David Zhou
>>>>           fobj->shared_count++;
>>>> @@ -192,10 +194,19 @@ reservation_object_add_shared_replace(struct 
>>>> reservation_object *obj,
>>>>       write_seqcount_end(&obj->seq);
>>>>       preempt_enable();
>>>>   -    if (old)
>>>> -        kfree_rcu(old, rcu);
>>>> -
>>>>       dma_fence_put(old_fence);
>>>> +
>>>> +    if (!old)
>>>> +        return;
>>>> +
>>>> +    for (i = fobj->shared_count; i < old->shared_count; ++i) {
>>>> +        struct dma_fence *f;
>>>> +
>>>> +        f = rcu_dereference_protected(fobj->shared[i],
>>>> +                          reservation_object_held(obj));
>>>> +        dma_fence_put(f);
>>>> +    }
>>>> +    kfree_rcu(old, rcu);
>>>>   }
>>>>     /**
>>>
>>
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx




More information about the amd-gfx mailing list