]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iommu/vt-d: Refactor device_to_iommu() to retrieve iommu directly
authorLu Baolu <baolu.lu@linux.intel.com>
Mon, 18 Dec 2023 07:34:42 +0000 (15:34 +0800)
committerJoerg Roedel <jroedel@suse.de>
Tue, 19 Dec 2023 13:32:26 +0000 (14:32 +0100)
The device_to_iommu() helper was originally designed to look up the DMAR
ACPI table to retrieve the iommu device and the request ID for a given
device. However, it was also being used in other places where there was
no need to lookup the ACPI table at all.

Retrieve the iommu device directly from the per-device iommu private data
in functions called after device is probed.

Rename the original device_to_iommu() function to a more meaningful name,
device_lookup_iommu(), to avoid mis-using it.

Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
Link: https://lore.kernel.org/r/20231116015048.29675-2-baolu.lu@linux.intel.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/intel/iommu.c
drivers/iommu/intel/iommu.h
drivers/iommu/intel/svm.c

index 3531b956556c7df268ee32a5053a755d5ce0630b..3b25b36bb9c737e07e5aefa154f33be4f7775788 100644 (file)
@@ -703,7 +703,7 @@ static bool iommu_is_dummy(struct intel_iommu *iommu, struct device *dev)
        return false;
 }
 
-struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devfn)
+static struct intel_iommu *device_lookup_iommu(struct device *dev, u8 *bus, u8 *devfn)
 {
        struct dmar_drhd_unit *drhd = NULL;
        struct pci_dev *pdev = NULL;
@@ -2081,14 +2081,11 @@ static int domain_context_mapping_cb(struct pci_dev *pdev,
 static int
 domain_context_mapping(struct dmar_domain *domain, struct device *dev)
 {
+       struct device_domain_info *info = dev_iommu_priv_get(dev);
        struct domain_context_mapping_data data;
+       struct intel_iommu *iommu = info->iommu;
+       u8 bus = info->bus, devfn = info->devfn;
        struct pasid_table *table;
-       struct intel_iommu *iommu;
-       u8 bus, devfn;
-
-       iommu = device_to_iommu(dev, &bus, &devfn);
-       if (!iommu)
-               return -ENODEV;
 
        table = intel_pasid_get_table(dev);
 
@@ -2447,15 +2444,10 @@ static int dmar_domain_attach_device(struct dmar_domain *domain,
                                     struct device *dev)
 {
        struct device_domain_info *info = dev_iommu_priv_get(dev);
-       struct intel_iommu *iommu;
+       struct intel_iommu *iommu = info->iommu;
        unsigned long flags;
-       u8 bus, devfn;
        int ret;
 
-       iommu = device_to_iommu(dev, &bus, &devfn);
-       if (!iommu)
-               return -ENODEV;
-
        ret = domain_attach_iommu(domain, iommu);
        if (ret)
                return ret;
@@ -4116,14 +4108,11 @@ static void intel_iommu_domain_free(struct iommu_domain *domain)
 int prepare_domain_attach_device(struct iommu_domain *domain,
                                 struct device *dev)
 {
+       struct device_domain_info *info = dev_iommu_priv_get(dev);
        struct dmar_domain *dmar_domain = to_dmar_domain(domain);
-       struct intel_iommu *iommu;
+       struct intel_iommu *iommu = info->iommu;
        int addr_width;
 
-       iommu = device_to_iommu(dev, NULL, NULL);
-       if (!iommu)
-               return -ENODEV;
-
        if (dmar_domain->force_snooping && !ecap_sc_support(iommu->ecap))
                return -EINVAL;
 
@@ -4399,7 +4388,7 @@ static struct iommu_device *intel_iommu_probe_device(struct device *dev)
        u8 bus, devfn;
        int ret;
 
-       iommu = device_to_iommu(dev, &bus, &devfn);
+       iommu = device_lookup_iommu(dev, &bus, &devfn);
        if (!iommu || !iommu->iommu.ops)
                return ERR_PTR(-ENODEV);
 
@@ -4735,8 +4724,9 @@ static int intel_iommu_iotlb_sync_map(struct iommu_domain *domain,
 
 static void intel_iommu_remove_dev_pasid(struct device *dev, ioasid_t pasid)
 {
-       struct intel_iommu *iommu = device_to_iommu(dev, NULL, NULL);
+       struct device_domain_info *info = dev_iommu_priv_get(dev);
        struct dev_pasid_info *curr, *dev_pasid = NULL;
+       struct intel_iommu *iommu = info->iommu;
        struct dmar_domain *dmar_domain;
        struct iommu_domain *domain;
        unsigned long flags;
index 65d37a138c75d48ccac9a3de4ea68573a1c1fc6b..f8f956ce43c52d466234eeb106bceaae0b2f2299 100644 (file)
@@ -897,7 +897,6 @@ int dmar_ir_support(void);
 void *alloc_pgtable_page(int node, gfp_t gfp);
 void free_pgtable_page(void *vaddr);
 void iommu_flush_write_buffer(struct intel_iommu *iommu);
-struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devfn);
 struct iommu_domain *intel_nested_domain_alloc(struct iommu_domain *parent,
                                               const struct iommu_user_data *user_data);
 
index 50a481c895b867202a4317afb7ef19a5666eafe5..cc138e3ed4a6b64d2c30931f94b857c831164397 100644 (file)
@@ -366,14 +366,9 @@ free_svm:
 void intel_svm_remove_dev_pasid(struct device *dev, u32 pasid)
 {
        struct intel_svm_dev *sdev;
-       struct intel_iommu *iommu;
        struct intel_svm *svm;
        struct mm_struct *mm;
 
-       iommu = device_to_iommu(dev, NULL, NULL);
-       if (!iommu)
-               return;
-
        if (pasid_to_svm_sdev(dev, pasid, &svm, &sdev))
                return;
        mm = svm->mm;
@@ -724,25 +719,16 @@ int intel_svm_page_response(struct device *dev,
                            struct iommu_fault_event *evt,
                            struct iommu_page_response *msg)
 {
+       struct device_domain_info *info = dev_iommu_priv_get(dev);
+       struct intel_iommu *iommu = info->iommu;
+       u8 bus = info->bus, devfn = info->devfn;
        struct iommu_fault_page_request *prm;
-       struct intel_iommu *iommu;
        bool private_present;
        bool pasid_present;
        bool last_page;
-       u8 bus, devfn;
        int ret = 0;
        u16 sid;
 
-       if (!dev || !dev_is_pci(dev))
-               return -ENODEV;
-
-       iommu = device_to_iommu(dev, &bus, &devfn);
-       if (!iommu)
-               return -ENODEV;
-
-       if (!msg || !evt)
-               return -EINVAL;
-
        prm = &evt->fault.prm;
        sid = PCI_DEVID(bus, devfn);
        pasid_present = prm->flags & IOMMU_FAULT_PAGE_REQUEST_PASID_VALID;