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

Commit 0bb81cfe authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

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

parents 221e6355 02708c62
Loading
Loading
Loading
Loading
+17 −17
Original line number Diff line number Diff line
@@ -2074,7 +2074,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);
@@ -2189,14 +2189,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,
@@ -2640,6 +2636,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;
@@ -2649,15 +2646,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;
	}

@@ -2679,7 +2678,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;
			}
		}
@@ -2714,7 +2712,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;
	}

@@ -2739,6 +2736,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;
@@ -2746,7 +2746,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)
@@ -2792,10 +2792,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;
	}