aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
diff options
context:
space:
mode:
authorNicolai Hähnle <nicolai.haehnle@amd.com>2017-02-16 05:01:44 -0500
committerAlex Deucher <alexander.deucher@amd.com>2017-03-29 23:53:08 -0400
commit59c66c911fa245cd5ba764551d50abeb7882e852 (patch)
treeb8833e62b6d04fbfaf4de89bb9c6ef347b882df5 /drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
parentca9cf68de1e7429e89adb3abdd092d4873e73e29 (diff)
drm/amdgpu: simplify reservation handling during buffer creation
By using ttm_bo_init_reserved instead of the manual initialization of the reservation object, the reservation lock will be properly unlocked and destroyed when the TTM BO initialization fails. Actual deadlocks caused by the missing unlock should have been fixed by "drm/ttm: never add BO that failed to validate to the LRU list", superseding the flawed fix in commit 38fc4856ad98 ("drm/amdgpu: fix a potential deadlock in amdgpu_bo_create_restricted()"). This change fixes remaining recursive locking errors that can be seen with lock debugging enabled, and avoids the error of freeing a locked mutex. As an additional minor bonus, buffers created with resv == NULL and the AMDGPU_GEM_CREATE_VRAM_CLEARED flag are now only added to the global LRU list after the fill commands have been issued. v2: use amdgpu_bo_unreserve instead of ttm_bo_unreserve Fixes: 12a852219583 ("drm/amdgpu: improve AMDGPU_GEM_CREATE_VRAM_CLEARED handling (v2)") Signed-off-by: Nicolai Hähnle <nicolai.haehnle@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_object.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_object.c17
1 files changed, 4 insertions, 13 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index 6a609a25b3fa..759da5910b76 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -395,19 +395,10 @@ int amdgpu_bo_create_restricted(struct amdgpu_device *adev,
395 amdgpu_fill_placement_to_bo(bo, placement); 395 amdgpu_fill_placement_to_bo(bo, placement);
396 /* Kernel allocation are uninterruptible */ 396 /* Kernel allocation are uninterruptible */
397 397
398 if (!resv) {
399 bool locked;
400
401 reservation_object_init(&bo->tbo.ttm_resv);
402 locked = ww_mutex_trylock(&bo->tbo.ttm_resv.lock);
403 WARN_ON(!locked);
404 }
405
406 initial_bytes_moved = atomic64_read(&adev->num_bytes_moved); 398 initial_bytes_moved = atomic64_read(&adev->num_bytes_moved);
407 r = ttm_bo_init(&adev->mman.bdev, &bo->tbo, size, type, 399 r = ttm_bo_init_reserved(&adev->mman.bdev, &bo->tbo, size, type,
408 &bo->placement, page_align, !kernel, NULL, 400 &bo->placement, page_align, !kernel, NULL,
409 acc_size, sg, resv ? resv : &bo->tbo.ttm_resv, 401 acc_size, sg, resv, &amdgpu_ttm_bo_destroy);
410 &amdgpu_ttm_bo_destroy);
411 amdgpu_cs_report_moved_bytes(adev, 402 amdgpu_cs_report_moved_bytes(adev,
412 atomic64_read(&adev->num_bytes_moved) - initial_bytes_moved); 403 atomic64_read(&adev->num_bytes_moved) - initial_bytes_moved);
413 404
@@ -433,7 +424,7 @@ int amdgpu_bo_create_restricted(struct amdgpu_device *adev,
433 dma_fence_put(fence); 424 dma_fence_put(fence);
434 } 425 }
435 if (!resv) 426 if (!resv)
436 ww_mutex_unlock(&bo->tbo.resv->lock); 427 amdgpu_bo_unreserve(bo);
437 *bo_ptr = bo; 428 *bo_ptr = bo;
438 429
439 trace_amdgpu_bo_create(bo); 430 trace_amdgpu_bo_create(bo);