aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorMonk Liu <Monk.Liu@amd.com>2017-11-13 22:55:50 -0500
committerAlex Deucher <alexander.deucher@amd.com>2017-12-06 12:47:50 -0500
commitf59548c8824c8e361120bf87a12fc3a68f17a1ce (patch)
treeebb0f4b2c2f814d45f20c76e5474aa5bb1563660 /drivers/gpu
parentc79ee7d8c6cba8775b842063cf5bcdf101dc1e36 (diff)
drm/amdgpu:fix NULL pointer access during drv remove
NULL pointer is because original logic will step into set_pde_pte() even after the gart.ptr is freed due to there are twice gart_unbind() on all gart area. also, there are other minor fixes: 1,since gart_init only create dummy page, the corresponding gart_fini shouldn't do more like unbinding all GART, this is unnecessary because in driver fini stage all GART unbinding had already been done during each IP's SW_FINI (GMC's SW_FINI is the last one called), so remove the step for the GART unbinding in gart_fini(). 2,gart_fini() is already invoked during each GMC IP's gart_fini routine,e.g. gmc_vx_0_gart_fini(), so no need to manually call it during ttm_fini(). 3,amdgpu_gem_force_release() should be put ahead of amdgpu_vm_manager_fini() Signed-off-by: Monk Liu <Monk.Liu@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')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c9
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c2
8 files changed, 7 insertions, 14 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index a7066f55fe2c..ecc2e60e5f0c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -1412,6 +1412,7 @@ struct amdgpu_fw_vram_usage {
1412}; 1412};
1413 1413
1414int amdgpu_fw_reserve_vram_init(struct amdgpu_device *adev); 1414int amdgpu_fw_reserve_vram_init(struct amdgpu_device *adev);
1415void amdgpu_fw_reserve_vram_fini(struct amdgpu_device *adev);
1415 1416
1416/* 1417/*
1417 * CGS 1418 * CGS
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index ee2a5f9a32f0..fc34f745f058 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -2506,7 +2506,6 @@ void amdgpu_device_fini(struct amdgpu_device *adev)
2506 /* evict vram memory */ 2506 /* evict vram memory */
2507 amdgpu_bo_evict_vram(adev); 2507 amdgpu_bo_evict_vram(adev);
2508 amdgpu_ib_pool_fini(adev); 2508 amdgpu_ib_pool_fini(adev);
2509 amdgpu_fw_reserve_vram_fini(adev);
2510 amdgpu_fence_driver_fini(adev); 2509 amdgpu_fence_driver_fini(adev);
2511 amdgpu_fbdev_fini(adev); 2510 amdgpu_fbdev_fini(adev);
2512 r = amdgpu_fini(adev); 2511 r = amdgpu_fini(adev);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
index 10eeb307700c..707f85825996 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
@@ -253,10 +253,8 @@ int amdgpu_gart_init(struct amdgpu_device *adev)
253#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS 253#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS
254 /* Allocate pages table */ 254 /* Allocate pages table */
255 adev->gart.pages = vzalloc(sizeof(void *) * adev->gart.num_cpu_pages); 255 adev->gart.pages = vzalloc(sizeof(void *) * adev->gart.num_cpu_pages);
256 if (adev->gart.pages == NULL) { 256 if (adev->gart.pages == NULL)
257 amdgpu_gart_fini(adev);
258 return -ENOMEM; 257 return -ENOMEM;
259 }
260#endif 258#endif
261 259
262 return 0; 260 return 0;
@@ -271,11 +269,6 @@ int amdgpu_gart_init(struct amdgpu_device *adev)
271 */ 269 */
272void amdgpu_gart_fini(struct amdgpu_device *adev) 270void amdgpu_gart_fini(struct amdgpu_device *adev)
273{ 271{
274 if (adev->gart.ready) {
275 /* unbind pages */
276 amdgpu_gart_unbind(adev, 0, adev->gart.num_cpu_pages);
277 }
278 adev->gart.ready = false;
279#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS 272#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS
280 vfree(adev->gart.pages); 273 vfree(adev->gart.pages);
281 adev->gart.pages = NULL; 274 adev->gart.pages = NULL;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index d49c768cf3dc..07ecf721ebf9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -1402,6 +1402,7 @@ void amdgpu_ttm_fini(struct amdgpu_device *adev)
1402 1402
1403 amdgpu_ttm_debugfs_fini(adev); 1403 amdgpu_ttm_debugfs_fini(adev);
1404 amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, NULL); 1404 amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, NULL);
1405 amdgpu_fw_reserve_vram_fini(adev);
1405 1406
1406 ttm_bo_clean_mm(&adev->mman.bdev, TTM_PL_VRAM); 1407 ttm_bo_clean_mm(&adev->mman.bdev, TTM_PL_VRAM);
1407 ttm_bo_clean_mm(&adev->mman.bdev, TTM_PL_TT); 1408 ttm_bo_clean_mm(&adev->mman.bdev, TTM_PL_TT);
@@ -1412,7 +1413,6 @@ void amdgpu_ttm_fini(struct amdgpu_device *adev)
1412 if (adev->gds.oa.total_size) 1413 if (adev->gds.oa.total_size)
1413 ttm_bo_clean_mm(&adev->mman.bdev, AMDGPU_PL_OA); 1414 ttm_bo_clean_mm(&adev->mman.bdev, AMDGPU_PL_OA);
1414 ttm_bo_device_release(&adev->mman.bdev); 1415 ttm_bo_device_release(&adev->mman.bdev);
1415 amdgpu_gart_fini(adev);
1416 amdgpu_ttm_global_fini(adev); 1416 amdgpu_ttm_global_fini(adev);
1417 adev->mman.initialized = false; 1417 adev->mman.initialized = false;
1418 DRM_INFO("amdgpu: ttm finalized\n"); 1418 DRM_INFO("amdgpu: ttm finalized\n");
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
index f3e5c9c6a52d..9c672ece9f18 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
@@ -899,9 +899,9 @@ static int gmc_v6_0_sw_fini(void *handle)
899{ 899{
900 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 900 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
901 901
902 amdgpu_gem_force_release(adev);
902 amdgpu_vm_manager_fini(adev); 903 amdgpu_vm_manager_fini(adev);
903 gmc_v6_0_gart_fini(adev); 904 gmc_v6_0_gart_fini(adev);
904 amdgpu_gem_force_release(adev);
905 amdgpu_bo_fini(adev); 905 amdgpu_bo_fini(adev);
906 release_firmware(adev->mc.fw); 906 release_firmware(adev->mc.fw);
907 adev->mc.fw = NULL; 907 adev->mc.fw = NULL;
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
index 6d153fa8175c..de7a249f0e24 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
@@ -1049,9 +1049,9 @@ static int gmc_v7_0_sw_fini(void *handle)
1049{ 1049{
1050 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1050 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1051 1051
1052 amdgpu_gem_force_release(adev);
1052 amdgpu_vm_manager_fini(adev); 1053 amdgpu_vm_manager_fini(adev);
1053 gmc_v7_0_gart_fini(adev); 1054 gmc_v7_0_gart_fini(adev);
1054 amdgpu_gem_force_release(adev);
1055 amdgpu_bo_fini(adev); 1055 amdgpu_bo_fini(adev);
1056 release_firmware(adev->mc.fw); 1056 release_firmware(adev->mc.fw);
1057 adev->mc.fw = NULL; 1057 adev->mc.fw = NULL;
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
index 7ee5f21295d4..67778744da5a 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
@@ -1146,9 +1146,9 @@ static int gmc_v8_0_sw_fini(void *handle)
1146{ 1146{
1147 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1147 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1148 1148
1149 amdgpu_gem_force_release(adev);
1149 amdgpu_vm_manager_fini(adev); 1150 amdgpu_vm_manager_fini(adev);
1150 gmc_v8_0_gart_fini(adev); 1151 gmc_v8_0_gart_fini(adev);
1151 amdgpu_gem_force_release(adev);
1152 amdgpu_bo_fini(adev); 1152 amdgpu_bo_fini(adev);
1153 release_firmware(adev->mc.fw); 1153 release_firmware(adev->mc.fw);
1154 adev->mc.fw = NULL; 1154 adev->mc.fw = NULL;
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
index 4960805bf989..798f7fc2d4e9 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
@@ -885,9 +885,9 @@ static int gmc_v9_0_sw_fini(void *handle)
885{ 885{
886 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 886 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
887 887
888 amdgpu_gem_force_release(adev);
888 amdgpu_vm_manager_fini(adev); 889 amdgpu_vm_manager_fini(adev);
889 gmc_v9_0_gart_fini(adev); 890 gmc_v9_0_gart_fini(adev);
890 amdgpu_gem_force_release(adev);
891 amdgpu_bo_fini(adev); 891 amdgpu_bo_fini(adev);
892 892
893 return 0; 893 return 0;