Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 02708c62 authored by Steve Cohen's avatar Steve Cohen
Browse files

drm/msm/sde: ensure all local atomic states get freed



Make sure that any time an atomic state is allocated
that the reference to that object is put back when
it's no longer needed.  This will avoid leaking memory.

Change-Id: Ifaa4e105012a7a08a03887acc07ad2f368d11d52
Signed-off-by: default avatarSteve Cohen <cohens@codeaurora.org>
parent 888677e7
Loading
Loading
Loading
Loading
+17 −17
Original line number Diff line number Diff line
@@ -2002,7 +2002,7 @@ static void sde_kms_preclose(struct msm_kms *kms, struct drm_file *file)
	}

end:
	if ((ret != 0) && state)
	if (state)
		drm_atomic_state_put(state);

	SDE_DEBUG("sde preclose done, ret:%d\n", ret);
@@ -2117,14 +2117,10 @@ static void sde_kms_lastclose(struct msm_kms *kms,
		SDE_DEBUG("deadlock backoff on attempt %d\n", i);
	}

	if (ret) {
		/**
		 * on success, atomic state object ownership transfers to
		 * framework, otherwise, free it here
		 */
		drm_atomic_state_put(state);
	if (ret)
		SDE_ERROR("failed to run last close: %d\n", ret);
	}

	drm_atomic_state_put(state);
}

static int sde_kms_check_secure_transition(struct msm_kms *kms,
@@ -2496,6 +2492,7 @@ static int sde_kms_pm_suspend(struct device *dev)
	drm_modeset_acquire_init(&ctx, 0);

retry:
	state = NULL;
	ret = drm_modeset_lock_all_ctx(ddev, &ctx);
	if (ret)
		goto unlock;
@@ -2505,15 +2502,17 @@ static int sde_kms_pm_suspend(struct device *dev)
		drm_atomic_state_put(sde_kms->suspend_state);
	sde_kms->suspend_state = drm_atomic_helper_duplicate_state(ddev, &ctx);
	if (IS_ERR_OR_NULL(sde_kms->suspend_state)) {
		DRM_ERROR("failed to back up suspend state\n");
		ret = PTR_ERR(sde_kms->suspend_state);
		DRM_ERROR("failed to back up suspend state, %d\n", ret);
		sde_kms->suspend_state = NULL;
		goto unlock;
	}

	/* create atomic state to disable all CRTCs */
	state = drm_atomic_state_alloc(ddev);
	if (IS_ERR_OR_NULL(state)) {
		DRM_ERROR("failed to allocate crtc disable state\n");
	if (!state) {
		ret = -ENOMEM;
		DRM_ERROR("failed to allocate crtc disable state, %d\n", ret);
		goto unlock;
	}

@@ -2535,7 +2534,6 @@ static int sde_kms_pm_suspend(struct device *dev)
			if (ret) {
				DRM_ERROR("failed to set lp2 for conn %d\n",
						conn->base.id);
				drm_atomic_state_put(state);
				goto unlock;
			}
		}
@@ -2570,7 +2568,6 @@ static int sde_kms_pm_suspend(struct device *dev)
	ret = drm_atomic_commit(state);
	if (ret < 0) {
		DRM_ERROR("failed to disable crtcs, %d\n", ret);
		drm_atomic_state_put(state);
		goto unlock;
	}

@@ -2595,6 +2592,9 @@ static int sde_kms_pm_suspend(struct device *dev)
	}
	drm_connector_list_iter_end(&conn_iter);
unlock:
	if (state)
		drm_atomic_state_put(state);

	if (ret == -EDEADLK) {
		drm_modeset_backoff(&ctx);
		goto retry;
@@ -2602,7 +2602,7 @@ static int sde_kms_pm_suspend(struct device *dev)
	drm_modeset_drop_locks(&ctx);
	drm_modeset_acquire_fini(&ctx);

	return 0;
	return ret;
}

static int sde_kms_pm_resume(struct device *dev)
@@ -2648,10 +2648,10 @@ static int sde_kms_pm_resume(struct device *dev)
			drm_modeset_backoff(&ctx);
		}

		if (ret < 0) {
		if (ret < 0)
			DRM_ERROR("failed to restore state, %d\n", ret);

		drm_atomic_state_put(sde_kms->suspend_state);
		}
		sde_kms->suspend_state = NULL;
	}