summaryrefslogtreecommitdiffstats
path: root/drivers/iommu/intel-iommu.c
diff options
context:
space:
mode:
authorEric Auger <eric.auger@redhat.com>2019-06-03 02:53:36 -0400
committerJoerg Roedel <jroedel@suse.de>2019-06-12 04:32:59 -0400
commit1c5c59fbad20a63954de07687e4a29af18d1be12 (patch)
tree679f960be04e177ca11c24917f3b3756a594e3fc /drivers/iommu/intel-iommu.c
parentadfd373820906d376c8b643f1a279ac809605b6b (diff)
iommu/vt-d: Differentiate relaxable and non relaxable RMRRs
Now we have a new IOMMU_RESV_DIRECT_RELAXABLE reserved memory region type, let's report USB and GFX RMRRs as relaxable ones. We introduce a new device_rmrr_is_relaxable() helper to check whether the rmrr belongs to the relaxable category. This allows to have a finer reporting at IOMMU API level of reserved memory regions. This will be exploitable by VFIO to define the usable IOVA range and detect potential conflicts between the guest physical address space and host reserved regions. Signed-off-by: Eric Auger <eric.auger@redhat.com> Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com> Signed-off-by: Joerg Roedel <jroedel@suse.de>
Diffstat (limited to 'drivers/iommu/intel-iommu.c')
-rw-r--r--drivers/iommu/intel-iommu.c54
1 files changed, 39 insertions, 15 deletions
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index 5de48ed1f763..10bdf7ea9564 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -2890,6 +2890,35 @@ static bool device_has_rmrr(struct device *dev)
2890 return false; 2890 return false;
2891} 2891}
2892 2892
2893/**
2894 * device_rmrr_is_relaxable - Test whether the RMRR of this device
2895 * is relaxable (ie. is allowed to be not enforced under some conditions)
2896 * @dev: device handle
2897 *
2898 * We assume that PCI USB devices with RMRRs have them largely
2899 * for historical reasons and that the RMRR space is not actively used post
2900 * boot. This exclusion may change if vendors begin to abuse it.
2901 *
2902 * The same exception is made for graphics devices, with the requirement that
2903 * any use of the RMRR regions will be torn down before assigning the device
2904 * to a guest.
2905 *
2906 * Return: true if the RMRR is relaxable, false otherwise
2907 */
2908static bool device_rmrr_is_relaxable(struct device *dev)
2909{
2910 struct pci_dev *pdev;
2911
2912 if (!dev_is_pci(dev))
2913 return false;
2914
2915 pdev = to_pci_dev(dev);
2916 if (IS_USB_DEVICE(pdev) || IS_GFX_DEVICE(pdev))
2917 return true;
2918 else
2919 return false;
2920}
2921
2893/* 2922/*
2894 * There are a couple cases where we need to restrict the functionality of 2923 * There are a couple cases where we need to restrict the functionality of
2895 * devices associated with RMRRs. The first is when evaluating a device for 2924 * devices associated with RMRRs. The first is when evaluating a device for
@@ -2904,25 +2933,16 @@ static bool device_has_rmrr(struct device *dev)
2904 * We therefore prevent devices associated with an RMRR from participating in 2933 * We therefore prevent devices associated with an RMRR from participating in
2905 * the IOMMU API, which eliminates them from device assignment. 2934 * the IOMMU API, which eliminates them from device assignment.
2906 * 2935 *
2907 * In both cases we assume that PCI USB devices with RMRRs have them largely 2936 * In both cases, devices which have relaxable RMRRs are not concerned by this
2908 * for historical reasons and that the RMRR space is not actively used post 2937 * restriction. See device_rmrr_is_relaxable comment.
2909 * boot. This exclusion may change if vendors begin to abuse it.
2910 *
2911 * The same exception is made for graphics devices, with the requirement that
2912 * any use of the RMRR regions will be torn down before assigning the device
2913 * to a guest.
2914 */ 2938 */
2915static bool device_is_rmrr_locked(struct device *dev) 2939static bool device_is_rmrr_locked(struct device *dev)
2916{ 2940{
2917 if (!device_has_rmrr(dev)) 2941 if (!device_has_rmrr(dev))
2918 return false; 2942 return false;
2919 2943
2920 if (dev_is_pci(dev)) { 2944 if (device_rmrr_is_relaxable(dev))
2921 struct pci_dev *pdev = to_pci_dev(dev); 2945 return false;
2922
2923 if (IS_USB_DEVICE(pdev) || IS_GFX_DEVICE(pdev))
2924 return false;
2925 }
2926 2946
2927 return true; 2947 return true;
2928} 2948}
@@ -5424,6 +5444,7 @@ static void intel_iommu_get_resv_regions(struct device *device,
5424 for_each_active_dev_scope(rmrr->devices, rmrr->devices_cnt, 5444 for_each_active_dev_scope(rmrr->devices, rmrr->devices_cnt,
5425 i, i_dev) { 5445 i, i_dev) {
5426 struct iommu_resv_region *resv; 5446 struct iommu_resv_region *resv;
5447 enum iommu_resv_type type;
5427 size_t length; 5448 size_t length;
5428 5449
5429 if (i_dev != device && 5450 if (i_dev != device &&
@@ -5431,9 +5452,12 @@ static void intel_iommu_get_resv_regions(struct device *device,
5431 continue; 5452 continue;
5432 5453
5433 length = rmrr->end_address - rmrr->base_address + 1; 5454 length = rmrr->end_address - rmrr->base_address + 1;
5455
5456 type = device_rmrr_is_relaxable(device) ?
5457 IOMMU_RESV_DIRECT_RELAXABLE : IOMMU_RESV_DIRECT;
5458
5434 resv = iommu_alloc_resv_region(rmrr->base_address, 5459 resv = iommu_alloc_resv_region(rmrr->base_address,
5435 length, prot, 5460 length, prot, type);
5436 IOMMU_RESV_DIRECT);
5437 if (!resv) 5461 if (!resv)
5438 break; 5462 break;
5439 5463