STRUCT IOMMU_HW_QUEUE_ALLOC(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

Okay bestie, welcome to struct iommu_hw_queue_alloc(9) in the Kernel API Manual β€” this is the ioctl(IOMMU_HW_QUEUE_ALLOC) struct and I'm literally obsessed. πŸ’–

πŸ’– NAME πŸ’–

struct iommu_hw_queue_alloc β€” ioctl(IOMMU_HW_QUEUE_ALLOC) 🫢

✨ SYNOPSIS ✨

Here's the whole struct, no cap:

       struct iommu_hw_queue_alloc {
           __u32 size;
           __u32 flags;
           __u32 viommu_id;
           __u32 type;
           __u32 index;
           __u32 out_hw_queue_id;
           __aligned_u64 nesting_parent_iova;
           __aligned_u64 length;
        };

🧸 Members 🧸

  • size β€” this one is literally sizeof(struct iommu_hw_queue_alloc), so it knows its own size. Main character energy. ✨
  • flags β€” must be 0. No cap, don't get creative here. πŸ’…
  • viommu_id β€” the virtual IOMMU ID to associate the HW queue with.
  • type β€” one of enum iommu_hw_queue_type.
  • index β€” the logical index to the HW queue per virtual IOMMU for a multi-queue model.
  • out_hw_queue_id β€” the ID of the new HW queue.
  • nesting_parent_iova β€” base address of the queue memory in the guest physical address space.
  • length β€” length of the queue memory.

🌸 Description 🌸

So this allocates a HW queue object for a vIOMMU-specific HW-accelerated queue, and it allows HW to access a guest queue memory described using nesting_parent_iova and length. Slay. πŸ”₯

A vIOMMU can allocate multiple queues, but it must use a different index per type to separate each allocation, like:

Type1 HW queue0, Type1 HW queue1, Type2 HW queue0, ...

πŸ¦‹ SEE ALSO πŸ¦‹

Okay bestie, here's the whole friend group of related refs β€” no skipping, periodt:

  • 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)
  • struct iommu_veventq_alloc(9)
  • enum iommu_hw_queue_type(9)

That’s the whole page, bestie! Source/version: ./include/uapi/linux. Date stamped: October 2026. Page: struct iommu_hw_queue_alloc(9). Mwah πŸ’‹

πŸ“¦ where this page comes from