diff options
author | Roger.He <Hongbo.He@amd.com> | 2017-05-05 01:27:10 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-05-24 17:40:31 -0400 |
commit | 738f64ccc237f80b7673a6cc43051916eb90dc27 (patch) | |
tree | 6eb7dc7516db9f9cdf7c463643b9ec9bcf091ac7 /drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | |
parent | 455a7bc27c2118c7e0531b7502dedc80ed2f9d40 (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.c | 22 |
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(>t->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(>t->adev->gtt_list_lock); | 759 | |
759 | list_add_tail(>t->list, >t->adev->gtt_list); | 760 | list_add_tail(>t->list, >t->adev->gtt_list); |
761 | error_gart_bind: | ||
760 | spin_unlock(>t->adev->gtt_list_lock); | 762 | spin_unlock(>t->adev->gtt_list_lock); |
761 | return 0; | 763 | return r; |
762 | } | 764 | } |
763 | 765 | ||
764 | int amdgpu_ttm_recover_gart(struct amdgpu_device *adev) | 766 | int amdgpu_ttm_recover_gart(struct amdgpu_device *adev) |
@@ -789,6 +791,7 @@ int amdgpu_ttm_recover_gart(struct amdgpu_device *adev) | |||
789 | static int amdgpu_ttm_backend_unbind(struct ttm_tt *ttm) | 791 | static 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(>t->adev->gtt_list_lock); | 803 | spin_lock(>t->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(>t->list); | 810 | list_del_init(>t->list); |
811 | error_unbind: | ||
805 | spin_unlock(>t->adev->gtt_list_lock); | 812 | spin_unlock(>t->adev->gtt_list_lock); |
806 | 813 | return r; | |
807 | return 0; | ||
808 | } | 814 | } |
809 | 815 | ||
810 | static void amdgpu_ttm_backend_destroy(struct ttm_tt *ttm) | 816 | static void amdgpu_ttm_backend_destroy(struct ttm_tt *ttm) |