[PATCH 1/2] drm/amdgpu/gfx10: fix race condition for kiq

Christian König ckoenig.leichtzumerken at gmail.com
Fri Jul 10 07:35:41 UTC 2020


Am 10.07.20 um 07:44 schrieb Jack Xiao:
> During preemption test for gfx10, it uses kiq to trigger
> gfx preemption, which would result in race condition
> with flushing TLB for kiq.
>
> Signed-off-by: Jack Xiao <Jack.Xiao at amd.com>

Acked-by: Christian König <christian.koenig at amd.com>

> ---
>   drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c | 9 ++++++++-
>   1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
> index a6170a346b39..ddf6d8128753 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
> @@ -7836,12 +7836,17 @@ static int gfx_v10_0_ring_preempt_ib(struct amdgpu_ring *ring)
>   	struct amdgpu_device *adev = ring->adev;
>   	struct amdgpu_kiq *kiq = &adev->gfx.kiq;
>   	struct amdgpu_ring *kiq_ring = &kiq->ring;
> +	unsigned long flags;
>   
>   	if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)
>   		return -EINVAL;
>   
> -	if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->unmap_queues_size))
> +	spin_lock_irqsave(&kiq->ring_lock, flags);
> +
> +	if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->unmap_queues_size)) {
> +		spin_unlock_irqrestore(&kiq->ring_lock, flags);
>   		return -ENOMEM;
> +	}
>   
>   	/* assert preemption condition */
>   	amdgpu_ring_set_preempt_cond_exec(ring, false);
> @@ -7852,6 +7857,8 @@ static int gfx_v10_0_ring_preempt_ib(struct amdgpu_ring *ring)
>   				   ++ring->trail_seq);
>   	amdgpu_ring_commit(kiq_ring);
>   
> +	spin_unlock_irqrestore(&kiq->ring_lock, flags);
> +
>   	/* poll the trailing fence */
>   	for (i = 0; i < adev->usec_timeout; i++) {
>   		if (ring->trail_seq ==



More information about the amd-gfx mailing list