RE: [PATCH v2 1/4] iommu/vt-d: Refactor device_to_iommu() helper

From: Tian, Kevin
Date: Sun Jul 05 2020 - 21:05:05 EST


> From: Lu Baolu <baolu.lu@xxxxxxxxxxxxxxx>
> 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 <baolu.lu@xxxxxxxxxxxxxxx>
> ---
> 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, &bus, &devfn);
> + 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, &bus, &devfn);
> + 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, &bus, &devfn);
> + 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, &bus, &devfn);
> + 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, &bus, &devfn);
> - 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, &bus, &devfn);
> + iommu = device_to_iommu(dev, NULL, NULL);
> if (!iommu || dmar_disabled)
> return -EINVAL;
>
> diff --git a/drivers/iommu/intel/svm.c b/drivers/iommu/intel/svm.c
> index 6c87c807a0ab..25dd74f27252 100644
> --- a/drivers/iommu/intel/svm.c
> +++ b/drivers/iommu/intel/svm.c
> @@ -231,7 +231,7 @@ static LIST_HEAD(global_svm_list);
> int intel_svm_bind_gpasid(struct iommu_domain *domain, struct device
> *dev,
> struct iommu_gpasid_bind_data *data)
> {
> - struct intel_iommu *iommu = intel_svm_device_to_iommu(dev);
> + struct intel_iommu *iommu = device_to_iommu(dev, NULL, NULL);
> struct dmar_domain *dmar_domain;
> struct intel_svm_dev *sdev;
> struct intel_svm *svm;
> @@ -373,7 +373,7 @@ int intel_svm_bind_gpasid(struct iommu_domain
> *domain, struct device *dev,
>
> int intel_svm_unbind_gpasid(struct device *dev, int pasid)
> {
> - struct intel_iommu *iommu = intel_svm_device_to_iommu(dev);
> + struct intel_iommu *iommu = device_to_iommu(dev, NULL, NULL);
> struct intel_svm_dev *sdev;
> struct intel_svm *svm;
> int ret = -EINVAL;
> @@ -430,7 +430,7 @@ static int
> intel_svm_bind_mm(struct device *dev, int flags, struct svm_dev_ops *ops,
> struct mm_struct *mm, struct intel_svm_dev **sd)
> {
> - struct intel_iommu *iommu = intel_svm_device_to_iommu(dev);
> + struct intel_iommu *iommu = device_to_iommu(dev, NULL, NULL);
> struct device_domain_info *info;
> struct intel_svm_dev *sdev;
> struct intel_svm *svm = NULL;
> @@ -608,7 +608,7 @@ static int intel_svm_unbind_mm(struct device *dev,
> int pasid)
> struct intel_svm *svm;
> int ret = -EINVAL;
>
> - iommu = intel_svm_device_to_iommu(dev);
> + iommu = device_to_iommu(dev, NULL, NULL);
> if (!iommu)
> goto out;
>
> diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h
> index 3e8fa1c7a1e6..fc2cfc3db6e1 100644
> --- a/include/linux/intel-iommu.h
> +++ b/include/linux/intel-iommu.h
> @@ -728,6 +728,7 @@ void iommu_flush_write_buffer(struct intel_iommu
> *iommu);
> int intel_iommu_enable_pasid(struct intel_iommu *iommu, struct device
> *dev);
> struct dmar_domain *find_domain(struct device *dev);
> struct device_domain_info *get_domain_info(struct device *dev);
> +struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8
> *devfn);
>
> #ifdef CONFIG_INTEL_IOMMU_SVM
> extern void intel_svm_check(struct intel_iommu *iommu);
> @@ -766,8 +767,6 @@ struct intel_svm {
> struct list_head devs;
> struct list_head list;
> };
> -
> -extern struct intel_iommu *intel_svm_device_to_iommu(struct device *dev);
> #else
> static inline void intel_svm_check(struct intel_iommu *iommu) {}
> #endif
> --
> 2.17.1

Reviewed-by: Kevin Tian <kevin.tian@xxxxxxxxx>