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

Commit bf7428a5 authored by Dhaval Patel's avatar Dhaval Patel
Browse files

msm: mdss: release pipes associated with respective process



It is possible that fb_open and fb_release APIs are called
from different processes for same file node. fb_release
finds correct process through file descriptor node in
such scenario and releases respective ref count. However,
overlay_release API tries to release the pipes associated
with current process id. This check fails to find correct
resources and does not release any pipe. This change calls
overlay release API with respective process id to release
all pipes associated with it.

Change-Id: Icc176032401483e05f347d3c08a4b344f61686f2
Signed-off-by: default avatarDhaval Patel <pdhaval@codeaurora.org>
parent 6eb2af6d
Loading
Loading
Loading
Loading
+13 −10
Original line number Diff line number Diff line
@@ -2024,6 +2024,9 @@ static int mdss_fb_release_all(struct fb_info *info, bool release_all)
	if (unknown_pid) {
		pinfo = mdss_fb_release_file_entry(info, NULL, false);
		if (pinfo) {
			pr_debug("found known pid=%d reference for unknown caller pid=%d\n",
						pinfo->pid, pid);
			pid = pinfo->pid;
			mfd->ref_cnt--;
			pinfo->ref_cnt--;
			pm_runtime_put(info->dev);
@@ -2039,14 +2042,14 @@ static int mdss_fb_release_all(struct fb_info *info, bool release_all)
	}

	if (release_needed) {
		pr_debug("known process %s pid=%d mfd->ref=%d\n",
			task->comm, pid, mfd->ref_cnt);
		pr_debug("current process=%s pid=%d known pid=%d mfd->ref=%d\n",
			task->comm, current->tgid, pid, mfd->ref_cnt);

		if (mfd->mdp.release_fnc) {
			ret = mfd->mdp.release_fnc(mfd, false);
			ret = mfd->mdp.release_fnc(mfd, false, pid);
			if (ret)
				pr_err("error releasing fb%d pid=%d\n",
					mfd->index, pid);
				pr_err("error releasing fb%d for current pid=%d known pid=%d\n",
					mfd->index, current->tgid, pid);
		}
	} else if (release_all && mfd->ref_cnt) {
		pr_err("reference count mismatch with proc list entries\n");
@@ -2059,10 +2062,10 @@ static int mdss_fb_release_all(struct fb_info *info, bool release_all)
		}

		if (mfd->mdp.release_fnc) {
			ret = mfd->mdp.release_fnc(mfd, true);
			ret = mfd->mdp.release_fnc(mfd, true, pid);
			if (ret)
				pr_err("error fb%d release process %s pid=%d\n",
					mfd->index, task->comm, pid);
				pr_err("error fb%d release current process=%s pid=%d known pid=%d\n",
				    mfd->index, task->comm, current->tgid, pid);
		}

		if (mfd->fb_ion_handle)
@@ -2071,8 +2074,8 @@ static int mdss_fb_release_all(struct fb_info *info, bool release_all)
		ret = mdss_fb_blank_sub(FB_BLANK_POWERDOWN, info,
			mfd->op_enable);
		if (ret) {
			pr_err("can't turn off fb%d! rc=%d process %s pid=%d\n",
				mfd->index, ret, task->comm, pid);
			pr_err("can't turn off fb%d! rc=%d current process=%s pid=%d known pid=%d\n",
			      mfd->index, ret, task->comm, current->tgid, pid);
			return ret;
		}
		atomic_set(&mfd->ioctl_ref_cnt, 0);
+2 −1
Original line number Diff line number Diff line
@@ -130,7 +130,8 @@ struct msm_mdp_interface {
	int (*on_fnc)(struct msm_fb_data_type *mfd);
	int (*off_fnc)(struct msm_fb_data_type *mfd);
	/* called to release resources associated to the process */
	int (*release_fnc)(struct msm_fb_data_type *mfd, bool release_all);
	int (*release_fnc)(struct msm_fb_data_type *mfd, bool release_all,
				uint32_t pid);
	int (*kickoff_fnc)(struct msm_fb_data_type *mfd,
					struct mdp_display_commit *data);
	int (*ioctl_handler)(struct msm_fb_data_type *mfd, u32 cmd, void *arg);
+1 −2
Original line number Diff line number Diff line
@@ -1613,14 +1613,13 @@ done:
 * on fb_release to release any overlays/rotator sessions left open.
 */
static int __mdss_mdp_overlay_release_all(struct msm_fb_data_type *mfd,
	bool release_all)
	bool release_all, uint32_t pid)
{
	struct mdss_mdp_pipe *pipe;
	struct mdss_mdp_rotator_session *rot, *tmp;
	struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd);
	u32 unset_ndx = 0;
	int cnt = 0;
	int pid = current->tgid;

	pr_debug("releasing all resources for fb%d pid=%d\n", mfd->index, pid);