Move viommu teardown into a helper function and use it from the
last device removal path. No functional change.
Signed-off-by: Shameer Kolothum <skolothumtho@nvidia.com>
---
hw/arm/smmuv3-accel.c | 21 +++++++++++++++------
1 file changed, 15 insertions(+), 6 deletions(-)
diff --git a/hw/arm/smmuv3-accel.c b/hw/arm/smmuv3-accel.c
index f5cd4df336..c19c526fca 100644
--- a/hw/arm/smmuv3-accel.c
+++ b/hw/arm/smmuv3-accel.c
@@ -390,6 +390,20 @@ bool smmuv3_accel_issue_inv_cmd(SMMUv3State *bs, void *cmd, SMMUDevice *sdev,
sizeof(Cmd), &entry_num, cmd, errp);
}
+static void smmuv3_accel_free_viommu(SMMUv3AccelState *accel)
+{
+ IOMMUFDViommu *viommu = accel->viommu;
+
+ if (!viommu) {
+ return;
+ }
+ iommufd_backend_free_id(viommu->iommufd, accel->bypass_hwpt_id);
+ iommufd_backend_free_id(viommu->iommufd, accel->abort_hwpt_id);
+ iommufd_backend_free_id(viommu->iommufd, accel->viommu->viommu_id);
+ g_free(viommu);
+ accel->viommu = NULL;
+}
+
static bool
smmuv3_accel_alloc_viommu(SMMUv3State *s, HostIOMMUDeviceIOMMUFD *idev,
Error **errp)
@@ -549,12 +563,7 @@ static void smmuv3_accel_unset_iommu_device(PCIBus *bus, void *opaque,
trace_smmuv3_accel_unset_iommu_device(devfn, idev->devid);
if (QLIST_EMPTY(&accel->device_list)) {
- iommufd_backend_free_id(accel->viommu->iommufd, accel->bypass_hwpt_id);
- iommufd_backend_free_id(accel->viommu->iommufd, accel->abort_hwpt_id);
- iommufd_backend_free_id(accel->viommu->iommufd,
- accel->viommu->viommu_id);
- g_free(accel->viommu);
- accel->viommu = NULL;
+ smmuv3_accel_free_viommu(accel);
}
}
--
2.43.0