summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjsg <jsg@openbsd.org>2019-12-31 23:54:00 +0000
committerjsg <jsg@openbsd.org>2019-12-31 23:54:00 +0000
commitee7378f06502a82ca16bdb9669891786f55b1bd7 (patch)
tree1e00208da96f8e79545859ebb7625b518a4144d6
parentdrm: mst: Fix query_payload ack reply struct (diff)
downloadwireguard-openbsd-ee7378f06502a82ca16bdb9669891786f55b1bd7.tar.xz
wireguard-openbsd-ee7378f06502a82ca16bdb9669891786f55b1bd7.zip
drm/amdgpu: grab the id mgr lock while accessing passid_mapping
From Christian Koenig 16bb81d541f31b163563fea951ccb30b0def0c0a in linux 4.19.y/4.19.92 6817bf283b2b851095825ec7f0e9f10398e09125 in mainline linux
-rw-r--r--sys/dev/pci/drm/amd/amdgpu/amdgpu_vm.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/sys/dev/pci/drm/amd/amdgpu/amdgpu_vm.c b/sys/dev/pci/drm/amd/amdgpu/amdgpu_vm.c
index d04371d8303..c4622b091a0 100644
--- a/sys/dev/pci/drm/amd/amdgpu/amdgpu_vm.c
+++ b/sys/dev/pci/drm/amd/amdgpu/amdgpu_vm.c
@@ -761,10 +761,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;
@@ -774,6 +772,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;
@@ -813,9 +817,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);