diff options
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.patch | 136 |
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 + |