Generic Linux architectural discussions
 help / color / mirror / Atom feed
* [PATCH v3 0/5] Hyper-V: Add para-virtualized IOMMU support for Linux guests
@ 2026-08-11 15:50 Yu Zhang
  2026-08-11 15:50 ` [PATCH v3 1/5] hyperv: Introduce new hypercall interfaces used by Hyper-V guest IOMMU Yu Zhang
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: Yu Zhang @ 2026-08-11 15:50 UTC (permalink / raw)
  To: linux-kernel, linux-hyperv, iommu, linux-pci, linux-arch, x86
  Cc: wei.liu, kys, haiyangz, decui, longli, joro, will, robin.murphy,
	bhelgaas, kwilczynski, lpieralisi, mani, robh, arnd, jgg,
	mhklinux, jacob.pan, tgopinath, easwar.hariharan, mrathor,
	baolu.lu, suravee.suthikulpanit, vasant.hegde

This patch series introduces a para-virtualized IOMMU driver for
Linux guests running on Microsoft Hyper-V. The driver enables two
primary use cases:
  1) In-kernel DMA protection for devices assigned to the guest.
  2) Device assignment to guest user space (e.g., via VFIO).

The driver implements the following core functionality:
*   Hypercall-based Enumeration
    Unlike traditional ACPI-based discovery (e.g., DMAR/IVRS),
    this driver enumerates the Hyper-V IOMMU capabilities directly
    via hypercalls. This approach allows the guest to discover
    IOMMU presence and features without requiring specific virtual
    firmware extensions or modifications.

*   Domain Management
    The driver manages IOMMU domains through a new set of Hyper-V
    hypercall interfaces, handling domain allocation and attachment
    for endpoint devices.

*   Nested Translation Support
    This implementation leverages guest-managed stage-1 I/O page
    tables nested with host stage-2 translations. It is built
    upon the consolidated IOMMU page table framework (IOMMU_PT).
    This design eliminates the need for emulating map operations.
    Both Intel VT-d and AMD IOMMU platforms are supported.

*   IOTLB Invalidation
    IOTLB invalidation requests are marshaled and issued to the
    hypervisor through the same hypercall mechanism. Both domain-
    selective and page-selective flushes are supported.

Implementation Notes:
*   Platform Support
    The current implementation targets x86 platforms with Intel
    VT-d and AMD IOMMU hardware.

*   MSI Region Handling
    The standard x86 MSI interrupt range
    (0xfee00000 - 0xfeefffff) is reserved from normal IOVA mappings.
    Future updates may allow this configuration to be queried via
    hypercalls if new hardware platforms are to be supported.

*   Reserved Regions (RMRR)
    There is currently no requirement to support assigned devices with
    ACPI RMRR limitations. Consequently, this patch series does not
    specify or query reserved memory regions.

*   Guest Hibernation
    Guest hibernation and resume are not supported by this initial
    implementation. The current pvIOMMU interface does not define how
    Hyper-V device-domain objects and device attachments are restored.

Testing:
Validated with the following configurations:
- NVMe devices assigned to the guest on AMD platforms, tested
  with fio.
- Intel DSA devices assigned to the guest, tested with dmatest.
- dma_map_benchmark for DMA mapping performance evaluation.

Changelog:

v2[1] -> v3:
- Added a separate patch defining the common x86 architectural MSI
  reserved range and converted the Intel, AMD, and Hyper-V IOMMU
  drivers to use it.

- hyperv: hypercall interfaces:
  - Used BIT_ULL() for 64-bit capability flags.
  - Matched the create-device-domain input layout to the 32-byte
    Hyper-V ABI.
  - Corrected the page-selective flush range layout to 6/6/52 bits.

- hv: logical device ID registry:
  - Replaced the linear list with an rhashtable for the sparse PCI
    domain number mapping.
  - Used RCU-protected lookup and deferred freeing on removal.
  - Simplified the registration and cleanup paths.

- iommu/hyperv: para-virtualized IOMMU:
  - Renamed the guest driver source to hv-iommu-guest.c.
  - Enabled ATS only after a device-domain attachment succeeds, and
    disabled ATS before attaching the blocking domain.
  - Removed the obsolete deferred-flush capability, unused geometry,
    and redundant device-private-data clearing.
  - Made the Hyper-V domain settings explicit at each caller instead
    of deriving them from the Linux domain type.
  - Added transactional create/configure domain handling with rollback.
  - Required only the base page size and masked the domain page-size
    bitmap with the Hyper-V-supported bitmap.
  - Silenced detection for unsupported hosts while retaining errors
    for actual hypercall and capability failures.
  - Clarified Kconfig support for assigned PCI devices and documented
    the lack of guest hibernation/resume support.

- iommu/hyperv: page-selective IOTLB flush:
  - Removed the inclusive-end overflow and kept the range calculation
    in byte addresses until the final page conversion.
  - Cleared both the fixed hypercall header and the range entry.
  - Warned on selective-flush failure before falling back to a
    full-domain flush.

v1[2] -> v2:
- Dropped the "move to subdirectory" patch; the directory now exists
  upstream.

- hv: logical device ID registry:
  - Moved the registry to hv_common.c so it can be shared, and derived
    the prefix via a shared helper instead of caching it in pci-hyperv's
    private struct.
  - Moved the lookup out of the irq-disabled region (PREEMPT_RT).

- iommu/hyperv: para-virtualized IOMMU:
  - Removed the unused detach_dev op.
  - Rejected a hypervisor not advertising x86 page sizes instead of
    masking and warning.
  - Statically initialized the identity and blocking domains.
  - Gave the blocking domain its own attach op, which returns the hypercall
    status and WARNs on failure.

- iommu/hyperv: page-selective IOTLB flush:
  - Used a single descriptor covering a slightly larger power-of-two
    range, instead of splitting the range into multiple descriptors.
  - Fixed the inclusive-end corner case in the flush range calculation.

RFC v1[3] -> v1[2]:
- Scoped platform support to x86 only (Intel VT-d and AMD IOMMU);
  initialization now uses x86_init.iommu.iommu_init
- Added page-selective IOTLB flush support
- Disable device ATS in hv_iommu_release_device()
- Addressed review comments from Michael Kelley:
  - Reversed dependency: pvIOMMU exports registration API for
    pci-hyperv to call, instead of pci-hyperv exporting
    hv_build_logical_dev_id()
  - Dropped separate output page allocation patch; hypercall input
    and output now share the same per-CPU page
  - Cleaned up Kconfig (removed PCI_HYPERV dependency, unnecessary
    selects)
  - Removed dev_list, per-domain spinlock, and syscore_ops
  - Removed forward declarations by reordering functions
  - Fixed typos, cleaned up Kconfig selects, improved pr_info
    messages, etc.

[1] v2:
https://lore.kernel.org/linux-hyperv/20260702160518.311234-1-zhangyu1@linux.microsoft.com/
[2] v1:
https://lore.kernel.org/linux-hyperv/20260511162408.1180069-1-zhangyu1@linux.microsoft.com/
[3] RFC v1:
https://lore.kernel.org/linux-hyperv/20251209051128.76913-1-zhangyu1@linux.microsoft.com/


Wei Liu (1):
  hyperv: Introduce new hypercall interfaces used by Hyper-V guest IOMMU

Yu Zhang (4):
  Drivers: hv: Add logical device ID registry for vPCI devices
  iommu/x86: Share the architectural MSI reserved range
  iommu/hyperv: Add para-virtualized IOMMU support for Hyper-V guest
  iommu/hyperv: Add page-selective IOTLB flush support

 arch/x86/hyperv/hv_init.c             |   4 +
 arch/x86/include/asm/iommu.h          |   3 +
 arch/x86/include/asm/mshyperv.h       |   4 +
 drivers/hv/hv_common.c                | 123 +++++
 drivers/iommu/Kconfig                 |   1 +
 drivers/iommu/amd/iommu.c             |   7 +-
 drivers/iommu/hyperv/Kconfig          |  16 +
 drivers/iommu/hyperv/Makefile         |   1 +
 drivers/iommu/hyperv/hv-iommu-guest.c | 703 ++++++++++++++++++++++++++
 drivers/iommu/hyperv/iommu.h          |  50 ++
 drivers/iommu/intel/iommu.c           |   7 +-
 drivers/pci/controller/pci-hyperv.c   |  21 +-
 include/asm-generic/mshyperv.h        |  14 +
 include/hyperv/hvgdk_mini.h           |   9 +
 include/hyperv/hvhdk_mini.h           | 143 ++++++
 include/linux/hyperv.h                |   8 +
 16 files changed, 1101 insertions(+), 13 deletions(-)
 create mode 100644 drivers/iommu/hyperv/Kconfig
 create mode 100644 drivers/iommu/hyperv/hv-iommu-guest.c
 create mode 100644 drivers/iommu/hyperv/iommu.h

-- 
2.52.0

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2026-08-11 16:21 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-11 15:50 [PATCH v3 0/5] Hyper-V: Add para-virtualized IOMMU support for Linux guests Yu Zhang
2026-08-11 15:50 ` [PATCH v3 1/5] hyperv: Introduce new hypercall interfaces used by Hyper-V guest IOMMU Yu Zhang
2026-08-11 15:50 ` [PATCH v3 2/5] Drivers: hv: Add logical device ID registry for vPCI devices Yu Zhang
2026-08-11 15:50 ` [PATCH v3 3/5] iommu/x86: Share the architectural MSI reserved range Yu Zhang
2026-08-11 16:21   ` Jason Gunthorpe
2026-08-11 15:50 ` [PATCH v3 4/5] iommu/hyperv: Add para-virtualized IOMMU support for Hyper-V guest Yu Zhang
2026-08-11 15:50 ` [PATCH v3 5/5] iommu/hyperv: Add page-selective IOTLB flush support Yu Zhang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox