[PATCH 1/1] drm/amdgpu: wrap kiq ring ops with kiq spinlock
Christian König
christian.koenig at amd.com
Fri Mar 12 10:40:24 UTC 2021
Am 12.03.21 um 11:24 schrieb Nirmoy:
>
> On 3/12/21 10:52 AM, Christian König wrote:
>> Am 12.03.21 um 10:49 schrieb Nirmoy Das:
>>> KIQ ring is being operated by kfd as well as amdgpu.
>>> KFD is using kiq lock, we should the same from amdgpu side
>>> as well.
>>
>> Ah, now I knew which functions you mean. This is not strictly
>> necessary because that stuff is only called during bootup and not
>> later on.
>
>
> OK, not so serious issue as I was thinking then.
>
>
>>
>>>
>>> Signed-off-by: Nirmoy Das <nirmoy.das at amd.com>
>>> ---
>>> drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c | 10 ++++++++--
>>> 1 file changed, 8 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
>>> index 1915b9b95106..8fe370e5358d 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
>>> @@ -467,13 +467,17 @@ int amdgpu_gfx_disable_kcq(struct
>>> amdgpu_device *adev)
>>> if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)
>>> return -EINVAL;
>>> + spin_lock(&adev->gfx.kiq.ring_lock);
>>> if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->unmap_queues_size *
>>> - adev->gfx.num_compute_rings))
>>> + adev->gfx.num_compute_rings)) {
>>> + spin_unlock(&adev->gfx.kiq.ring_lock);
>>> return -ENOMEM;
>>> + }
>>> for (i = 0; i < adev->gfx.num_compute_rings; i++)
>>> kiq->pmf->kiq_unmap_queues(kiq_ring,
>>> &adev->gfx.compute_ring[i],
>>> RESET_QUEUES, 0, 0);
>>> + spin_unlock(&adev->gfx.kiq.ring_lock);
>>> return amdgpu_ring_test_helper(kiq_ring);
>>
>> The ring test accesses the ring buffer as well.
>
>
> Shall I send a v2 ?
I'm not 100% sure. Please test this with lockdep enabled, if that
doesn't raise anything we can probably commit it just to be on the clean
side.
Regards,
Christian.
>
>
> Thanks,
>
> Nirmoy
>
>
>>
>>
>> Regards,
>> Christian.
>>
>>> }
>>> @@ -518,18 +522,20 @@ int amdgpu_gfx_enable_kcq(struct amdgpu_device
>>> *adev)
>>> DRM_INFO("kiq ring mec %d pipe %d q %d\n", kiq_ring->me,
>>> kiq_ring->pipe,
>>> kiq_ring->queue);
>>> -
>>> + spin_lock(&adev->gfx.kiq.ring_lock);
>>> r = amdgpu_ring_alloc(kiq_ring, kiq->pmf->map_queues_size *
>>> adev->gfx.num_compute_rings +
>>> kiq->pmf->set_resources_size);
>>> if (r) {
>>> DRM_ERROR("Failed to lock KIQ (%d).\n", r);
>>> + spin_unlock(&adev->gfx.kiq.ring_lock);
>>> return r;
>>> }
>>> kiq->pmf->kiq_set_resources(kiq_ring, queue_mask);
>>> for (i = 0; i < adev->gfx.num_compute_rings; i++)
>>> kiq->pmf->kiq_map_queues(kiq_ring,
>>> &adev->gfx.compute_ring[i]);
>>> + spin_unlock(&adev->gfx.kiq.ring_lock);
>>> r = amdgpu_ring_test_helper(kiq_ring);
>>> if (r)
>>
More information about the amd-gfx
mailing list