aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1873-drm-amdgpu-fix-firmware-memoryleak-v2.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1873-drm-amdgpu-fix-firmware-memoryleak-v2.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1873-drm-amdgpu-fix-firmware-memoryleak-v2.patch136
1 files changed, 136 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1873-drm-amdgpu-fix-firmware-memoryleak-v2.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1873-drm-amdgpu-fix-firmware-memoryleak-v2.patch
new file mode 100644
index 00000000..3797e89b
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1873-drm-amdgpu-fix-firmware-memoryleak-v2.patch
@@ -0,0 +1,136 @@
+From 13762240f3dbb8d186d253a57758d88d5c1e9781 Mon Sep 17 00:00:00 2001
+From: Monk Liu <Monk.Liu@amd.com>
+Date: Tue, 19 Sep 2017 16:09:53 +0800
+Subject: [PATCH 1873/4131] drm/amdgpu:fix firmware memoryleak(v2)
+
+this fix memory leak due to request_firmware after driver
+unloaded
+
+v2:
+release gmc firmware for gmc6/7/8 as well
+
+Change-Id: I7b4724deea0a095189c344eea3801e456e9cced0
+Signed-off-by: Monk Liu <Monk.Liu@amd.com>
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 6 ++++++
+ drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 20 ++++++++++++++++++++
+ 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/sdma_v4_0.c | 5 +++++
+ 6 files changed, 37 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+index 35bd595..fe1252c 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+@@ -92,6 +92,12 @@ static int psp_sw_init(void *handle)
+
+ static int psp_sw_fini(void *handle)
+ {
++ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
++
++ release_firmware(adev->psp.sos_fw);
++ adev->psp.sos_fw = NULL;
++ release_firmware(adev->psp.asd_fw);
++ adev->psp.asd_fw = NULL;
+ return 0;
+ }
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
+index 6f509d9..2f869c3 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
+@@ -384,6 +384,25 @@ static int gfx_v9_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
+ return r;
+ }
+
++
++static void gfx_v9_0_free_microcode(struct amdgpu_device *adev)
++{
++ release_firmware(adev->gfx.pfp_fw);
++ adev->gfx.pfp_fw = NULL;
++ release_firmware(adev->gfx.me_fw);
++ adev->gfx.me_fw = NULL;
++ release_firmware(adev->gfx.ce_fw);
++ adev->gfx.ce_fw = NULL;
++ release_firmware(adev->gfx.rlc_fw);
++ adev->gfx.rlc_fw = NULL;
++ release_firmware(adev->gfx.mec_fw);
++ adev->gfx.mec_fw = NULL;
++ release_firmware(adev->gfx.mec2_fw);
++ adev->gfx.mec2_fw = NULL;
++
++ kfree(adev->gfx.rlc.register_list_format);
++}
++
+ static int gfx_v9_0_init_microcode(struct amdgpu_device *adev)
+ {
+ const char *chip_name;
+@@ -1429,6 +1448,7 @@ static int gfx_v9_0_sw_fini(void *handle)
+
+ gfx_v9_0_mec_fini(adev);
+ gfx_v9_0_ngg_fini(adev);
++ gfx_v9_0_free_microcode(adev);
+
+ return 0;
+ }
+diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
+index 2d1f3f6..f4603a7 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
+@@ -901,6 +901,8 @@ static int gmc_v6_0_sw_fini(void *handle)
+ gmc_v6_0_gart_fini(adev);
+ amdgpu_gem_force_release(adev);
+ amdgpu_bo_fini(adev);
++ release_firmware(adev->mc.fw);
++ adev->mc.fw = NULL;
+
+ return 0;
+ }
+diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
+index 4b7adf6..322edfe 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
+@@ -1074,6 +1074,8 @@ static int gmc_v7_0_sw_fini(void *handle)
+ gmc_v7_0_gart_fini(adev);
+ amdgpu_gem_force_release(adev);
+ amdgpu_bo_fini(adev);
++ release_firmware(adev->mc.fw);
++ adev->mc.fw = NULL;
+
+ return 0;
+ }
+diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
+index 4a9ddea..ed6b88f 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
+@@ -1175,6 +1175,8 @@ static int gmc_v8_0_sw_fini(void *handle)
+ gmc_v8_0_gart_fini(adev);
+ amdgpu_gem_force_release(adev);
+ amdgpu_bo_fini(adev);
++ release_firmware(adev->mc.fw);
++ adev->mc.fw = NULL;
+
+ return 0;
+ }
+diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
+index 6fa67a8..bef6067 100644
+--- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
+@@ -1264,6 +1264,11 @@ static int sdma_v4_0_sw_fini(void *handle)
+ for (i = 0; i < adev->sdma.num_instances; i++)
+ amdgpu_ring_fini(&adev->sdma.instance[i].ring);
+
++ for (i = 0; i < adev->sdma.num_instances; i++) {
++ release_firmware(adev->sdma.instance[i].fw);
++ adev->sdma.instance[i].fw = NULL;
++ }
++
+ return 0;
+ }
+
+--
+2.7.4
+