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

Commit 8cf6c69d authored by Veera Sundaram Sankaran's avatar Veera Sundaram Sankaran
Browse files

msm: mdss: protect iommu attached status variable with iommu_lock



Commit dd7ad27e ("msm: mdss: fix
race condition between iommu attach and sending DCS cmds") protected
the iommu attach/detach to fix possible race condition between the
display thread and DCS cmd sending from ESD or some other thread with
iommu_lock. But this still leaves possibility of race condition based
on iommu_attached status flag.
  -> Display thread finishes the attach and releases the iommu lock
  -> DCS cmd thread gets the iommu lock and checks iommu_attached
     status before display thread could change it.
Protect the iommu_attached status variable along with iommu
attach/detach to avoid such cases.

Change-Id: I42d0ced5cbfd741cf02ad71c80c4f01dde37f647
Signed-off-by: default avatarVeera Sundaram Sankaran <veeras@codeaurora.org>
parent 034326e6
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -172,7 +172,6 @@ static int mdss_smmu_attach_v2(struct mdss_data_type *mdata)
	struct mdss_smmu_client *mdss_smmu;
	int i, rc = 0;

	mutex_lock(&mdp_iommu_lock);
	for (i = 0; i < MDSS_IOMMU_MAX_DOMAIN; i++) {
		if (!mdss_smmu_is_valid_domain_type(mdata, i))
			continue;
@@ -204,11 +203,9 @@ static int mdss_smmu_attach_v2(struct mdss_data_type *mdata)
			}
		} else {
			pr_err("iommu device not attached for domain[%d]\n", i);
			mutex_unlock(&mdp_iommu_lock);
			return -ENODEV;
		}
	}
	mutex_unlock(&mdp_iommu_lock);

	return 0;

@@ -221,7 +218,6 @@ err:
			mdss_smmu->domain_attached = false;
		}
	}
	mutex_unlock(&mdp_iommu_lock);

	return rc;
}
@@ -237,7 +233,6 @@ static int mdss_smmu_detach_v2(struct mdss_data_type *mdata)
	struct mdss_smmu_client *mdss_smmu;
	int i;

	mutex_lock(&mdp_iommu_lock);
	for (i = 0; i < MDSS_IOMMU_MAX_DOMAIN; i++) {
		if (!mdss_smmu_is_valid_domain_type(mdata, i))
			continue;
@@ -246,7 +241,6 @@ static int mdss_smmu_detach_v2(struct mdss_data_type *mdata)
		if (mdss_smmu && mdss_smmu->dev && !mdss_smmu->handoff_pending)
			mdss_smmu_enable_power(mdss_smmu, false);
	}
	mutex_unlock(&mdp_iommu_lock);

	return 0;
}
+21 −6
Original line number Diff line number Diff line
@@ -119,18 +119,26 @@ static inline int mdss_smmu_attach(struct mdss_data_type *mdata)
{
	int rc;

	mdata->mdss_util->iommu_lock();
	MDSS_XLOG(mdata->iommu_attached);

	if (mdata->iommu_attached) {
		pr_debug("mdp iommu already attached\n");
		return 0;
		rc = 0;
		goto end;
	}

	if (!mdata->smmu_ops.smmu_attach)
		return -ENOSYS;
	if (!mdata->smmu_ops.smmu_attach) {
		rc = -ENOSYS;
		goto end;
	}

	rc =  mdata->smmu_ops.smmu_attach(mdata);
	if (!rc)
		mdata->iommu_attached = true;

end:
	mdata->mdss_util->iommu_unlock();
	return rc;
}

@@ -138,19 +146,26 @@ static inline int mdss_smmu_detach(struct mdss_data_type *mdata)
{
	int rc;

	mdata->mdss_util->iommu_lock();
	MDSS_XLOG(mdata->iommu_attached);

	if (!mdata->iommu_attached) {
		pr_debug("mdp iommu already dettached\n");
		return 0;
		rc = 0;
		goto end;
	}

	if (!mdata->smmu_ops.smmu_detach)
		return -ENOSYS;
	if (!mdata->smmu_ops.smmu_detach) {
		rc = -ENOSYS;
		goto end;
	}

	rc = mdata->smmu_ops.smmu_detach(mdata);
	if (!rc)
		mdata->iommu_attached = false;

end:
	mdata->mdss_util->iommu_unlock();
	return rc;
}