Hi Zhenzhong,

The series passed our non-regression test suite for emulated svm.  
I will try to test upcoming versions as well.  

cmd

On Sat, 2026-05-09 at 00:07 -0400, Zhenzhong Duan wrote:
> Hi,
> 
> Now we already support first stage translation with passthrough device  
> backed by nested translation in host, but only for IOMMU_NO_PASID.
> 
> Structure VTDAddressSpace includes some elements suitable for emulated  
> device and passthrough device without PASID, e.g., address space,  
> different memory regions, etc, it is also protected by vtd iommu lock,  
> all these are useless and become a burden for passthrough device with  
> PASID.
> 
> When there are lots of PASIDs used in one device, the AS and MRs are  
> all registered to memory core and impact the whole system performance.
> 
> So instead of using VTDAddressSpace to cache pasid entry for each pasid  
> of a passthrough device, we define a light weight structure  
> VTDAccelPASIDCacheEntry with only necessary elements for each pasid. We  
> will use this struct as a parameter to conduct binding/unbinding to  
> nested hwpt, to record the current binded nested hwpt and even future  
> PRQ support. It's also designed to support IOMMU_NO_PASID.
> 
> The potential full definition of VTDAccelPASIDCacheEntry may like:
> 
>   typedef struct VTDAccelPASIDCacheEntry {  
>       VTDHostIOMMUDevice *vtd_hiod;  
>       VTDPASIDEntry pasid_entry;  
>       uint32_t pasid;  
>       uint32_t fs_hwpt_id;  
>       uint32_t fault_id;  
>       int fault_fd;  
>       QLIST_HEAD(, VTDPRQEntry) vtd_prq_list;  
>       IOMMUPRINotifier pri_notifier_entry;  
>       IOMMUPRINotifier *pri_notifier;  
>       QLIST_ENTRY(VTDAccelPASIDCacheEntry) next;  
>   } VTDAccelPASIDCacheEntry;
> 
> Based on newest master branch.  
> GIT branch: 
> [https://github.com/yiliu1765/qemu/tree/zhenzhong/iommufd_pasid.v5](https://github.com/yiliu1765/qemu/tree/zhenzhong/iommufd_pasid.v5)
> 
> PATCH01-08: Some preparing work  
> PATCH09-13: Handle PASID entry addition/removal and bind/unbind  
> PATCH14-15: Add PASID related check and enable PASID for passthrough device
> 
> Tests:  
> Tested with DSA device which driver uses 2 PASIDs by default.
> 
> Thanks  
> Zhenzhong
> 
> Changelog:  
> v5:  
> - use %u for pasid print (Shammer)  
> - s/attachment/detachment in API doc (Shammer)  
> - save iommu pasid in vtd_as to avoid the check of PCI pasid whenever 
> possible (Clement)  
> - commit log minor tweak on patch3 and patch7 (Liuyi)  
> - use name 'pasid-bits' for pasid property (Liuyi)
> 
> v4:  
> - improve documents of VIOMMU_FLAGs (Cédric)  
> - add a cleanup patch to simplify the check between PCI pasid and VTD pasid 
> (Clement)  
> - rebase to newest master branch
> 
> v3:  
> - fix @Pasid parameter's comment (Liuyi)  
> - introduce a wrapper vtd_accel_delete_pc() (Liuyi)  
> - drop patch12 in v2 to avoid a race condition (Clement)  
> - s/PASID_0/IOMMU_NO_PASID s/gloal/global s/as_it/hiod_it (Liuyi)  
> - make trace_vtd_device_at/detach_hwpt use IOMMU_NO_PASID (Liuyi)  
> - change _accel subfix style naming to vtd_accel_ prefix style (Liuyi)  
> - drop unnecessary parameter vtd_hiod* from vtd_destroy_old_fs_hwpt() (Liuyi) 
>  
> - introduce a new flag VIOMMU_FLAG_WANT_PASID_ATTACH for pasid attach 
> (Nicolin)
> 
> v2:  
> - move the check "s->pasid > PCI_EXT_CAP_PASID_MAX_WIDTH" to patch5 (Clement) 
>  
> - move #include "hw/core/iommu.h" before #include "hw/core/qdev.h" (Liuyi)  
> - polish the comment about @Pasid parameter (Liuyi)  
> - s/pe/pasid_entry, s/as_it/hiod_it, s/vtd_find_add_pc/vtd_accel_fill_pc 
> (Liuyi)  
> - s/VTDACCELPASIDCacheEntry/VTDAccelPASIDCacheEntry (Liuyi)  
> - add explanation in code about PASID removal before addition (Liuyi)  
> - polish the comment about scope of VTDAccelPASIDCacheEntry vs 
> VTDPASIDCacheEntry (Liuyi)  
> - add an optimization to bypass PASID entry addition for PASID selective 
> pv_inv_dsc (Liuyi)
> 
> v1:  
> - use naming pattern "XXX_SET_THENAME" same as smmu (Clement)  
> - fix s->pasid check (Clement)
> 
> RFCv2:  
> - extend attach/detach_hwpt() instead of introducing new callbacks (Shammer)  
> - Define IOMMU_NO_PASID for device attachment without pasid (Nicolin)  
> - update vtd_destroy_old_fs_hwpt()'s parameter for naming consistency 
> (Clement)  
> - check pasid bits size to be no more than 20 bits (Clement)  
> - initialize local variable max_pasid_log2 to 0 (Cédric)
> 
> 
> Zhenzhong Duan (15):  
>   vfio/iommufd: Extend attach/detach_hwpt callback implementations with  
>     pasid  
>   iommufd: Extend attach/detach_hwpt callbacks to support pasid  
>   vfio/iommufd: Create nesting parent hwpt with IOMMU_HWPT_ALLOC_PASID  
>     flag  
>   intel_iommu: Create the nested hwpt with IOMMU_HWPT_ALLOC_PASID flag  
>   intel_iommu: Rename pasid property to "pasid-bits" and define it as  
>     type uint8  
>   intel_iommu: Export some functions  
>   intel_iommu: Use IOMMU_NO_PASID and delete PASID_0  
>   intel_iommu: Refactor PASID processing to use IOMMU_NO_PASID  
>     internally  
>   intel_iommu_accel: Handle PASID entry addition for pc_inv_dsc request  
>   intel_iommu_accel: Handle PASID entry removal for pc_inv_dsc request  
>   intel_iommu_accel: Bypass PASID entry addition for just deleted entry  
>   intel_iommu_accel: Handle PASID entry removal for system reset  
>   intel_iommu_accel: Switch to VTDAccelPASIDCacheEntry for PASID  
>     bind/unbind and PIOTLB invalidation  
>   intel_iommu_accel: Add pasid bits size check  
>   intel_iommu: Expose flag VIOMMU_FLAG_PASID_SUPPORTED and  
>     VIOMMU_FLAG_WANT_PASID_ATTACH
> 
>  hw/i386/intel_iommu_accel.h    |  20 +-  
>  hw/i386/intel_iommu_internal.h |  44 +++-  
>  include/hw/core/iommu.h        |  13 ++  
>  include/hw/i386/intel_iommu.h  |   4 +-  
>  include/hw/vfio/vfio-device.h  |   1 +  
>  include/system/iommufd.h       |  18 +-  
>  include/system/memory.h        |   2 +-  
>  backends/iommufd.c             |   9 +-  
>  hw/arm/smmuv3-accel.c          |  12 +-  
>  hw/i386/intel_iommu.c          | 254 +++++++++-----------  
>  hw/i386/intel_iommu_accel.c    | 414 +++++++++++++++++++++++++++------  
>  hw/vfio/device.c               |  11 +  
>  hw/vfio/iommufd.c              |  56 +++--  
>  hw/vfio/trace-events           |   4 +-  
>  14 files changed, 607 insertions(+), 255 deletions(-)
> 

Reply via email to