aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
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/drm/amd/amdgpu/amdgpu_gart.c
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/drm/amd/amdgpu/amdgpu_gart.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c9
1 files changed, 1 insertions, 8 deletions
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;