Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/amdgpu: check entity lock is held in amdgpu_ttm_job_submit

drm_sched_job_arm and drm_sched_entity_push_job must be called
under the same lock to guarantee the order of execution.

This commit adds a check in amdgpu_ttm_job_submit and fix the
places where the lock was missing.

Signed-off-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Pierre-Eric Pelloux-Prayer and committed by
Alex Deucher
f633edd2 30f2daed

+8 -5
+8 -5
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
··· 163 163 } 164 164 165 165 static struct dma_fence * 166 - amdgpu_ttm_job_submit(struct amdgpu_device *adev, struct amdgpu_job *job, u32 num_dw) 166 + amdgpu_ttm_job_submit(struct amdgpu_device *adev, struct amdgpu_ttm_buffer_entity *entity, 167 + struct amdgpu_job *job, u32 num_dw) 167 168 { 168 169 struct amdgpu_ring *ring; 169 170 170 171 ring = adev->mman.buffer_funcs_ring; 171 172 amdgpu_ring_pad_ib(ring, &job->ibs[0]); 172 173 WARN_ON(job->ibs[0].length_dw > num_dw); 174 + 175 + lockdep_assert_held(&entity->lock); 173 176 174 177 return amdgpu_job_submit(job); 175 178 } ··· 270 267 amdgpu_gart_map_vram_range(adev, pa, 0, num_pages, flags, cpu_addr); 271 268 } 272 269 273 - dma_fence_put(amdgpu_ttm_job_submit(adev, job, num_dw)); 270 + dma_fence_put(amdgpu_ttm_job_submit(adev, entity, job, num_dw)); 274 271 return 0; 275 272 } 276 273 ··· 1592 1589 amdgpu_emit_copy_buffer(adev, &job->ibs[0], src_addr, dst_addr, 1593 1590 PAGE_SIZE, 0); 1594 1591 1595 - fence = amdgpu_ttm_job_submit(adev, job, num_dw); 1592 + fence = amdgpu_ttm_job_submit(adev, &adev->mman.default_entity, job, num_dw); 1596 1593 mutex_unlock(&adev->mman.default_entity.lock); 1597 1594 1598 1595 if (!dma_fence_wait_timeout(fence, false, adev->sdma_timeout)) ··· 2489 2486 byte_count -= cur_size_in_bytes; 2490 2487 } 2491 2488 2492 - *fence = amdgpu_ttm_job_submit(adev, job, num_dw); 2489 + *fence = amdgpu_ttm_job_submit(adev, entity, job, num_dw); 2493 2490 2494 2491 return 0; 2495 2492 ··· 2532 2529 byte_count -= cur_size; 2533 2530 } 2534 2531 2535 - *fence = amdgpu_ttm_job_submit(adev, job, num_dw); 2532 + *fence = amdgpu_ttm_job_submit(adev, entity, job, num_dw); 2536 2533 return 0; 2537 2534 } 2538 2535