diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2013-03-22 15:38:15 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2013-06-27 19:16:38 -0400 |
commit | f907eec036511ed2ff8cc5de58b6a1cef4bb4033 (patch) | |
tree | 96fcf7e387dcb64176ef11d257a1d5ffeb89c919 /drivers/gpu/drm/radeon/r600_dpm.c | |
parent | b253e4b359ee1bf25299a31337b7d95b21ab9cd9 (diff) |
drm/radeon: fix some memory leaks in extended table parsing
Forgot to free some structs when allocation fails for some
tables.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/r600_dpm.c')
-rw-r--r-- | drivers/gpu/drm/radeon/r600_dpm.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/gpu/drm/radeon/r600_dpm.c b/drivers/gpu/drm/radeon/r600_dpm.c index 379174972090..2e5ec65a78f7 100644 --- a/drivers/gpu/drm/radeon/r600_dpm.c +++ b/drivers/gpu/drm/radeon/r600_dpm.c | |||
@@ -878,8 +878,12 @@ int r600_parse_extended_power_table(struct radeon_device *rdev) | |||
878 | kzalloc(psl->ucNumEntries * | 878 | kzalloc(psl->ucNumEntries * |
879 | sizeof(struct radeon_phase_shedding_limits_entry), | 879 | sizeof(struct radeon_phase_shedding_limits_entry), |
880 | GFP_KERNEL); | 880 | GFP_KERNEL); |
881 | if (!rdev->pm.dpm.dyn_state.phase_shedding_limits_table.entries) | 881 | if (!rdev->pm.dpm.dyn_state.phase_shedding_limits_table.entries) { |
882 | kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries); | ||
883 | kfree(rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk.entries); | ||
884 | kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk.entries); | ||
882 | return -ENOMEM; | 885 | return -ENOMEM; |
886 | } | ||
883 | 887 | ||
884 | for (i = 0; i < psl->ucNumEntries; i++) { | 888 | for (i = 0; i < psl->ucNumEntries; i++) { |
885 | rdev->pm.dpm.dyn_state.phase_shedding_limits_table.entries[i].sclk = | 889 | rdev->pm.dpm.dyn_state.phase_shedding_limits_table.entries[i].sclk = |
@@ -946,8 +950,13 @@ int r600_parse_extended_power_table(struct radeon_device *rdev) | |||
946 | le16_to_cpu(ext_hdr->usPPMTableOffset)); | 950 | le16_to_cpu(ext_hdr->usPPMTableOffset)); |
947 | rdev->pm.dpm.dyn_state.ppm_table = | 951 | rdev->pm.dpm.dyn_state.ppm_table = |
948 | kzalloc(sizeof(struct radeon_ppm_table), GFP_KERNEL); | 952 | kzalloc(sizeof(struct radeon_ppm_table), GFP_KERNEL); |
949 | if (!rdev->pm.dpm.dyn_state.ppm_table) | 953 | if (!rdev->pm.dpm.dyn_state.ppm_table) { |
954 | kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries); | ||
955 | kfree(rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk.entries); | ||
956 | kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk.entries); | ||
957 | kfree(rdev->pm.dpm.dyn_state.cac_leakage_table.entries); | ||
950 | return -ENOMEM; | 958 | return -ENOMEM; |
959 | } | ||
951 | rdev->pm.dpm.dyn_state.ppm_table->ppm_design = ppm->ucPpmDesign; | 960 | rdev->pm.dpm.dyn_state.ppm_table->ppm_design = ppm->ucPpmDesign; |
952 | rdev->pm.dpm.dyn_state.ppm_table->cpu_core_number = | 961 | rdev->pm.dpm.dyn_state.ppm_table->cpu_core_number = |
953 | le16_to_cpu(ppm->usCpuCoreNumber); | 962 | le16_to_cpu(ppm->usCpuCoreNumber); |