DF-4125 / fix.diff
--- a/sys/dev/drm/radeon/rv6xx_dpm.c +++ b/sys/dev/drm/radeon/rv6xx_dpm.c @@ -1905,10 +1905,15 @@ static int rv6xx_parse_power_table(struct radeon_device *rdev) if (power_info->pplib.ucStateEntrySize - 1) { u8 *idx; ps = kzalloc(sizeof(struct rv6xx_ps), GFP_KERNEL); if (ps == NULL) { - kfree(rdev->pm.dpm.ps); + while (i--) + kfree(rdev->pm.dpm.ps[i].ps_priv); + kfree(rdev->pm.dpm.ps); + rdev->pm.dpm.ps = NULL; return -ENOMEM; } --- a/sys/dev/drm/radeon/radeon_pm.c +++ b/sys/dev/drm/radeon/radeon_pm.c @@ -1445,7 +1445,10 @@ static int radeon_pm_init_dpm(struct radeon_device *rdev) INIT_WORK(&rdev->pm.dpm.thermal.work, radeon_dpm_thermal_work_handler); mutex_lock(&rdev->pm.mutex); - radeon_dpm_init(rdev); + ret = radeon_dpm_init(rdev); + if (ret) + goto dpm_failed_unlock; rdev->pm.dpm.current_ps = rdev->pm.dpm.requested_ps = rdev->pm.dpm.boot_ps; # NOTE: authored against the read-only sys/ tree after verification; never applied there. |