[PATCH] drm/amdgpu: clear seq64 memory on free

Christian König ckoenig.leichtzumerken at gmail.com
Tue Apr 16 12:54:34 UTC 2024


Am 16.04.24 um 14:34 schrieb Paneer Selvam, Arunpravin:
> Hi Christian,
>
> On 4/16/2024 5:47 PM, Christian König wrote:
>> Am 16.04.24 um 14:16 schrieb Paneer Selvam, Arunpravin:
>>> Hi Christian,
>>>
>>> On 4/16/2024 2:35 PM, Christian König wrote:
>>>> Am 15.04.24 um 20:48 schrieb Arunpravin Paneer Selvam:
>>>>> We should clear the memory on free. Otherwise,
>>>>> there is a chance that we will access the previous
>>>>> application data and this would leads to an abnormal
>>>>> behaviour in the current application.
>>>>
>>>> Mhm, I would strongly expect that we initialize the seq number 
>>>> after allocation.
>>>>
>>>> It could be that we also have situations were the correct start 
>>>> value is 0xffffffff or something like that instead.
>>>>
>>>> Why does this matter?
>>> when the user queue A's u64 address (fence address) is allocated to 
>>> the newly created user queue B, we see a problem.
>>> User queue B calls the signal IOCTL which creates a new fence having 
>>> the wptr as the seq number, in
>>> amdgpu_userq_fence_create function we have a check where we are 
>>> comparing the rptr and wptr value (rptr >= wptr).
>>> since the rptr value is read from the u64 address which has the user 
>>> queue A's wptr data, this rptr >= wptr condition
>>> gets satisfied and we are dropping the reference before the actual 
>>> command gets processed in the hardware.
>>> If we clear this u64 value on free, we dont see this problem.
>>
>> Yeah, but that doesn't belongs into the seq64 handling.
>>
>> Instead the code which allocates the seq64 during userqueue created 
>> needs to clear it to 0.
> sure, got it.

Yeah, but fixing that aside. We should probably initialize the seq64 
array to something like 0xdeadbeef or a similar pattern to find issues 
were we forget to initialize the allocated slots.

Regards,
Christian.

>
> Thanks,
> Arun.
>>
>> Regards,
>> Christian.
>>
>>>
>>> Thanks,
>>> Arun.
>>>>
>>>> Regards,
>>>> Christian.
>>>>
>>>>>
>>>>> Signed-off-by: Arunpravin Paneer Selvam 
>>>>> <Arunpravin.PaneerSelvam at amd.com>
>>>>> ---
>>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_seq64.c | 6 +++++-
>>>>>   1 file changed, 5 insertions(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_seq64.c 
>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_seq64.c
>>>>> index 4b9afc4df031..9613992c9804 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_seq64.c
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_seq64.c
>>>>> @@ -189,10 +189,14 @@ int amdgpu_seq64_alloc(struct amdgpu_device 
>>>>> *adev, u64 *va, u64 **cpu_addr)
>>>>>   void amdgpu_seq64_free(struct amdgpu_device *adev, u64 va)
>>>>>   {
>>>>>       unsigned long bit_pos;
>>>>> +    u64 *cpu_addr;
>>>>>         bit_pos = (va - amdgpu_seq64_get_va_base(adev)) / 
>>>>> sizeof(u64);
>>>>> -    if (bit_pos < adev->seq64.num_sem)
>>>>> +    if (bit_pos < adev->seq64.num_sem) {
>>>>> +        cpu_addr = bit_pos + adev->seq64.cpu_base_addr;
>>>>> +        memset(cpu_addr, 0, sizeof(u64));
>>>>>           __clear_bit(bit_pos, adev->seq64.used);
>>>>> +    }
>>>>>   }
>>>>>     /**
>>>>
>>>
>>
>



More information about the amd-gfx mailing list