Hi Zhenzhong
Reviewed-by: Clement Mathieu--Drif <clement.mathieu--drif@bull.com>
On Thu, 2026-03-05 at 22:43 -0500, Zhenzhong Duan wrote:
> When pasid is enabled, any hwpt attached to non-PASID or PASID should be
> IOMMU_HWPT_ALLOC_PASID flagged, or else attachment fails.
>
> Change vtd_destroy_old_fs_hwpt() to pass in 'VTDHostIOMMUDevice *' for
> naming consistency.
>
> Signed-off-by: Zhenzhong Duan <[zhenzhong.duan@intel.com](mailto:zhenzhong.duan@intel.com)>
> ---
> hw/i386/intel_iommu_accel.c | 18 +++++++++++-------
> 1 file changed, 11 insertions(+), 7 deletions(-)
>
> diff --git a/hw/i386/intel_iommu_accel.c b/hw/i386/intel_iommu_accel.c
> index 45c08c8f6f..c2757f3bcd 100644
> --- a/hw/i386/intel_iommu_accel.c
> +++ b/hw/i386/intel_iommu_accel.c
> @@ -69,11 +69,13 @@ VTDHostIOMMUDevice *vtd_find_hiod_iommufd(VTDAddressSpace *as)
> return NULL;
> }
>
> -static bool vtd_create_fs_hwpt(HostIOMMUDeviceIOMMUFD *idev,
> +static bool vtd_create_fs_hwpt(VTDHostIOMMUDevice *vtd_hiod,
> VTDPASIDEntry *pe, uint32_t *fs_hwpt_id,
> Error **errp)
> {
> + HostIOMMUDeviceIOMMUFD *idev = HOST_IOMMU_DEVICE_IOMMUFD(vtd_hiod->hiod);
> struct iommu_hwpt_vtd_s1 vtd = {};
> + uint32_t flags = vtd_hiod->iommu_state->pasid ? IOMMU_HWPT_ALLOC_PASID : 0;
>
> vtd.flags = (VTD_SM_PASID_ENTRY_SRE(pe) ? IOMMU_VTD_S1_SRE : 0) |
> (VTD_SM_PASID_ENTRY_WPE(pe) ? IOMMU_VTD_S1_WPE : 0) |
> @@ -82,13 +84,15 @@ static bool vtd_create_fs_hwpt(HostIOMMUDeviceIOMMUFD *idev,
> vtd.pgtbl_addr = (uint64_t)vtd_pe_get_fspt_base(pe);
>
> return iommufd_backend_alloc_hwpt(idev->iommufd, idev->devid, idev->hwpt_id,
> - 0, IOMMU_HWPT_DATA_VTD_S1, sizeof(vtd),
> - &vtd, fs_hwpt_id, errp);
> + flags, IOMMU_HWPT_DATA_VTD_S1,
> + sizeof(vtd), &vtd, fs_hwpt_id, errp);
> }
>
> -static void vtd_destroy_old_fs_hwpt(HostIOMMUDeviceIOMMUFD *idev,
> +static void vtd_destroy_old_fs_hwpt(VTDHostIOMMUDevice *vtd_hiod,
> VTDAddressSpace *vtd_as)
> {
> + HostIOMMUDeviceIOMMUFD *idev = HOST_IOMMU_DEVICE_IOMMUFD(vtd_hiod->hiod);
> +
> if (!vtd_as->fs_hwpt_id) {
> return;
> }
> @@ -116,7 +120,7 @@ static bool vtd_device_attach_iommufd(VTDHostIOMMUDevice *vtd_hiod,
> }
>
> if (vtd_pe_pgtt_is_fst(pe)) {
> - if (!vtd_create_fs_hwpt(idev, pe, &hwpt_id, errp)) {
> + if (!vtd_create_fs_hwpt(vtd_hiod, pe, &hwpt_id, errp)) {
> return false;
> }
> }
> @@ -126,7 +130,7 @@ static bool vtd_device_attach_iommufd(VTDHostIOMMUDevice *vtd_hiod,
> trace_vtd_device_attach_hwpt(idev->devid, vtd_as->pasid, hwpt_id, ret);
> if (ret) {
> /* Destroy old fs_hwpt if it's a replacement */
> - vtd_destroy_old_fs_hwpt(idev, vtd_as);
> + vtd_destroy_old_fs_hwpt(vtd_hiod, vtd_as);
> if (vtd_pe_pgtt_is_fst(pe)) {
> vtd_as->fs_hwpt_id = hwpt_id;
> }
> @@ -161,7 +165,7 @@ static bool vtd_device_detach_iommufd(VTDHostIOMMUDevice *vtd_hiod,
> }
>
> if (ret) {
> - vtd_destroy_old_fs_hwpt(idev, vtd_as);
> + vtd_destroy_old_fs_hwpt(vtd_hiod, vtd_as);
> }
>
> return ret;