--- a/sys/dev/drm/radeon/si_dpm.c +++ b/sys/dev/drm/radeon/si_dpm.c @@ -6852,7 +6852,12 @@ return -EINVAL; ps = kzalloc(sizeof(struct ni_ps), GFP_KERNEL); if (ps == NULL) { + while (i > 0) { + i--; + kfree(rdev->pm.dpm.ps[i].ps_priv); + } kfree(rdev->pm.dpm.ps); + rdev->pm.dpm.ps = NULL; return -ENOMEM; } rdev->pm.dpm.ps[i].ps_priv = ps; @@ -7079,10 +7084,14 @@ { int i; - for (i = 0; i < rdev->pm.dpm.num_ps; i++) { - kfree(rdev->pm.dpm.ps[i].ps_priv); + if (rdev->pm.dpm.ps) { + for (i = 0; i < rdev->pm.dpm.num_ps; i++) { + kfree(rdev->pm.dpm.ps[i].ps_priv); + } + kfree(rdev->pm.dpm.ps); + rdev->pm.dpm.ps = NULL; + rdev->pm.dpm.num_ps = 0; } - kfree(rdev->pm.dpm.ps); kfree(rdev->pm.dpm.priv); kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries); r600_free_extended_power_table(rdev);