STRUCT IOMMU_HWPT_INVALIDATE(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’… NAME πŸ’…

struct iommu_hwpt_invalidate β€” the ioctl(IOMMU_HWPT_INVALIDATE) situation, explained by your favorite kernel-fluent bestie ✨ (welcome to the Kernel API Manual, pull up a chair 🫢)


✨ SYNOPSIS ✨

struct iommu_hwpt_invalidate {
    __u32 size;
    __u32 hwpt_id;
    __aligned_u64 data_uptr;
    __u32 data_type;
    __u32 entry_len;
    __u32 entry_num;
    __u32 __reserved;
 };

Like… look at her. She's a whole struct. Iconic. πŸ‘‘


πŸŽ€ Members πŸŽ€

Okay so let's meet the cast, one field at a time:

  • size β€” literally just sizeof(struct iommu_hwpt_invalidate). She knows her own measurements, periodt πŸ’…
  • hwpt_id β€” the ID of a nested HWPT or a vIOMMU, used for cache invalidation. Pick your fighter πŸ₯Š
  • data_uptr β€” a user pointer to an array of driver-specific cache invalidation data. It's giving "the actual receipts" 🧾
  • data_type β€” one of enum iommu_hwpt_invalidate_data_type, and it defines the data type of all the entries in the invalidation request array. It has to be a type supported by the hwpt that hwpt_id points at, no exceptions 🚨
  • entry_len β€” length (in bytes) of a request entry in the request array πŸ“
  • entry_num β€” on input, the number of cache invalidation requests in the array. On output, the number of requests the kernel successfully handled. She does both, she's versatile πŸ’β€β™€οΈ
  • __reserved β€” must be 0. Zero. Nothing. Empty. Nada. Don't be cute with it πŸ™ˆ

πŸ¦‹ Description πŸ¦‹

So what does she do? She invalidates the iommu cache for a user-managed page table or a vIOMMU. That's the whole personality 🌸

Modifications on a user-managed page table should be followed by this operation β€” but only if a HWPT is passed in via hwpt_id. And other caches, like device cache or descriptor cache, can be flushed if a vIOMMU is passed in via the hwpt_id field. iykyk πŸ”₯

Each ioctl can support one or more cache invalidation requests in the array that has a total size of entry_len * entry_num. Math girlie behavior, we love to see it ✨

And here's the cute part: an empty invalidation request array by setting entry_num==0 is allowed! In that case entry_len and data_uptr would be ignored entirely. Which honestly slays, because you can use it to check if the given data_type is supported or not by the kernel πŸ‘‘

🌈 SEE ALSO 🌈

Start with the kernel file itself, bestie: ./include/uapi/linux/iommufd.h β€” then the whole extended friend group:

  • General ioctl format(9)
  • struct iommu_destroy(9)
  • struct iommu_ioas_alloc(9)
  • struct iommu_iova_range(9)
  • struct iommu_ioas_iova_ranges(9)
  • struct iommu_ioas_allow_iovas(9)
  • enum iommufd_ioas_map_flags(9)
  • struct iommu_ioas_map(9)
  • struct iommu_ioas_noiommu_get_pa(9)
  • struct iommu_ioas_map_file(9)
  • struct iommu_ioas_copy(9)
  • struct iommu_ioas_unmap(9)
  • enum iommufd_option(9)
  • enum iommufd_option_ops(9)
  • struct iommu_option(9)
  • enum iommufd_vfio_ioas_op(9)
  • struct iommu_vfio_ioas(9)
  • enum iommufd_hwpt_alloc_flags(9)
  • enum iommu_hwpt_vtd_s1_flags(9)
  • struct iommu_hwpt_vtd_s1(9)
  • struct iommu_hwpt_arm_smmuv3(9)
  • struct iommu_hwpt_amd_guest(9)
  • enum iommu_hwpt_data_type(9)
  • struct iommu_hwpt_alloc(9)
  • enum iommu_hw_info_vtd_flags(9)
  • struct iommu_hw_info_vtd(9)
  • enum iommu_hw_info_arm_smmuv3_flags(9)
  • struct iommu_hw_info_arm_smmuv3(9)
  • struct iommu_hw_info_tegra241_cmdqv(9)
  • struct iommu_hw_info_amd(9)
  • enum iommu_hw_info_type(9)
  • enum iommufd_hw_capabilities(9)
  • enum iommufd_hw_info_flags(9)
  • struct iommu_hw_info(9)
  • struct iommu_hwpt_set_dirty_tracking(9)
  • enum iommufd_hwpt_get_dirty_bitmap_flags(9)
  • struct iommu_hwpt_get_dirty_bitmap(9)
  • enum iommu_hwpt_invalidate_data_type(9)
  • enum iommu_hwpt_vtd_s1_invalidate_flags(9)
  • struct iommu_hwpt_vtd_s1_invalidate(9)
  • struct iommu_viommu_arm_smmuv3_invalidate(9)
  • enum iommu_hwpt_pgfault_flags(9)
  • enum iommu_hwpt_pgfault_perm(9)
  • struct iommu_hwpt_pgfault(9)
  • enum iommufd_page_response_code(9)
  • struct iommu_hwpt_page_response(9)
  • struct iommu_fault_alloc(9)
  • enum iommu_viommu_type(9)
  • struct iommu_viommu_tegra241_cmdqv(9)
  • struct iommu_viommu_alloc(9)
  • struct iommu_vdevice_alloc(9)
  • struct iommu_ioas_change_process(9)
  • enum iommu_veventq_flag(9)
  • struct iommufd_vevent_header(9)
  • enum iommu_veventq_type(9)
  • struct iommu_vevent_arm_smmuv3(9)
  • struct iommu_vevent_tegra241_cmdqv(9)
  • struct iommu_veventq_alloc(9)
  • enum iommu_hw_queue_type(9)
  • struct iommu_hw_queue_alloc(9)

Okay that's the whole page, bestie, you ate that πŸ’– this one lives at ./include/uapi/linux, dated October 2026, and it's literally titled struct iommu...t_invalidate(9) β€” go forth and invalidate those caches, no cap πŸ§šβ€β™€οΈπŸ’œ

πŸ“¦ where this page comes from