aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3792-drm-amdgpu-grab-the-id-mgr-lock-while-accessing-pass.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3792-drm-amdgpu-grab-the-id-mgr-lock-while-accessing-pass.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3792-drm-amdgpu-grab-the-id-mgr-lock-while-accessing-pass.patch62
1 files changed, 62 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3792-drm-amdgpu-grab-the-id-mgr-lock-while-accessing-pass.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3792-drm-amdgpu-grab-the-id-mgr-lock-while-accessing-pass.patch
new file mode 100644
index 00000000..20a375a9
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3792-drm-amdgpu-grab-the-id-mgr-lock-while-accessing-pass.patch
@@ -0,0 +1,62 @@
+From 87ba454d8392ee80af5928491857f298f2588638 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Mon, 9 Sep 2019 13:57:32 +0200
+Subject: [PATCH 3792/4256] drm/amdgpu: grab the id mgr lock while accessing
+ passid_mapping
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Need to make sure that we actually dropping the right fence.
+Could be done with RCU as well, but to complicated for a fix.
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Reviewed-by: Chunming Zhou <david1.zhou@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+index 31b25d27e50e..6865baac7823 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+@@ -1009,10 +1009,8 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job, bool need_
+ id->oa_base != job->oa_base ||
+ id->oa_size != job->oa_size);
+ bool vm_flush_needed = job->vm_needs_flush;
+- bool pasid_mapping_needed = id->pasid != job->pasid ||
+- !id->pasid_mapping ||
+- !dma_fence_is_signaled(id->pasid_mapping);
+ struct dma_fence *fence = NULL;
++ bool pasid_mapping_needed;
+ unsigned patch_offset = 0;
+ int r;
+
+@@ -1022,6 +1020,12 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job, bool need_
+ pasid_mapping_needed = true;
+ }
+
++ mutex_lock(&id_mgr->lock);
++ if (id->pasid != job->pasid || !id->pasid_mapping ||
++ !dma_fence_is_signaled(id->pasid_mapping))
++ pasid_mapping_needed = true;
++ mutex_unlock(&id_mgr->lock);
++
+ gds_switch_needed &= !!ring->funcs->emit_gds_switch;
+ vm_flush_needed &= !!ring->funcs->emit_vm_flush &&
+ job->vm_pd_addr != AMDGPU_BO_INVALID_OFFSET;
+@@ -1061,9 +1065,11 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job, bool need_
+ }
+
+ if (pasid_mapping_needed) {
++ mutex_lock(&id_mgr->lock);
+ id->pasid = job->pasid;
+ dma_fence_put(id->pasid_mapping);
+ id->pasid_mapping = dma_fence_get(fence);
++ mutex_unlock(&id_mgr->lock);
+ }
+ dma_fence_put(fence);
+
+--
+2.17.1
+