diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2206-drm-amdgpu-fix-NULL-pointer-access-during-drv-remove.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2206-drm-amdgpu-fix-NULL-pointer-access-during-drv-remove.patch | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2206-drm-amdgpu-fix-NULL-pointer-access-during-drv-remove.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2206-drm-amdgpu-fix-NULL-pointer-access-during-drv-remove.patch new file mode 100644 index 00000000..b2abdb88 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2206-drm-amdgpu-fix-NULL-pointer-access-during-drv-remove.patch @@ -0,0 +1,177 @@ +From c5478c28896a9c780a663a9df488f64cdd767a55 Mon Sep 17 00:00:00 2001 +From: Monk Liu <Monk.Liu@amd.com> +Date: Tue, 14 Nov 2017 11:55:50 +0800 +Subject: [PATCH 2206/4131] drm/amdgpu:fix NULL pointer access during drv + remove +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +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() + +Change-Id: Ib1f31a2cf6bfbb9b54c7cc2a8cf9e4e3160bcfa0 +Signed-off-by: Monk Liu <Monk.Liu@amd.com> +Reviewed-by: Christian König <christian.koenig@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 + + drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 1 - + drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c | 9 +-------- + drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 2 +- + drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | 2 +- + drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | 2 +- + drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | 2 +- + 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 46d86cf..73fd36b 100755 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +@@ -1452,6 +1452,7 @@ struct amdgpu_fw_vram_usage { + }; + + int amdgpu_fw_reserve_vram_init(struct amdgpu_device *adev); ++void amdgpu_fw_reserve_vram_fini(struct amdgpu_device *adev); + + /* + * CGS +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +index 04ca483b..518de81 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +@@ -2472,7 +2472,6 @@ void amdgpu_device_fini(struct amdgpu_device *adev) + /* evict vram memory */ + amdgpu_bo_evict_vram(adev); + amdgpu_ib_pool_fini(adev); +- amdgpu_fw_reserve_vram_fini(adev); + amdgpu_fence_driver_fini(adev); + amdgpu_fbdev_fini(adev); + 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 10eeb30..707f858 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) + #ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS + /* Allocate pages table */ + adev->gart.pages = vzalloc(sizeof(void *) * adev->gart.num_cpu_pages); +- if (adev->gart.pages == NULL) { +- amdgpu_gart_fini(adev); ++ if (adev->gart.pages == NULL) + return -ENOMEM; +- } + #endif + + return 0; +@@ -271,11 +269,6 @@ int amdgpu_gart_init(struct amdgpu_device *adev) + */ + void amdgpu_gart_fini(struct amdgpu_device *adev) + { +- if (adev->gart.ready) { +- /* unbind pages */ +- amdgpu_gart_unbind(adev, 0, adev->gart.num_cpu_pages); +- } +- adev->gart.ready = false; + #ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS + vfree(adev->gart.pages); + 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 b905a25..7f9317e 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +@@ -1640,6 +1640,7 @@ void amdgpu_ttm_fini(struct amdgpu_device *adev) + amdgpu_ttm_debugfs_fini(adev); + + amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, NULL); ++ amdgpu_fw_reserve_vram_fini(adev); + + amdgpu_ssg_fini(adev); + amdgpu_direct_gma_fini(adev); +@@ -1653,7 +1654,6 @@ void amdgpu_ttm_fini(struct amdgpu_device *adev) + if (adev->gds.oa.total_size) + ttm_bo_clean_mm(&adev->mman.bdev, AMDGPU_PL_OA); + ttm_bo_device_release(&adev->mman.bdev); +- amdgpu_gart_fini(adev); + amdgpu_ttm_global_fini(adev); + adev->mman.initialized = false; + 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 1e6e50a..34ba39b 100644 +--- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c +@@ -893,9 +893,9 @@ static int gmc_v6_0_sw_fini(void *handle) + { + struct amdgpu_device *adev = (struct amdgpu_device *)handle; + ++ amdgpu_gem_force_release(adev); + amdgpu_vm_manager_fini(adev); + gmc_v6_0_gart_fini(adev); +- amdgpu_gem_force_release(adev); + amdgpu_bo_fini(adev); + release_firmware(adev->mc.fw); + 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 2e0cc17..57d4fdc 100644 +--- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c +@@ -1052,9 +1052,9 @@ static int gmc_v7_0_sw_fini(void *handle) + struct amdgpu_device *adev = (struct amdgpu_device *)handle; + + kfree(adev->mc.vm_fault_info); ++ amdgpu_gem_force_release(adev); + amdgpu_vm_manager_fini(adev); + gmc_v7_0_gart_fini(adev); +- amdgpu_gem_force_release(adev); + amdgpu_bo_fini(adev); + release_firmware(adev->mc.fw); + 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 4529af5..b5ed774 100644 +--- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c +@@ -1153,9 +1153,9 @@ static int gmc_v8_0_sw_fini(void *handle) + struct amdgpu_device *adev = (struct amdgpu_device *)handle; + + kfree(adev->mc.vm_fault_info); ++ amdgpu_gem_force_release(adev); + amdgpu_vm_manager_fini(adev); + gmc_v8_0_gart_fini(adev); +- amdgpu_gem_force_release(adev); + amdgpu_bo_fini(adev); + release_firmware(adev->mc.fw); + 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 205195c..4cb87eb 100644 +--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c +@@ -882,9 +882,9 @@ static int gmc_v9_0_sw_fini(void *handle) + { + struct amdgpu_device *adev = (struct amdgpu_device *)handle; + ++ amdgpu_gem_force_release(adev); + amdgpu_vm_manager_fini(adev); + gmc_v9_0_gart_fini(adev); +- amdgpu_gem_force_release(adev); + amdgpu_bo_fini(adev); + + return 0; +-- +2.7.4 + |