--- a/sys/dev/drm/radeon/rv770_dpm.c +++ b/sys/dev/drm/radeon/rv770_dpm.c @@ -2305,7 +2305,12 @@ u8 *idx; ps = kzalloc(sizeof(struct rv7xx_ps), GFP_KERNEL); if (ps == NULL) { + int j; + + for (j = 0; j < i; j++) + kfree(rdev->pm.dpm.ps[j].ps_priv); kfree(rdev->pm.dpm.ps); + rdev->pm.dpm.ps = NULL; return -ENOMEM; } rdev->pm.dpm.ps[i].ps_priv = ps; @@ -2544,11 +2549,15 @@ { 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 != NULL) { + 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; } - kfree(rdev->pm.dpm.ps); kfree(rdev->pm.dpm.priv); + rdev->pm.dpm.priv = NULL; } u32 rv770_dpm_get_sclk(struct radeon_device *rdev, bool low)