diff options
author | Monk Liu <Monk.Liu@amd.com> | 2017-11-13 22:55:50 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-12-06 12:47:50 -0500 |
commit | f59548c8824c8e361120bf87a12fc3a68f17a1ce (patch) | |
tree | ebb0f4b2c2f814d45f20c76e5474aa5bb1563660 /drivers/gpu | |
parent | c79ee7d8c6cba8775b842063cf5bcdf101dc1e36 (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.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 2 |
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 | ||
1414 | int amdgpu_fw_reserve_vram_init(struct amdgpu_device *adev); | 1414 | int amdgpu_fw_reserve_vram_init(struct amdgpu_device *adev); |
1415 | void 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 | */ |
272 | void amdgpu_gart_fini(struct amdgpu_device *adev) | 270 | void 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; |