]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iommu/vt-d: Remove identity mappings from si_domain
authorLu Baolu <baolu.lu@linux.intel.com>
Mon, 2 Sep 2024 02:27:12 +0000 (10:27 +0800)
committerJoerg Roedel <jroedel@suse.de>
Mon, 2 Sep 2024 16:14:55 +0000 (18:14 +0200)
As the driver has enforced DMA domains for devices managed by an IOMMU
hardware that doesn't support passthrough translation mode, there is no
need for static identity mappings in the si_domain. Remove the identity
mapping code to avoid dead code.

Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Link: https://lore.kernel.org/r/20240809055431.36513-3-baolu.lu@linux.intel.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/intel/iommu.c

index 90ad794a1be737b8eca54de4d1229627331f2272..723ea9f3f501af9032ea34782736fa602a427e10 100644 (file)
@@ -167,14 +167,7 @@ static void device_rbtree_remove(struct device_domain_info *info)
        spin_unlock_irqrestore(&iommu->device_rbtree_lock, flags);
 }
 
-/*
- * This domain is a statically identity mapping domain.
- *     1. This domain creats a static 1:1 mapping to all usable memory.
- *     2. It maps to each iommu if successful.
- *     3. Each iommu mapps to this domain if successful.
- */
 static struct dmar_domain *si_domain;
-static int hw_pass_through = 1;
 
 struct dmar_rmrr_unit {
        struct list_head list;          /* list of rmrr units   */
@@ -1647,7 +1640,7 @@ static int domain_context_mapping_one(struct dmar_domain *domain,
        struct context_entry *context;
        int agaw, ret;
 
-       if (hw_pass_through && domain_type_is_si(domain))
+       if (domain_type_is_si(domain))
                translation = CONTEXT_TT_PASS_THROUGH;
 
        pr_debug("Set context mapping for %02x:%02x.%d\n",
@@ -1998,29 +1991,10 @@ static bool dev_is_real_dma_subdevice(struct device *dev)
               pci_real_dma_dev(to_pci_dev(dev)) != to_pci_dev(dev);
 }
 
-static int iommu_domain_identity_map(struct dmar_domain *domain,
-                                    unsigned long first_vpfn,
-                                    unsigned long last_vpfn)
-{
-       /*
-        * RMRR range might have overlap with physical memory range,
-        * clear it first
-        */
-       dma_pte_clear_range(domain, first_vpfn, last_vpfn);
-
-       return __domain_mapping(domain, first_vpfn,
-                               first_vpfn, last_vpfn - first_vpfn + 1,
-                               DMA_PTE_READ|DMA_PTE_WRITE, GFP_KERNEL);
-}
-
 static int md_domain_init(struct dmar_domain *domain, int guest_width);
 
-static int __init si_domain_init(int hw)
+static int __init si_domain_init(void)
 {
-       struct dmar_rmrr_unit *rmrr;
-       struct device *dev;
-       int i, nid, ret;
-
        si_domain = alloc_domain(IOMMU_DOMAIN_IDENTITY);
        if (!si_domain)
                return -EFAULT;
@@ -2031,44 +2005,6 @@ static int __init si_domain_init(int hw)
                return -EFAULT;
        }
 
-       if (hw)
-               return 0;
-
-       for_each_online_node(nid) {
-               unsigned long start_pfn, end_pfn;
-               int i;
-
-               for_each_mem_pfn_range(i, nid, &start_pfn, &end_pfn, NULL) {
-                       ret = iommu_domain_identity_map(si_domain,
-                                       mm_to_dma_pfn_start(start_pfn),
-                                       mm_to_dma_pfn_end(end_pfn-1));
-                       if (ret)
-                               return ret;
-               }
-       }
-
-       /*
-        * Identity map the RMRRs so that devices with RMRRs could also use
-        * the si_domain.
-        */
-       for_each_rmrr_units(rmrr) {
-               for_each_active_dev_scope(rmrr->devices, rmrr->devices_cnt,
-                                         i, dev) {
-                       unsigned long long start = rmrr->base_address;
-                       unsigned long long end = rmrr->end_address;
-
-                       if (WARN_ON(end < start ||
-                                   end >> agaw_to_width(si_domain->agaw)))
-                               continue;
-
-                       ret = iommu_domain_identity_map(si_domain,
-                                       mm_to_dma_pfn_start(start >> PAGE_SHIFT),
-                                       mm_to_dma_pfn_end(end >> PAGE_SHIFT));
-                       if (ret)
-                               return ret;
-               }
-       }
-
        return 0;
 }
 
@@ -2094,7 +2030,7 @@ static int dmar_domain_attach_device(struct dmar_domain *domain,
 
        if (!sm_supported(iommu))
                ret = domain_context_mapping(domain, dev);
-       else if (hw_pass_through && domain_type_is_si(domain))
+       else if (domain_type_is_si(domain))
                ret = intel_pasid_setup_pass_through(iommu, dev, IOMMU_NO_PASID);
        else if (domain->use_first_level)
                ret = domain_setup_first_level(iommu, domain, dev, IOMMU_NO_PASID);
@@ -2449,8 +2385,6 @@ static int __init init_dmars(void)
                        }
                }
 
