On Mon, Sep 07, 2026 at 04:48:23PM +0800, Yu Zhang wrote:

Hi Joerg, Jason,

A gentle ping on this series. Could you let me know whether it is ready to be
picked up, or whether any further changes or acks are needed? Thanks a lot!

B.R.
Yu

> 
> Hi Jason, Joerg,
>                                                                               
>                                                                           
> Do you have any further comments on this version, particularly
> any remaining issues that would warrant a respin before the series
> can be considered for inclusion? Thanks a lot! 
> 
> B.R.
> Yu
> 
> > 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:
> > 
> > v4[1] -> v5:
> > - Added Michael Kelley's Reviewed-by tags for patch 1/2/3/4.
> > 
> > - hv: logical device ID registry:
> >   - Used four-digit hexadecimal values to print PCI domain numbers.
> >   - Included the PCI domain number in the unregister failure warning.
> > 
> > - iommu/hyperv: para-virtualized IOMMU:
> >   - Removed the unused per-device endpoint structure, allocation,
> >     private pointer, and release_device() callback.
> >   - Clarified the logical device ID lookup failure message.
> >   - Read the ATS capability from the IOMMU associated with the domain
> >     instead of the global IOMMU pointer.
> > 
> > - iommu/hyperv: page-selective IOTLB flush:
> >   - Unified normal and full-range descriptor construction around the
> >     aligned range start.
> >   - Used max() to express the minimum Hyper-V page granularity.
> >   - Reported Hyper-V status values in warnings when the flush fails.
> > 
> > v3[2] -> v4:
> > - Added Jacob Pan's Reviewed-by tag for patch 1/4/5.
> > 
> > - hyperv: hypercall interfaces:
> >   - Added the authoritative Hyper-V type names to imported definitions.
> >   - Added HV_STATUS_DEVICE_ALREADY_IN_DOMAIN and mapped it to -EEXIST.
> > 
> > - hv: logical device ID registry:
> >   - Made the registry independent of CONFIG_HYPERV_PVIOMMU.
> >   - Renamed the APIs to hv_pci_xxx_dev_id(),
> >   - Reworked initialization and error cleanup to propagate failures.
> >   - Return -EEXIST with a warning for duplicate registration.
> > 
> > - iommu/x86: architectural MSI reserved region:
> >   - Replaced the exported range constants with
> >     iommu_alloc_resv_x86_msi_region().
> > 
> > - iommu/hyperv: para-virtualized IOMMU:
> >   - Accepted HV_STATUS_DEVICE_ALREADY_IN_DOMAIN as a successful attach,
> >     and removed the blocking-domain-specific duplicate check.
> >   - Removed the redundant ATS disable from release_device(); ATS is
> >     disabled when attaching the release domain.
> > 
> > - iommu/hyperv: page-selective IOTLB flush:
> >   - Removed the redundant include of linux/hyperv.h.
> >   - Documented that the list flush also invalidates non-leaf page-walk
> >     caches before detached page-table pages are freed.
> > 
> > v2[3] -> 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[4] -> 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[5] -> v1[4]:
> > - 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] v4:
> > https://lore.kernel.org/linux-hyperv/[email protected]/
> > [2] v3:
> > https://lore.kernel.org/linux-hyperv/[email protected]/
> > [3] v2:
> > https://lore.kernel.org/linux-hyperv/[email protected]/
> > [4] v1:
> > https://lore.kernel.org/linux-hyperv/[email protected]/
> > [5] RFC v1:
> > https://lore.kernel.org/linux-hyperv/[email protected]/
> > 
> > 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: Add architectural MSI reserved region helper
> >   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          |  14 +
> >  arch/x86/include/asm/mshyperv.h       |   4 +
> >  drivers/hv/hv_common.c                | 115 +++++
> >  drivers/iommu/Kconfig                 |   1 +
> >  drivers/iommu/amd/iommu.c             |   6 +-
> >  drivers/iommu/hyperv/Kconfig          |  16 +
> >  drivers/iommu/hyperv/Makefile         |   1 +
> >  drivers/iommu/hyperv/hv-iommu-guest.c | 679 ++++++++++++++++++++++++++
> >  drivers/iommu/hyperv/iommu.h          |  44 ++
> >  drivers/iommu/intel/iommu.c           |   6 +-
> >  drivers/pci/controller/pci-hyperv.c   |  21 +-
> >  include/asm-generic/mshyperv.h        |   4 +
> >  include/hyperv/hvgdk_mini.h           |  10 +
> >  include/hyperv/hvhdk_mini.h           | 155 ++++++
> >  include/linux/hyperv.h                |   8 +
> >  16 files changed, 1073 insertions(+), 15 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
> > 
> 

Reply via email to