STRUCT IOMMU_IOAS_COPY(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’… struct iommu_ioas_copy(9) β€” Kernel API Manual πŸŽ€

okay bestie, grab your iced coffee because we're diving into the kernel API manual for struct iommu_ioas_copy(9) and honestly? it's giving "underrated icon" ✨ this whole page is about the ioctl(IOMMU_IOAS_COPY) situation and it's lowkey so clean once you see it. let's go πŸ¦‹


✨ NAME ✨

struct iommu_ioas_copy β€” literally the ioctl(IOMMU_IOAS_COPY) struct, no cap πŸ’…


🌸 SYNOPSIS 🌸

here's the whole vibe, character for character, don't touch my baby:

struct iommu_ioas_copy {
    __u32 size;
    __u32 flags;
    __u32 dst_ioas_id;
    __u32 src_ioas_id;
    __aligned_u64 length;
    __aligned_u64 dst_iova;
    __aligned_u64 src_iova;
 };

like, look at those fields. immaculate. 🫢


🧚 Members 🧚

okay so every field has a job and they ALL eat:

  • size β€” it's just sizeof(struct iommu_ioas_copy). the self-aware queen of the struct πŸ‘‘
  • flags β€” a combination of enum iommufd_ioas_map_flags. mix and match, you do you ✨
  • dst_ioas_id β€” the IOAS ID whose mapping you're about to change. main character energy πŸ”₯
  • src_ioas_id β€” the IOAS ID you're copying from. the source material, iykyk 🌈
  • length β€” number of bytes to copy and map. bytes. not vibes. bytes πŸ’€
  • dst_iova β€” the IOVA the mapping was placed at. heads up though: if IOMMU_IOAS_MAP_FIXED_IOVA is set then this must be provided as input. no skipping πŸ™ˆ
  • src_iova β€” the IOVA to start the copy from. where the lore begins πŸŽ€

πŸ¦‹ Description πŸ¦‹

so what does it DO? it copies an already existing mapping from src_ioas_id and establishes it over in dst_ioas_id. simple. iconic. periodt ✨

one thing though, and this is important bestie: the src iova/length must exactly match a range used with IOMMU_IOAS_MAP. exactly. no "close enough", no rounding, none of that. exact match or it's not happening πŸ’€

why would you even want this? two reasons, both slay:

  • it efficiently clones a subset of an IOAS into another one, or
  • you can use it as a kind of 'cache' to speed up mapping 🧚

and it's genuinely better than just setting up equivalent new mappings, because copy has an efficiency advantage β€” internal resources get shared, and the kernel will pin the user memory only once πŸ”₯ that's the whole flex, ngl.


πŸ’œ SEE ALSO πŸ’œ

the extended friend group (all of these are (9) pages and yes we're listing every single one, don't test me):

  • 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_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)
  • struct iommu_hw_queue_alloc(9)
that's the whole guest list, every single one πŸ’€ don't come for me, the original listed them all and so did I 🫢

and that's the page bestie!! 🌟 this one lives in ./include/uapi/linux, dated October 2026, and it's filed under struct iommu_ioas_copy(9) in the Kernel API Manual β€” go forth and copy those mappings, you absolute legend πŸ‘‘πŸ’–

πŸ“¦ where this page comes from