diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/5336-drm-amdgpu-Fix-page-fault-and-kasan-warning-on-pci-d.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/5336-drm-amdgpu-Fix-page-fault-and-kasan-warning-on-pci-d.patch | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/5336-drm-amdgpu-Fix-page-fault-and-kasan-warning-on-pci-d.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/5336-drm-amdgpu-Fix-page-fault-and-kasan-warning-on-pci-d.patch new file mode 100644 index 00000000..efa7e831 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/5336-drm-amdgpu-Fix-page-fault-and-kasan-warning-on-pci-d.patch @@ -0,0 +1,201 @@ +From b489217e297d3866ddf3bcd9bf2d3e3ac8cebb88 Mon Sep 17 00:00:00 2001 +From: Andrey Grodzovsky <andrey.grodzovsky@amd.com> +Date: Wed, 22 Aug 2018 10:07:35 -0400 +Subject: [PATCH 5336/5725] drm/amdgpu: Fix page fault and kasan warning on pci + device remove. + +Problem: +When executing echo 1 > /sys/class/drm/card0/device/remove kasan warning +as bellow and page fault happen because adev->gart.pages already freed by the +time amdgpu_gart_unbind is called. + +BUG: KASAN: user-memory-access in amdgpu_gart_unbind+0x98/0x180 [amdgpu] +Write of size 8 at addr 0000000000003648 by task bash/1828 +CPU: 2 PID: 1828 Comm: bash Tainted: G W O 4.18.0-rc1-dev+ #29 +Hardware name: Gigabyte Technology Co., Ltd. AX370-Gaming/AX370-Gaming-CF, BIOS F3 06/19/2017 +Call Trace: +dump_stack+0x71/0xab +kasan_report+0x109/0x390 +amdgpu_gart_unbind+0x98/0x180 [amdgpu] +ttm_tt_unbind+0x43/0x60 [ttm] +ttm_bo_move_ttm+0x83/0x1c0 [ttm] +ttm_bo_handle_move_mem+0xb97/0xd00 [ttm] +ttm_bo_evict+0x273/0x530 [ttm] +ttm_mem_evict_first+0x29c/0x360 [ttm] +ttm_bo_force_list_clean+0xfc/0x210 [ttm] +ttm_bo_clean_mm+0xe7/0x160 [ttm] +amdgpu_ttm_fini+0xda/0x1d0 [amdgpu] +amdgpu_bo_fini+0xf/0x60 [amdgpu] +gmc_v8_0_sw_fini+0x36/0x70 [amdgpu] +amdgpu_device_fini+0x2d0/0x7d0 [amdgpu] +amdgpu_driver_unload_kms+0x6a/0xd0 [amdgpu] +drm_dev_unregister+0x79/0x180 [drm] +amdgpu_pci_remove+0x2a/0x60 [amdgpu] +pci_device_remove+0x5b/0x100 +device_release_driver_internal+0x236/0x360 +pci_stop_bus_device+0xbf/0xf0 +pci_stop_and_remove_bus_device_locked+0x16/0x30 +remove_store+0xda/0xf0 +kernfs_fop_write+0x186/0x220 +__vfs_write+0xcc/0x330 +vfs_write+0xe6/0x250 +ksys_write+0xb1/0x140 +do_syscall_64+0x77/0x1e0 +entry_SYSCALL_64_after_hwframe+0x44/0xa9 +RIP: 0033:0x7f66ebbb32c0 + +Fix: +Split gmc_v{6,7,8,9}_0_gart_fini to postpone amdgpu_gart_fini to after +memory managers are shut down since gart unbind happens +as part of this procedure + +Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com> +Reviewed-by: Junwei Zhang <Jerry.Zhang@amd.com> +Acked-by: Huang Rui <ray.huang@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | 9 ++------- + drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | 16 ++-------------- + drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | 16 ++-------------- + drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 16 ++-------------- + 4 files changed, 8 insertions(+), 49 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c +index 3911c52..b8335d8 100644 +--- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c +@@ -636,12 +636,6 @@ static void gmc_v6_0_gart_disable(struct amdgpu_device *adev) + amdgpu_gart_table_vram_unpin(adev); + } + +-static void gmc_v6_0_gart_fini(struct amdgpu_device *adev) +-{ +- amdgpu_gart_table_vram_free(adev); +- amdgpu_gart_fini(adev); +-} +- + static void gmc_v6_0_vm_decode_fault(struct amdgpu_device *adev, + u32 status, u32 addr, u32 mc_client) + { +@@ -938,8 +932,9 @@ static int gmc_v6_0_sw_fini(void *handle) + + amdgpu_gem_force_release(adev); + amdgpu_vm_manager_fini(adev); +- gmc_v6_0_gart_fini(adev); ++ amdgpu_gart_table_vram_free(adev); + amdgpu_bo_fini(adev); ++ amdgpu_gart_fini(adev); + release_firmware(adev->gmc.fw); + adev->gmc.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 35fb090..61ffd5c 100644 +--- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c +@@ -751,19 +751,6 @@ static void gmc_v7_0_gart_disable(struct amdgpu_device *adev) + } + + /** +- * gmc_v7_0_gart_fini - vm fini callback +- * +- * @adev: amdgpu_device pointer +- * +- * Tears down the driver GART/VM setup (CIK). +- */ +-static void gmc_v7_0_gart_fini(struct amdgpu_device *adev) +-{ +- amdgpu_gart_table_vram_free(adev); +- amdgpu_gart_fini(adev); +-} +- +-/** + * gmc_v7_0_vm_decode_fault - print human readable fault info + * + * @adev: amdgpu_device pointer +@@ -1100,8 +1087,9 @@ static int gmc_v7_0_sw_fini(void *handle) + amdgpu_gem_force_release(adev); + amdgpu_vm_manager_fini(adev); + kfree(adev->gmc.vm_fault_info); +- gmc_v7_0_gart_fini(adev); ++ amdgpu_gart_table_vram_free(adev); + amdgpu_bo_fini(adev); ++ amdgpu_gart_fini(adev); + release_firmware(adev->gmc.fw); + adev->gmc.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 bd3b859..199f1a5 100644 +--- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c +@@ -977,19 +977,6 @@ static void gmc_v8_0_gart_disable(struct amdgpu_device *adev) + } + + /** +- * gmc_v8_0_gart_fini - vm fini callback +- * +- * @adev: amdgpu_device pointer +- * +- * Tears down the driver GART/VM setup (CIK). +- */ +-static void gmc_v8_0_gart_fini(struct amdgpu_device *adev) +-{ +- amdgpu_gart_table_vram_free(adev); +- amdgpu_gart_fini(adev); +-} +- +-/** + * gmc_v8_0_vm_decode_fault - print human readable fault info + * + * @adev: amdgpu_device pointer +@@ -1208,8 +1195,9 @@ static int gmc_v8_0_sw_fini(void *handle) + amdgpu_gem_force_release(adev); + amdgpu_vm_manager_fini(adev); + kfree(adev->gmc.vm_fault_info); +- gmc_v8_0_gart_fini(adev); ++ amdgpu_gart_table_vram_free(adev); + amdgpu_bo_fini(adev); ++ amdgpu_gart_fini(adev); + release_firmware(adev->gmc.fw); + adev->gmc.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 d7d6d0c..7362ac1 100644 +--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c +@@ -1013,31 +1013,19 @@ static int gmc_v9_0_sw_init(void *handle) + return 0; + } + +-/** +- * gmc_v9_0_gart_fini - vm fini callback +- * +- * @adev: amdgpu_device pointer +- * +- * Tears down the driver GART/VM setup (CIK). +- */ +-static void gmc_v9_0_gart_fini(struct amdgpu_device *adev) +-{ +- amdgpu_gart_table_vram_free(adev); +- amdgpu_gart_fini(adev); +-} +- + 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); + + if (gmc_v9_0_keep_stolen_memory(adev)) + amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, NULL); + ++ amdgpu_gart_table_vram_free(adev); + amdgpu_bo_fini(adev); ++ amdgpu_gart_fini(adev); + + return 0; + } +-- +2.7.4 + |