aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/r600_dpm.c
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2013-03-22 15:38:15 -0400
committerAlex Deucher <alexander.deucher@amd.com>2013-06-27 19:16:38 -0400
commitf907eec036511ed2ff8cc5de58b6a1cef4bb4033 (patch)
tree96fcf7e387dcb64176ef11d257a1d5ffeb89c919 /drivers/gpu/drm/radeon/r600_dpm.c
parentb253e4b359ee1bf25299a31337b7d95b21ab9cd9 (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.c13
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);