RE: [PATCH v2 1/4] iommu/vt-d: Refactor device_to_iommu() helper
> From: Lu Baolu > Sent: Monday, July 6, 2020 8:26 AM > > It is refactored in two ways: > > - Make it global so that it could be used in other files. > > - Make bus/devfn optional so that callers could ignore these two returned > values when they only want to get the coresponding iommu pointer. > > Signed-off-by: Lu Baolu > --- > drivers/iommu/intel/iommu.c | 55 +++-- > drivers/iommu/intel/svm.c | 8 +++--- > include/linux/intel-iommu.h | 3 +- > 3 files changed, 21 insertions(+), 45 deletions(-) > > diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c > index d759e7234e98..de17952ed133 100644 > --- a/drivers/iommu/intel/iommu.c > +++ b/drivers/iommu/intel/iommu.c > @@ -778,16 +778,16 @@ is_downstream_to_pci_bridge(struct device *dev, > struct device *bridge) > return false; > } > > -static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 > *devfn) > +struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 > *devfn) > { > struct dmar_drhd_unit *drhd = NULL; > + struct pci_dev *pdev = NULL; > struct intel_iommu *iommu; > struct device *tmp; > - struct pci_dev *pdev = NULL; > u16 segment = 0; > int i; > > - if (iommu_dummy(dev)) > + if (!dev || iommu_dummy(dev)) > return NULL; > > if (dev_is_pci(dev)) { > @@ -818,8 +818,10 @@ static struct intel_iommu *device_to_iommu(struct > device *dev, u8 *bus, u8 *devf > if (pdev && pdev->is_virtfn) > goto got_pdev; > > - *bus = drhd->devices[i].bus; > - *devfn = drhd->devices[i].devfn; > + if (bus && devfn) { > + *bus = drhd->devices[i].bus; > + *devfn = drhd->devices[i].devfn; > + } > goto out; > } > > @@ -829,8 +831,10 @@ static struct intel_iommu *device_to_iommu(struct > device *dev, u8 *bus, u8 *devf > > if (pdev && drhd->include_all) { > got_pdev: > - *bus = pdev->bus->number; > - *devfn = pdev->devfn; > + if (bus && devfn) { > + *bus = pdev->bus->number; > + *devfn = pdev->devfn; > + } > goto out; > } > } > @@ -5146,11 +5150,10 @@ static int aux_domain_add_dev(struct > dmar_domain *domain, > struct device *dev) > { > int ret; > - u8 bus, devfn; > unsigned long flags; > struct intel_iommu *iommu; > > - iommu = device_to_iommu(dev, , ); > + iommu = device_to_iommu(dev, NULL, NULL); > if (!iommu) > return -ENODEV; > > @@ -5236,9 +5239,8 @@ static int prepare_domain_attach_device(struct > iommu_domain *domain, > struct dmar_domain *dmar_domain = to_dmar_domain(domain); > struct intel_iommu *iommu; > int addr_width; > - u8 bus, devfn; > > - iommu = device_to_iommu(dev, , ); > + iommu = device_to_iommu(dev, NULL, NULL); > if (!iommu) > return -ENODEV; > > @@ -5658,9 +5660,8 @@ static bool intel_iommu_capable(enum > iommu_cap cap) > static struct iommu_device *intel_iommu_probe_device(struct device *dev) > { > struct intel_iommu *iommu; > - u8 bus, devfn; > > - iommu = device_to_iommu(dev, , ); > + iommu = device_to_iommu(dev, NULL, NULL); > if (!iommu) > return ERR_PTR(-ENODEV); > > @@ -5673,9 +5674,8 @@ static struct iommu_device > *intel_iommu_probe_device(struct device *dev) > static void intel_iommu_release_device(struct device *dev) > { > struct intel_iommu *iommu; > - u8 bus, devfn; > > - iommu = device_to_iommu(dev, , ); > + iommu = device_to_iommu(dev, NULL, NULL); > if (!iommu) > return; > > @@ -5825,37 +5825,14 @@ static struct iommu_group > *intel_iommu_device_group(struct device *dev) > return generic_device_group(dev); > } > > -#ifdef CONFIG_INTEL_IOMMU_SVM > -struct intel_iommu *intel_svm_device_to_iommu(struct device *dev) > -{ > - struct intel_iommu *iommu; > - u8 bus, devfn; > - > - if (iommu_dummy(dev)) { > - dev_warn(dev, > - "No IOMMU translation for device; cannot enable > SVM\n"); > - return NULL; > - } > - > - iommu = device_to_iommu(dev, , ); > - if ((!iommu)) { > - dev_err(dev, "No IOMMU for device; cannot enable SVM\n"); > - return NULL; > - } > - > - return iommu; > -} > -#endif /* CONFIG_INTEL_IOMMU_SVM */ > - > static int intel_iommu_enable_auxd(struct device *dev) > { > struct device_domain_info *info; > struct intel_iommu *iommu; >
[PATCH v2 1/4] iommu/vt-d: Refactor device_to_iommu() helper
It is refactored in two ways: - Make it global so that it could be used in other files. - Make bus/devfn optional so that callers could ignore these two returned values when they only want to get the coresponding iommu pointer. Signed-off-by: Lu Baolu --- drivers/iommu/intel/iommu.c | 55 +++-- drivers/iommu/intel/svm.c | 8 +++--- include/linux/intel-iommu.h | 3 +- 3 files changed, 21 insertions(+), 45 deletions(-) diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c index d759e7234e98..de17952ed133 100644 --- a/drivers/iommu/intel/iommu.c +++ b/drivers/iommu/intel/iommu.c @@ -778,16 +778,16 @@ is_downstream_to_pci_bridge(struct device *dev, struct device *bridge) return false; } -static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devfn) +struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devfn) { struct dmar_drhd_unit *drhd = NULL; + struct pci_dev *pdev = NULL; struct intel_iommu *iommu; struct device *tmp; - struct pci_dev *pdev = NULL; u16 segment = 0; int i; - if (iommu_dummy(dev)) + if (!dev || iommu_dummy(dev)) return NULL; if (dev_is_pci(dev)) { @@ -818,8 +818,10 @@ static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devf if (pdev && pdev->is_virtfn) goto got_pdev; - *bus = drhd->devices[i].bus; - *devfn = drhd->devices[i].devfn; + if (bus && devfn) { + *bus = drhd->devices[i].bus; + *devfn = drhd->devices[i].devfn; + } goto out; } @@ -829,8 +831,10 @@ static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devf if (pdev && drhd->include_all) { got_pdev: - *bus = pdev->bus->number; - *devfn = pdev->devfn; + if (bus && devfn) { + *bus = pdev->bus->number; + *devfn = pdev->devfn; + } goto out; } } @@ -5146,11 +5150,10 @@ static int aux_domain_add_dev(struct dmar_domain *domain, struct device *dev) { int ret; - u8 bus, devfn; unsigned long flags; struct intel_iommu *iommu; - iommu = device_to_iommu(dev, , ); + iommu = device_to_iommu(dev, NULL, NULL); if (!iommu) return -ENODEV; @@ -5236,9 +5239,8 @@ static int prepare_domain_attach_device(struct iommu_domain *domain, struct dmar_domain *dmar_domain = to_dmar_domain(domain); struct intel_iommu *iommu; int addr_width; - u8 bus, devfn; - iommu = device_to_iommu(dev, , ); + iommu = device_to_iommu(dev, NULL, NULL); if (!iommu) return -ENODEV; @@ -5658,9 +5660,8 @@ static bool intel_iommu_capable(enum iommu_cap cap) static struct iommu_device *intel_iommu_probe_device(struct device *dev) { struct intel_iommu *iommu; - u8 bus, devfn; - iommu = device_to_iommu(dev, , ); + iommu = device_to_iommu(dev, NULL, NULL); if (!iommu) return ERR_PTR(-ENODEV); @@ -5673,9 +5674,8 @@ static struct iommu_device *intel_iommu_probe_device(struct device *dev) static void intel_iommu_release_device(struct device *dev) { struct intel_iommu *iommu; - u8 bus, devfn; - iommu = device_to_iommu(dev, , ); + iommu = device_to_iommu(dev, NULL, NULL); if (!iommu) return; @@ -5825,37 +5825,14 @@ static struct iommu_group *intel_iommu_device_group(struct device *dev) return generic_device_group(dev); } -#ifdef CONFIG_INTEL_IOMMU_SVM -struct intel_iommu *intel_svm_device_to_iommu(struct device *dev) -{ - struct intel_iommu *iommu; - u8 bus, devfn; - - if (iommu_dummy(dev)) { - dev_warn(dev, -"No IOMMU translation for device; cannot enable SVM\n"); - return NULL; - } - - iommu = device_to_iommu(dev, , ); - if ((!iommu)) { - dev_err(dev, "No IOMMU for device; cannot enable SVM\n"); - return NULL; - } - - return iommu; -} -#endif /* CONFIG_INTEL_IOMMU_SVM */ - static int intel_iommu_enable_auxd(struct device *dev) { struct device_domain_info *info; struct intel_iommu *iommu; unsigned long flags; - u8 bus, devfn; int ret; - iommu = device_to_iommu(dev, , ); + iommu = device_to_iommu(dev, NULL, NULL); if (!iommu