summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Gebben <jgebben@codeaurora.org>2015-06-16 12:56:45 -0600
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-22 11:13:06 -0700
commit7b156fd0c27f571823add21556a625f477205956 (patch)
treee1eeaed2478bb651dcaa881c8993e7ddf467addf
parentae4721897e0897127a85ceae9c6b946e70af6e2d (diff)
iommu/arm-smmu: hold init_mutex in iommu_domain_get_attr
Some attributes are changed during domain attach and detach, so hold init_mutex to ensure consistency. Change-Id: I450a9a2da4bfe3616ef6dd0a6426271d25c292ce Signed-off-by: Jeremy Gebben <jgebben@codeaurora.org>
-rw-r--r--drivers/iommu/arm-smmu.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index dd8abee26e6e..c06ac51abaec 100644
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -1915,23 +1915,31 @@ static void arm_smmu_remove_device(struct device *dev)
static int arm_smmu_domain_get_attr(struct iommu_domain *domain,
enum iommu_attr attr, void *data)
{
+ int ret;
struct arm_smmu_domain *smmu_domain = domain->priv;
+ mutex_lock(&smmu_domain->init_mutex);
switch (attr) {
case DOMAIN_ATTR_NESTING:
*(int *)data = (smmu_domain->stage == ARM_SMMU_DOMAIN_NESTED);
- return 0;
+ ret = 0;
+ break;
case DOMAIN_ATTR_COHERENT_HTW_DISABLE:
*((int *)data) = !!(smmu_domain->attributes &
(1 << DOMAIN_ATTR_COHERENT_HTW_DISABLE));
- return 0;
+ ret = 0;
+ break;
case DOMAIN_ATTR_PT_BASE_ADDR:
*((phys_addr_t *)data) =
smmu_domain->pgtbl_cfg.arm_lpae_s1_cfg.ttbr[0];
- return 0;
+ ret = 0;
+ break;
default:
- return -ENODEV;
+ ret = -ENODEV;
+ break;
}
+ mutex_unlock(&smmu_domain->init_mutex);
+ return ret;
}
static int arm_smmu_domain_set_attr(struct iommu_domain *domain,