STRUCT IOMMU_VEVENTQ_ALLOC(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’… struct iommu_veventq_alloc(9) β€” Kernel API Manual ✨

okay so bestie, we're in the Kernel API Manual, this page lives at struct iommu_veventq_alloc(9), and it's literally all about the ioctl(IOMMU_VEVENTQ_ALLOC) call. strap in πŸŽ€


✨ NAME ✨

struct iommu_veventq_alloc β€” the ioctl(IOMMU_VEVENTQ_ALLOC) vibe πŸ’«


πŸ¦‹ SYNOPSIS πŸ¦‹

struct iommu_veventq_alloc {
    __u32 size;
    __u32 flags;
    __u32 viommu_id;
    __u32 type;
    __u32 veventq_depth;
    __u32 out_veventq_id;
    __u32 out_veventq_fd;
    __u32 __reserved;
 };

🌸 Members 🌸

  • size β€” it's just sizeof(struct iommu_veventq_alloc), the classic self-aware struct move πŸ’…
  • flags β€” must be 0. no cap, that's the whole rule πŸ™ˆ
  • viommu_id β€” the virtual IOMMU ID you're associating the vEVENTQ with 🫢
  • type β€” what type of vEVENTQ this is. must be defined in enum iommu_veventq_type ⭐
  • veventq_depth β€” the maximum number of events in the vEVENTQ. it's giving capacity limits πŸ“
  • out_veventq_id β€” the ID of the brand new vEVENTQ πŸ‘‘
  • out_veventq_fd β€” the fd of the new vEVENTQ. user space must close the successfully returned fd after using it β€” that's a real one, please don't ghost your file descriptors 😭
  • __reserved β€” must be 0. again. it's reserved, bestie 🌈

πŸ’œ Description πŸ’œ

so this ioctl explicitly allocates a virtual event queue interface for a vIOMMU. highkey iconic. a vIOMMU can have multiple FDs for different types, but it's confined to one per type β€” that's the rule, periodt πŸ’€

user space should open the out_veventq_fd to read vEVENTs out of a vEVENTQ, if there are vEVENTs available. and listen β€” a vEVENTQ will lose events due to overflow if the number of the vEVENTs hits veventq_depth. so size it right, bestie, no cap πŸ”₯

each vEVENT in a vEVENTQ encloses a struct iommufd_vevent_header followed by a type-specific data structure, in a normal case:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚     header0   data0   header1   data1   ...   headerN   dataN     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

unless a tailing IOMMU_VEVENTQ_FLAG_LOST_EVENTS header is logged (refer to struct iommufd_vevent_header). like, that's the plot twist πŸ™ˆ


🧚 SEE ALSO 🧚

the reading list is long and honestly she ate, so here's every single one, no skips πŸ’–

  • Kernel file ./include/uapi/linux/iommufd.h
  • 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)
  • struct iommu_hwpt_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)
  • enum iommu_hw_queue_type(9)
  • struct iommu_hw_queue_alloc(9)

okay that's the whole page, mwah πŸ’‹

oh and the cute lil sign-off at the bottom: this one's from ./include/uapi/linux (that's the source/version bit, iykyk), dated October 2026, and it belongs to struct iommu_veventq_alloc(9). slay, go read your vEVENTs responsibly 🫢✨

πŸ“¦ where this page comes from