[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