aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
diff options
context:
space:
mode:
authorRoger.He <Hongbo.He@amd.com>2017-05-05 01:27:10 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-05-24 17:40:31 -0400
commit738f64ccc237f80b7673a6cc43051916eb90dc27 (patch)
tree6eb7dc7516db9f9cdf7c463643b9ec9bcf091ac7 /drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
parent455a7bc27c2118c7e0531b7502dedc80ed2f9d40 (diff)
drm/amdgpu: extend lock range for race condition when gpu reset
to cover below case: 1. A task gart bind/unbind but not add to adev->gtt_list yet 2. at this time gpu reset, gtt only recover those gtt in adev->gtt_list Reviewed-by: Chunming Zhou <david1.zhou@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Roger.He <Hongbo.He@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 5db0230e45c6..fcf617c237ef 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -745,6 +745,7 @@ int amdgpu_ttm_bind(struct ttm_buffer_object *bo, struct ttm_mem_reg *bo_mem)
745 return r; 745 return r;
746 } 746 }
747 747
748 spin_lock(&gtt->adev->gtt_list_lock);
748 flags = amdgpu_ttm_tt_pte_flags(gtt->adev, ttm, bo_mem); 749 flags = amdgpu_ttm_tt_pte_flags(gtt->adev, ttm, bo_mem);
749 gtt->offset = (u64)bo_mem->start << PAGE_SHIFT; 750 gtt->offset = (u64)bo_mem->start << PAGE_SHIFT;
750 r = amdgpu_gart_bind(gtt->adev, gtt->offset, ttm->num_pages, 751 r = amdgpu_gart_bind(gtt->adev, gtt->offset, ttm->num_pages,
@@ -753,12 +754,13 @@ int amdgpu_ttm_bind(struct ttm_buffer_object *bo, struct ttm_mem_reg *bo_mem)
753 if (r) { 754 if (r) {
754 DRM_ERROR("failed to bind %lu pages at 0x%08llX\n", 755 DRM_ERROR("failed to bind %lu pages at 0x%08llX\n",
755 ttm->num_pages, gtt->offset); 756 ttm->num_pages, gtt->offset);
756 return r; 757 goto error_gart_bind;
757 } 758 }
758 spin_lock(&gtt->adev->gtt_list_lock); 759
759 list_add_tail(&gtt->list, &gtt->adev->gtt_list); 760 list_add_tail(&gtt->list, &gtt->adev->gtt_list);
761error_gart_bind:
760 spin_unlock(&gtt->adev->gtt_list_lock); 762 spin_unlock(&gtt->adev->gtt_list_lock);
761 return 0; 763 return r;
762} 764}
763 765
764int amdgpu_ttm_recover_gart(struct amdgpu_device *adev) 766int amdgpu_ttm_recover_gart(struct amdgpu_device *adev)
@@ -789,6 +791,7 @@ int amdgpu_ttm_recover_gart(struct amdgpu_device *adev)
789static int amdgpu_ttm_backend_unbind(struct ttm_tt *ttm) 791static int amdgpu_ttm_backend_unbind(struct ttm_tt *ttm)
790{ 792{
791 struct amdgpu_ttm_tt *gtt = (void *)ttm; 793 struct amdgpu_ttm_tt *gtt = (void *)ttm;
794 int r;
792 795
793 if (gtt->userptr) 796 if (gtt->userptr)
794 amdgpu_ttm_tt_unpin_userptr(ttm); 797 amdgpu_ttm_tt_unpin_userptr(ttm);
@@ -797,14 +800,17 @@ static int amdgpu_ttm_backend_unbind(struct ttm_tt *ttm)
797 return 0; 800 return 0;
798 801
799 /* unbind shouldn't be done for GDS/GWS/OA in ttm_bo_clean_mm */ 802 /* unbind shouldn't be done for GDS/GWS/OA in ttm_bo_clean_mm */
800 if (gtt->adev->gart.ready)
801 amdgpu_gart_unbind(gtt->adev, gtt->offset, ttm->num_pages);
802
803 spin_lock(&gtt->adev->gtt_list_lock); 803 spin_lock(&gtt->adev->gtt_list_lock);
804 r = amdgpu_gart_unbind(gtt->adev, gtt->offset, ttm->num_pages);
805 if (r) {
806 DRM_ERROR("failed to unbind %lu pages at 0x%08llX\n",
807 gtt->ttm.ttm.num_pages, gtt->offset);
808 goto error_unbind;
809 }
804 list_del_init(&gtt->list); 810 list_del_init(&gtt->list);
811error_unbind:
805 spin_unlock(&gtt->adev->gtt_list_lock); 812 spin_unlock(&gtt->adev->gtt_list_lock);
806 813 return r;
807 return 0;
808} 814}
809 815
810static void amdgpu_ttm_backend_destroy(struct ttm_tt *ttm) 816static void amdgpu_ttm_backend_destroy(struct ttm_tt *ttm)