diff options
author | Monk Liu <Monk.Liu@amd.com> | 2017-09-19 04:09:53 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-09-26 15:14:25 -0400 |
commit | c833d8aa4d829e858f1be8f4bd82a1503b611013 (patch) | |
tree | 4656356fc8fa44eb7eeddf23fccceb25998b476e /drivers/gpu/drm/amd | |
parent | 4ff184d70e1dd85cc39f3b8ed0d98b728d6d9b6c (diff) |
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
Signed-off-by: Monk Liu <Monk.Liu@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 20 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | 5 |
6 files changed, 37 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c index e02828665b14..447d446b5015 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) | |||
92 | 92 | ||
93 | static int psp_sw_fini(void *handle) | 93 | static int psp_sw_fini(void *handle) |
94 | { | 94 | { |
95 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | ||
96 | |||
97 | release_firmware(adev->psp.sos_fw); | ||
98 | adev->psp.sos_fw = NULL; | ||
99 | release_firmware(adev->psp.asd_fw); | ||
100 | adev->psp.asd_fw = NULL; | ||
95 | return 0; | 101 | return 0; |
96 | } | 102 | } |
97 | 103 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c index 9945218a5489..deeaee1457ef 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 @@ err1: | |||
384 | return r; | 384 | return r; |
385 | } | 385 | } |
386 | 386 | ||
387 | |||
388 | static void gfx_v9_0_free_microcode(struct amdgpu_device *adev) | ||
389 | { | ||
390 | release_firmware(adev->gfx.pfp_fw); | ||
391 | adev->gfx.pfp_fw = NULL; | ||
392 | release_firmware(adev->gfx.me_fw); | ||
393 | adev->gfx.me_fw = NULL; | ||
394 | release_firmware(adev->gfx.ce_fw); | ||
395 | adev->gfx.ce_fw = NULL; | ||
396 | release_firmware(adev->gfx.rlc_fw); | ||
397 | adev->gfx.rlc_fw = NULL; | ||
398 | release_firmware(adev->gfx.mec_fw); | ||
399 | adev->gfx.mec_fw = NULL; | ||
400 | release_firmware(adev->gfx.mec2_fw); | ||
401 | adev->gfx.mec2_fw = NULL; | ||
402 | |||
403 | kfree(adev->gfx.rlc.register_list_format); | ||
404 | } | ||
405 | |||
387 | static int gfx_v9_0_init_microcode(struct amdgpu_device *adev) | 406 | static int gfx_v9_0_init_microcode(struct amdgpu_device *adev) |
388 | { | 407 | { |
389 | const char *chip_name; | 408 | const char *chip_name; |
@@ -1429,6 +1448,7 @@ static int gfx_v9_0_sw_fini(void *handle) | |||
1429 | 1448 | ||
1430 | gfx_v9_0_mec_fini(adev); | 1449 | gfx_v9_0_mec_fini(adev); |
1431 | gfx_v9_0_ngg_fini(adev); | 1450 | gfx_v9_0_ngg_fini(adev); |
1451 | gfx_v9_0_free_microcode(adev); | ||
1432 | 1452 | ||
1433 | return 0; | 1453 | return 0; |
1434 | } | 1454 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c index 2d1f3f651e1f..f4603a7c8ef3 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) | |||
901 | gmc_v6_0_gart_fini(adev); | 901 | gmc_v6_0_gart_fini(adev); |
902 | amdgpu_gem_force_release(adev); | 902 | amdgpu_gem_force_release(adev); |
903 | amdgpu_bo_fini(adev); | 903 | amdgpu_bo_fini(adev); |
904 | release_firmware(adev->mc.fw); | ||
905 | adev->mc.fw = NULL; | ||
904 | 906 | ||
905 | return 0; | 907 | return 0; |
906 | } | 908 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c index 2256277d102f..b0528ca9207b 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | |||
@@ -1050,6 +1050,8 @@ static int gmc_v7_0_sw_fini(void *handle) | |||
1050 | gmc_v7_0_gart_fini(adev); | 1050 | gmc_v7_0_gart_fini(adev); |
1051 | amdgpu_gem_force_release(adev); | 1051 | amdgpu_gem_force_release(adev); |
1052 | amdgpu_bo_fini(adev); | 1052 | amdgpu_bo_fini(adev); |
1053 | release_firmware(adev->mc.fw); | ||
1054 | adev->mc.fw = NULL; | ||
1053 | 1055 | ||
1054 | return 0; | 1056 | return 0; |
1055 | } | 1057 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c index 114671b57004..f368cfe2f585 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | |||
@@ -1147,6 +1147,8 @@ static int gmc_v8_0_sw_fini(void *handle) | |||
1147 | gmc_v8_0_gart_fini(adev); | 1147 | gmc_v8_0_gart_fini(adev); |
1148 | amdgpu_gem_force_release(adev); | 1148 | amdgpu_gem_force_release(adev); |
1149 | amdgpu_bo_fini(adev); | 1149 | amdgpu_bo_fini(adev); |
1150 | release_firmware(adev->mc.fw); | ||
1151 | adev->mc.fw = NULL; | ||
1150 | 1152 | ||
1151 | return 0; | 1153 | return 0; |
1152 | } | 1154 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c index 61572c5d19ef..c26d205ff3bf 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) | |||
1264 | for (i = 0; i < adev->sdma.num_instances; i++) | 1264 | for (i = 0; i < adev->sdma.num_instances; i++) |
1265 | amdgpu_ring_fini(&adev->sdma.instance[i].ring); | 1265 | amdgpu_ring_fini(&adev->sdma.instance[i].ring); |
1266 | 1266 | ||
1267 | for (i = 0; i < adev->sdma.num_instances; i++) { | ||
1268 | release_firmware(adev->sdma.instance[i].fw); | ||
1269 | adev->sdma.instance[i].fw = NULL; | ||
1270 | } | ||
1271 | |||
1267 | return 0; | 1272 | return 0; |
1268 | } | 1273 | } |
1269 | 1274 | ||