All of lore.kernel.org
 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.