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

Commit 78b1d03f authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: mdss: avoid race conditions during fb release"

parents 524e9895 a63187ac
Loading
Loading
Loading
Loading
+16 −26
Original line number Diff line number Diff line
@@ -2146,7 +2146,7 @@ static int mdss_fb_release_all(struct fb_info *info, bool release_all)
		unknown_pid = false;

		pr_debug("found process %s pid=%d mfd->ref=%d pinfo->ref=%d\n",
			task->comm, mfd->ref_cnt, pinfo->pid, pinfo->ref_cnt);
			task->comm, pinfo->pid, mfd->ref_cnt, pinfo->ref_cnt);

		proc_info = mdss_fb_release_file_entry(info, pinfo,
								release_all);
@@ -2171,10 +2171,6 @@ static int mdss_fb_release_all(struct fb_info *info, bool release_all)
			pm_runtime_put(info->dev);
		} while (release_all && pinfo->ref_cnt);

		/* we need to stop display thread before release */
		if (release_all && mfd->disp_thread)
			mdss_fb_stop_disp_thread(mfd);

		if (pinfo->ref_cnt == 0) {
			list_del(&pinfo->list);
			kfree(pinfo);
@@ -2205,27 +2201,10 @@ static int mdss_fb_release_all(struct fb_info *info, bool release_all)
		}
	}

	if (release_needed) {
		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, pid);
			if (ret)
				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");
	}

	if (!mfd->ref_cnt) {
		if (mfd->mdp.release_fnc) {
			ret = mfd->mdp.release_fnc(mfd, true, pid);
			if (ret)
				pr_err("error fb%d release current process=%s pid=%d known pid=%d\n",
				    mfd->index, task->comm, current->tgid, pid);
		}
	if (!mfd->ref_cnt || release_all) {
		/* resources (if any) will be released during blank */
		if (mfd->mdp.release_fnc)
			mfd->mdp.release_fnc(mfd, true, pid);

		if (mfd->fb_ion_handle)
			mdss_fb_free_fb_ion_memory(mfd);
@@ -2238,6 +2217,17 @@ static int mdss_fb_release_all(struct fb_info *info, bool release_all)
			return ret;
		}
		atomic_set(&mfd->ioctl_ref_cnt, 0);
	} else if (release_needed) {
		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, pid);

			/* display commit is needed to release resources */
			if (ret)
				mdss_fb_pan_display(&mfd->fbi->var, mfd->fbi);
		}
	}

	return ret;
+3 −4
Original line number Diff line number Diff line
@@ -1683,6 +1683,8 @@ done:
 *
 * Release any resources allocated by calling process, this can be called
 * on fb_release to release any overlays/rotator sessions left open.
 *
 * Return number of resources released
 */
static int __mdss_mdp_overlay_release_all(struct msm_fb_data_type *mfd,
	bool release_all, uint32_t pid)
@@ -1721,9 +1723,6 @@ static int __mdss_mdp_overlay_release_all(struct msm_fb_data_type *mfd,
	}
	mutex_unlock(&mdp5_data->ov_lock);

	if (cnt)
		mfd->mdp.kickoff_fnc(mfd, NULL);

	list_for_each_entry_safe(rot, tmp, &mdp5_data->rot_proc_list, list) {
		if (rot->pid == pid) {
			if (!list_empty(&rot->list))
@@ -1732,7 +1731,7 @@ static int __mdss_mdp_overlay_release_all(struct msm_fb_data_type *mfd,
		}
	}

	return 0;
	return cnt;
}

static int mdss_mdp_overlay_play_wait(struct msm_fb_data_type *mfd,