mirror of
https://github.com/nxp-imx/linux-imx.git
synced 2025-07-08 02:15:20 +02:00
vfio/spapr: Always clear TCEs before unsetting the window
[ Upstream commit 4ba2fdff2e
]
The PAPR expects the TCE table to have no entries at the time of
unset window(i.e. remove-pe). The TCE clear right now is done
before freeing the iommu table. On pSeries, the unset window
makes those entries inaccessible to the OS and the H_PUT/GET calls
fail on them with H_CONSTRAINED.
On PowerNV, this has no side effect as the TCE clear can be done
before the DMA window removal as well.
Signed-off-by: Shivaprasad G Bhat <sbhat@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/171923273535.1397.1236742071894414895.stgit@linux.ibm.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
4676bacc6e
commit
4ef01846c6
|
@ -364,7 +364,6 @@ static void tce_iommu_release(void *iommu_data)
|
||||||
if (!tbl)
|
if (!tbl)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
tce_iommu_clear(container, tbl, tbl->it_offset, tbl->it_size);
|
|
||||||
tce_iommu_free_table(container, tbl);
|
tce_iommu_free_table(container, tbl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -720,6 +719,8 @@ static long tce_iommu_remove_window(struct tce_container *container,
|
||||||
|
|
||||||
BUG_ON(!tbl->it_size);
|
BUG_ON(!tbl->it_size);
|
||||||
|
|
||||||
|
tce_iommu_clear(container, tbl, tbl->it_offset, tbl->it_size);
|
||||||
|
|
||||||
/* Detach groups from IOMMUs */
|
/* Detach groups from IOMMUs */
|
||||||
list_for_each_entry(tcegrp, &container->group_list, next) {
|
list_for_each_entry(tcegrp, &container->group_list, next) {
|
||||||
table_group = iommu_group_get_iommudata(tcegrp->grp);
|
table_group = iommu_group_get_iommudata(tcegrp->grp);
|
||||||
|
@ -738,7 +739,6 @@ static long tce_iommu_remove_window(struct tce_container *container,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free table */
|
/* Free table */
|
||||||
tce_iommu_clear(container, tbl, tbl->it_offset, tbl->it_size);
|
|
||||||
tce_iommu_free_table(container, tbl);
|
tce_iommu_free_table(container, tbl);
|
||||||
container->tables[num] = NULL;
|
container->tables[num] = NULL;
|
||||||
|
|
||||||
|
@ -1197,9 +1197,14 @@ static void tce_iommu_release_ownership(struct tce_container *container,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < IOMMU_TABLE_GROUP_MAX_TABLES; ++i)
|
for (i = 0; i < IOMMU_TABLE_GROUP_MAX_TABLES; ++i) {
|
||||||
if (container->tables[i])
|
if (container->tables[i]) {
|
||||||
|
tce_iommu_clear(container, container->tables[i],
|
||||||
|
container->tables[i]->it_offset,
|
||||||
|
container->tables[i]->it_size);
|
||||||
table_group->ops->unset_window(table_group, i);
|
table_group->ops->unset_window(table_group, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static long tce_iommu_take_ownership(struct tce_container *container,
|
static long tce_iommu_take_ownership(struct tce_container *container,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user