mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
iommu/qcom: Publish pgtbl_ops before releasing init_mutex
qcom_domain->pgtbl_ops was assigned after mutex_unlock(). Another thread calling qcom_iommu_init_domain() would see qcom_domain->iommu already set (domain fully initialized) and skip re-initialization under the mutex. If it then called qcom_iommu_map() before the first thread set pgtbl_ops, it would observe a NULL ops pointer and return -ENODEV for valid mappings. Move the assignment to before mutex_unlock() so that once the mutex is released the domain is fully visible to concurrent operations. Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com> Signed-off-by: Mukesh Ojha <mukesh.ojha@oss.qualcomm.com> Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
parent
3c748a5554
commit
a05b67cd45
|
|
@ -306,13 +306,12 @@ static int qcom_iommu_init_domain(struct iommu_domain *domain,
|
|||
ctx->domain = domain;
|
||||
}
|
||||
|
||||
mutex_unlock(&qcom_domain->init_mutex);
|
||||
|
||||
/* Publish page table ops for map/unmap */
|
||||
qcom_domain->pgtbl_ops = pgtbl_ops;
|
||||
|
||||
return 0;
|
||||
mutex_unlock(&qcom_domain->init_mutex);
|
||||
|
||||
return 0;
|
||||
out_clear_iommu:
|
||||
free_io_pgtable_ops(pgtbl_ops);
|
||||
qcom_domain->iommu = NULL;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user