Same with the previous patch, add a mutex for the "data" in the
mtk_iommu_domain. Just improve the safety for multi devices
enter attach_device at the same time. We don't get the real issue
for this.

Signed-off-by: Yong Wu <yong...@mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno 
<angelogioacchino.delre...@collabora.com>
---
 drivers/iommu/mtk_iommu.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c
index 3413cc98e57e..ecdce5d3e8cf 100644
--- a/drivers/iommu/mtk_iommu.c
+++ b/drivers/iommu/mtk_iommu.c
@@ -128,6 +128,8 @@ struct mtk_iommu_domain {
 
        struct mtk_iommu_data           *data;
        struct iommu_domain             domain;
+
+       struct mutex                    mutex; /* Protect "data" in this 
structure */
 };
 
 static const struct iommu_ops mtk_iommu_ops;
@@ -434,6 +436,7 @@ static struct iommu_domain *mtk_iommu_domain_alloc(unsigned 
type)
        dom = kzalloc(sizeof(*dom), GFP_KERNEL);
        if (!dom)
                return NULL;
+       mutex_init(&dom->mutex);
 
        return &dom->domain;
 }
@@ -455,14 +458,19 @@ static int mtk_iommu_attach_device(struct iommu_domain 
*domain,
        if (domid < 0)
                return domid;
 
+       mutex_lock(&dom->mutex);
        if (!dom->data) {
                /* Data is in the frstdata in sharing pgtable case. */
                frstdata = mtk_iommu_get_m4u_data();
 
-               if (mtk_iommu_domain_finalise(dom, frstdata, domid))
+               ret = mtk_iommu_domain_finalise(dom, frstdata, domid);
+               if (ret) {
+                       mutex_unlock(&dom->mutex);
                        return -ENODEV;
+               }
                dom->data = data;
        }
+       mutex_unlock(&dom->mutex);
 
        mutex_lock(&data->mutex);
        if (!data->m4u_dom) { /* Initialize the M4U HW */
-- 
2.18.0

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to