diff options
| author | Jeremy Gebben <jgebben@codeaurora.org> | 2015-06-16 12:56:45 -0600 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-22 11:13:06 -0700 |
| commit | 7b156fd0c27f571823add21556a625f477205956 (patch) | |
| tree | e1eeaed2478bb651dcaa881c8993e7ddf467addf | |
| parent | ae4721897e0897127a85ceae9c6b946e70af6e2d (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.c | 16 |
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, |
