mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 18:09:56 +00:00
vfio/spapr_tce: Set window when adding additional groups to container
[ Upstream commit930a42ded3] If a container already has a group attached, attaching a new group should just program already created IOMMU tables to the hardware via the iommu_table_group_ops::set_window() callback. However commit6f01cc692a("vfio/spapr: Add a helper to create default DMA window") did not just simplify the code but also removed the set_window() calls in the case of attaching groups to a container which already has tables so it broke VFIO PCI hotplug. This reverts set_window() bits in tce_iommu_take_ownership_ddw(). Fixes:6f01cc692a("vfio/spapr: Add a helper to create default DMA window") Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Alex Williamson <alex.williamson@redhat.com> Signed-off-by: Sasha Levin <alexander.levin@verizon.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
d385ed7ad3
commit
d536202202
@@ -1246,6 +1246,8 @@ static void tce_iommu_release_ownership_ddw(struct tce_container *container,
|
|||||||
static long tce_iommu_take_ownership_ddw(struct tce_container *container,
|
static long tce_iommu_take_ownership_ddw(struct tce_container *container,
|
||||||
struct iommu_table_group *table_group)
|
struct iommu_table_group *table_group)
|
||||||
{
|
{
|
||||||
|
long i, ret = 0;
|
||||||
|
|
||||||
if (!table_group->ops->create_table || !table_group->ops->set_window ||
|
if (!table_group->ops->create_table || !table_group->ops->set_window ||
|
||||||
!table_group->ops->release_ownership) {
|
!table_group->ops->release_ownership) {
|
||||||
WARN_ON_ONCE(1);
|
WARN_ON_ONCE(1);
|
||||||
@@ -1254,7 +1256,27 @@ static long tce_iommu_take_ownership_ddw(struct tce_container *container,
|
|||||||
|
|
||||||
table_group->ops->take_ownership(table_group);
|
table_group->ops->take_ownership(table_group);
|
||||||
|
|
||||||
|
/* Set all windows to the new group */
|
||||||
|
for (i = 0; i < IOMMU_TABLE_GROUP_MAX_TABLES; ++i) {
|
||||||
|
struct iommu_table *tbl = container->tables[i];
|
||||||
|
|
||||||
|
if (!tbl)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
ret = table_group->ops->set_window(table_group, i, tbl);
|
||||||
|
if (ret)
|
||||||
|
goto release_exit;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
release_exit:
|
||||||
|
for (i = 0; i < IOMMU_TABLE_GROUP_MAX_TABLES; ++i)
|
||||||
|
table_group->ops->unset_window(table_group, i);
|
||||||
|
|
||||||
|
table_group->ops->release_ownership(table_group);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tce_iommu_attach_group(void *iommu_data,
|
static int tce_iommu_attach_group(void *iommu_data,
|
||||||
|
|||||||
Reference in New Issue
Block a user