aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/5336-drm-amdgpu-Fix-page-fault-and-kasan-warning-on-pci-d.patch
diff options
context:
space:
mode:
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.patch201
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
+