aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2018-07-12 08:31:25 -0400
committerAlex Deucher <alexander.deucher@amd.com>2018-07-13 15:45:49 -0400
commitb7d85e1db32ea85b09f58f416da48f44285ff41f (patch)
tree25fcbd753f5cb622fdd7e9e35a46fb4578671d9c /drivers/gpu/drm
parent44a99b65fc27474b66f7173b971bfbd67ca6ba74 (diff)
drm/amdgpu: fix TTM move entity init order
We are initializing the entity before the scheduler is actually initialized. This can lead to all kind of problem, but especially NULL pointer deref because of Nayan's scheduler work. Signed-off-by: Christian König <christian.koenig@amd.com> Acked-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c37
1 files changed, 21 insertions, 16 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 0e47f15b0f97..6a3fead5c1f0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -104,8 +104,6 @@ static void amdgpu_ttm_mem_global_release(struct drm_global_reference *ref)
104static int amdgpu_ttm_global_init(struct amdgpu_device *adev) 104static int amdgpu_ttm_global_init(struct amdgpu_device *adev)
105{ 105{
106 struct drm_global_reference *global_ref; 106 struct drm_global_reference *global_ref;
107 struct amdgpu_ring *ring;
108 struct drm_sched_rq *rq;
109 int r; 107 int r;
110 108
111 /* ensure reference is false in case init fails */ 109 /* ensure reference is false in case init fails */
@@ -138,21 +136,10 @@ static int amdgpu_ttm_global_init(struct amdgpu_device *adev)
138 136
139 mutex_init(&adev->mman.gtt_window_lock); 137 mutex_init(&adev->mman.gtt_window_lock);
140 138
141 ring = adev->mman.buffer_funcs_ring;
142 rq = &ring->sched.sched_rq[DRM_SCHED_PRIORITY_KERNEL];
143 r = drm_sched_entity_init(&ring->sched, &adev->mman.entity,
144 rq, NULL);
145 if (r) {
146 DRM_ERROR("Failed setting up TTM BO move run queue.\n");
147 goto error_entity;
148 }
149
150 adev->mman.mem_global_referenced = true; 139 adev->mman.mem_global_referenced = true;
151 140
152 return 0; 141 return 0;
153 142
154error_entity:
155 drm_global_item_unref(&adev->mman.bo_global_ref.ref);
156error_bo: 143error_bo:
157 drm_global_item_unref(&adev->mman.mem_global_ref); 144 drm_global_item_unref(&adev->mman.mem_global_ref);
158error_mem: 145error_mem:
@@ -162,8 +149,6 @@ error_mem:
162static void amdgpu_ttm_global_fini(struct amdgpu_device *adev) 149static void amdgpu_ttm_global_fini(struct amdgpu_device *adev)
163{ 150{
164 if (adev->mman.mem_global_referenced) { 151 if (adev->mman.mem_global_referenced) {
165 drm_sched_entity_destroy(adev->mman.entity.sched,
166 &adev->mman.entity);
167 mutex_destroy(&adev->mman.gtt_window_lock); 152 mutex_destroy(&adev->mman.gtt_window_lock);
168 drm_global_item_unref(&adev->mman.bo_global_ref.ref); 153 drm_global_item_unref(&adev->mman.bo_global_ref.ref);
169 drm_global_item_unref(&adev->mman.mem_global_ref); 154 drm_global_item_unref(&adev->mman.mem_global_ref);
@@ -1921,10 +1906,30 @@ void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev, bool enable)
1921{ 1906{
1922 struct ttm_mem_type_manager *man = &adev->mman.bdev.man[TTM_PL_VRAM]; 1907 struct ttm_mem_type_manager *man = &adev->mman.bdev.man[TTM_PL_VRAM];
1923 uint64_t size; 1908 uint64_t size;
1909 int r;
1924 1910
1925 if (!adev->mman.initialized || adev->in_gpu_reset) 1911 if (!adev->mman.initialized || adev->in_gpu_reset ||
1912 adev->mman.buffer_funcs_enabled == enable)
1926 return; 1913 return;
1927 1914
1915 if (enable) {
1916 struct amdgpu_ring *ring;
1917 struct drm_sched_rq *rq;
1918
1919 ring = adev->mman.buffer_funcs_ring;
1920 rq = &ring->sched.sched_rq[DRM_SCHED_PRIORITY_KERNEL];
1921 r = drm_sched_entity_init(&ring->sched, &adev->mman.entity,
1922 rq, NULL);
1923 if (r) {
1924 DRM_ERROR("Failed setting up TTM BO move entity (%d)\n",
1925 r);
1926 return;
1927 }
1928 } else {
1929 drm_sched_entity_destroy(adev->mman.entity.sched,
1930 &adev->mman.entity);
1931 }
1932
1928 /* this just adjusts TTM size idea, which sets lpfn to the correct value */ 1933 /* this just adjusts TTM size idea, which sets lpfn to the correct value */
1929 if (enable) 1934 if (enable)
1930 size = adev->gmc.real_vram_size; 1935 size = adev->gmc.real_vram_size;