Commit ddf67a87 authored by Yong Wu's avatar Yong Wu Committed by Joerg Roedel

iommu/mediatek: Add mutex for data in the mtk_iommu_domain

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: default avatarYong Wu <yong.wu@mediatek.com>
Reviewed-by: default avatarAngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Reviewed-by: default avatarMatthias Brugger <matthias.bgg@gmail.com>
Link: https://lore.kernel.org/r/20220503071427.2285-9-yong.wu@mediatek.comSigned-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent 0e5a3f2e
......@@ -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 */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment