[PATCH] drm/amdgpu: fix memory leak in wait_all_fence

Christian König deathsimple at vodafone.de
Fri Apr 7 08:55:36 UTC 2017


Am 07.04.2017 um 10:46 schrieb zhoucm1:
>
>
> On 2017年04月07日 16:36, Christian König wrote:
>> Am 07.04.2017 um 05:36 schrieb Chunming Zhou:
>>> Change-Id: Ib3e271e00e49f10152c1b3eace981a6bf78820de
>>> Signed-off-by: Chunming Zhou <David1.Zhou at amd.com>
>>
>> NAK, that will allocate an array for the fence again, which we wanted 
>> to avoid.
> I don't got your means, the **array just to store fence temporary, 
> freed at the end.

Yeah, but that is unnecessary. We created this function to just avoid that.

>
>>
>> We should just drop the fence reference directly after waiting for it.
> How to handle err case in the middle.

just put a fence_put() directly after fence_wait_timeout(). We don't 
need to keep a reference to the fence till the end.

Regards,
Christian.

>
> Regards,
> David Zhou
>>
>> Regards,
>> Christian.
>>
>>> ---
>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 25 +++++++++++++++++++------
>>>   1 file changed, 19 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c 
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
>>> index de1c4c3..d842452 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
>>> @@ -1216,22 +1216,28 @@ static int amdgpu_cs_wait_all_fences(struct 
>>> amdgpu_device *adev,
>>>                        struct drm_amdgpu_fence *fences)
>>>   {
>>>       uint32_t fence_count = wait->in.fence_count;
>>> +    struct fence **array;
>>>       unsigned int i;
>>>       long r = 1;
>>>   +    array = kcalloc(fence_count, sizeof(struct fence *), 
>>> GFP_KERNEL);
>>> +
>>> +    if (array == NULL)
>>> +        return -ENOMEM;
>>>       for (i = 0; i < fence_count; i++) {
>>>           struct fence *fence;
>>>           unsigned long timeout = 
>>> amdgpu_gem_timeout(wait->in.timeout_ns);
>>>             fence = amdgpu_cs_get_fence(adev, filp, &fences[i]);
>>> -        if (IS_ERR(fence))
>>> -            return PTR_ERR(fence);
>>> -        else if (!fence)
>>> +        if (IS_ERR(fence)) {
>>> +            r = PTR_ERR(fence);
>>> +            goto err;
>>> +        } else if (!fence)
>>>               continue;
>>> -
>>> +        array[i] = fence;
>>>           r = kcl_fence_wait_timeout(fence, true, timeout);
>>>           if (r < 0)
>>> -            return r;
>>> +            goto err;
>>>             if (r == 0)
>>>               break;
>>> @@ -1240,7 +1246,14 @@ static int amdgpu_cs_wait_all_fences(struct 
>>> amdgpu_device *adev,
>>>       memset(wait, 0, sizeof(*wait));
>>>       wait->out.status = (r > 0);
>>>   -    return 0;
>>> +    r = 0;
>>> +
>>> +err:
>>> +    for (i = 0; i < fence_count; i++)
>>> +        fence_put(array[i]);
>>> +    kfree(array);
>>> +
>>> +    return r;
>>>   }
>>>     /**
>>
>>
>
> _______________________________________________
> 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