-               if (!ecap_pass_through(iommu->ecap))
-                       hw_pass_through = 0;
                intel_svm_check(iommu);
        }
 
@@ -2466,7 +2400,7 @@ static int __init init_dmars(void)
 
        check_tylersburg_isoch();
 
-       ret = si_domain_init(hw_pass_through);
+       ret = si_domain_init();
        if (ret)
                goto free_iommu;
 
@@ -2893,12 +2827,6 @@ static int intel_iommu_add(struct dmar_drhd_unit *dmaru)
        if (ret)
                goto out;
 
-       if (hw_pass_through && !ecap_pass_through(iommu->ecap)) {
-               pr_warn("%s: Doesn't support hardware pass through.\n",
-                       iommu->name);
-               return -ENXIO;
-       }
-
        sp = domain_update_iommu_superpage(NULL, iommu) - 1;
        if (sp >= 0 && !(cap_super_page_val(iommu->cap) & (1 << sp))) {
                pr_warn("%s: Doesn't support large page.\n",
@@ -3149,43 +3077,6 @@ int dmar_iommu_notify_scope_dev(struct dmar_pci_notify_info *info)
        return 0;
 }
 
-static int intel_iommu_memory_notifier(struct notifier_block *nb,
-                                      unsigned long val, void *v)
-{
-       struct memory_notify *mhp = v;
-       unsigned long start_vpfn = mm_to_dma_pfn_start(mhp->start_pfn);
-       unsigned long last_vpfn = mm_to_dma_pfn_end(mhp->start_pfn +
-                       mhp->nr_pages - 1);
-
-       switch (val) {
-       case MEM_GOING_ONLINE:
-               if (iommu_domain_identity_map(si_domain,
-                                             start_vpfn, last_vpfn)) {
-                       pr_warn("Failed to build identity map for [%lx-%lx]\n",
-                               start_vpfn, last_vpfn);
-                       return NOTIFY_BAD;
-               }
-               break;
-
-       case MEM_OFFLINE:
-       case MEM_CANCEL_ONLINE:
-               {
-                       LIST_HEAD(freelist);
-
-                       domain_unmap(si_domain, start_vpfn, last_vpfn, &freelist);
-                       iommu_put_pages_list(&freelist);
-               }
-               break;
-       }
-
-       return NOTIFY_OK;
-}
-
-static struct notifier_block intel_iommu_memory_nb = {
-       .notifier_call = intel_iommu_memory_notifier,
-       .priority = 0
-};
-
 static void intel_disable_iommus(void)
 {
        struct intel_iommu *iommu = NULL;
@@ -3482,12 +3373,7 @@ int __init intel_iommu_init(void)
 
                iommu_pmu_register(iommu);
        }
-       up_read(&dmar_global_lock);
-
-       if (si_domain && !hw_pass_through)
-               register_memory_notifier(&intel_iommu_memory_nb);
 
-       down_read(&dmar_global_lock);
        if (probe_acpi_namespace_devices())
                pr_warn("ACPI name space devices didn't probe correctly\n");