drm/amdgpu/gfx10: fix race condition for kiq
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@amd.com> Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com> Acked-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
2b9f78481b
commit
926ee775ba
|
@ -7836,12 +7836,17 @@ static int gfx_v10_0_ring_preempt_ib(struct amdgpu_ring *ring)
|
||||||
struct amdgpu_device *adev = ring->adev;
|
struct amdgpu_device *adev = ring->adev;
|
||||||
struct amdgpu_kiq *kiq = &adev->gfx.kiq;
|
struct amdgpu_kiq *kiq = &adev->gfx.kiq;
|
||||||
struct amdgpu_ring *kiq_ring = &kiq->ring;
|
struct amdgpu_ring *kiq_ring = &kiq->ring;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)
|
if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)
|
||||||
return -EINVAL;
|
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;
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
/* assert preemption condition */
|
/* assert preemption condition */
|
||||||
amdgpu_ring_set_preempt_cond_exec(ring, false);
|
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);
|
++ring->trail_seq);
|
||||||
amdgpu_ring_commit(kiq_ring);
|
amdgpu_ring_commit(kiq_ring);
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&kiq->ring_lock, flags);
|
||||||
|
|
||||||
/* poll the trailing fence */
|
/* poll the trailing fence */
|
||||||
for (i = 0; i < adev->usec_timeout; i++) {
|
for (i = 0; i < adev->usec_timeout; i++) {
|
||||||
if (ring->trail_seq ==
|
if (ring->trail_seq ==
|
||||||
|
|
Loading…
Reference in New Issue