[PATCH v2 0/7] RMRR related fixes and enhancements

From: Eric Auger
Date: Thu May 16 2019 - 04:49:26 EST


Currently the Intel reserved region is attached to the
RMRR unit and when building the list of RMRR seen by a device
we link this unique reserved region without taking care of
potential multiple usage of this reserved region by several devices.

Also while reading the vtd spec it is unclear to me whether
the RMRR device scope referenced by an RMRR ACPI struct could
be a PCI-PCI bridge, in which case I think we also need to
check the device belongs to the PCI sub-hierarchy of the device
referenced in the scope. This would be true for device_has_rmrr()
and intel_iommu_get_resv_regions().

Last, the VFIO subsystem would need to compute the usable IOVA range
by querying the iommu_get_group_resv_regions() API. This would allow,
for instance, to report potential conflicts between the guest physical
address space and host reserved regions.

However iommu_get_group_resv_regions() currently fails to differentiate
RMRRs that are known safe for device assignment and RMRRs that must be
enforced. So we introduce a new reserved memory region type (relaxable),
reported when associated to an USB or GFX device. The last 2 patches aim
at unblocking [1] which is stuck since 4.18.

[1-5] are fixes
[6-7] are enhancements

References:
[1] [PATCH v6 0/7] vfio/type1: Add support for valid iova list management
https://patchwork.kernel.org/patch/10425309/

The two parts can be considered separately if needed.

History

1->2:
- introduce is_downstream_to_pci_bridge() in a separate patch, change param
names and add kerneldoc comment (Jacob)
- add 6,7


Eric Auger (7):
iommu: Pass a GFP flag parameter to iommu_alloc_resv_region()
iommu/vt-d: Duplicate iommu_resv_region objects per device list
iommu/vt-d: Introduce is_downstream_to_pci_bridge helper
iommu/vt-d: Handle RMRR with PCI bridge device scopes
iommu/vt-d: Handle PCI bridge RMRR device scopes in
intel_iommu_get_resv_regions
iommu: Introduce IOMMU_RESV_DIRECT_RELAXABLE reserved memory regions
iommu/vt-d: Differentiate relaxable and non relaxable RMRRs

drivers/acpi/arm64/iort.c | 3 +-
drivers/iommu/amd_iommu.c | 7 ++--
drivers/iommu/arm-smmu-v3.c | 2 +-
drivers/iommu/arm-smmu.c | 2 +-
drivers/iommu/intel-iommu.c | 82 +++++++++++++++++++++++++------------
drivers/iommu/iommu.c | 19 +++++----
include/linux/iommu.h | 8 +++-
7 files changed, 82 insertions(+), 41 deletions(-)

--
2.20.1