From: Lu Baolu <baolu.lu@linux.intel.com>
To: Joerg Roedel <joro@8bytes.org>
Cc: iommu@lists.linux.dev, linux-kernel@vger.kernel.org
Subject: [PATCH 11/25] iommu/vt-d: Use pci_get_domain_bus_and_slot() in pgtable_walk()
Date: Tue, 12 Jul 2022 08:08:54 +0800 [thread overview]
Message-ID: <20220712000908.3431936-12-baolu.lu@linux.intel.com> (raw)
In-Reply-To: <20220712000908.3431936-1-baolu.lu@linux.intel.com>
Use pci_get_domain_bus_and_slot() instead of searching the global list
to retrieve the pci device pointer. This also removes the global
device_domain_list as there isn't any consumer anymore.
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/20220706025524.2904370-4-baolu.lu@linux.intel.com
---
drivers/iommu/intel/iommu.h | 1 -
drivers/iommu/intel/iommu.c | 34 ++++++----------------------------
2 files changed, 6 insertions(+), 29 deletions(-)
diff --git a/drivers/iommu/intel/iommu.h b/drivers/iommu/intel/iommu.h
index 8deb745d8b36..198c6c822ef4 100644
--- a/drivers/iommu/intel/iommu.h
+++ b/drivers/iommu/intel/iommu.h
@@ -609,7 +609,6 @@ struct intel_iommu {
/* PCI domain-device relationship */
struct device_domain_info {
struct list_head link; /* link to domain siblings */
- struct list_head global; /* link to global list */
u32 segment; /* PCI segment number */
u8 bus; /* PCI bus number */
u8 devfn; /* PCI devfn number */
diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
index 43aaec5bdd84..77915d61f7ec 100644
--- a/drivers/iommu/intel/iommu.c
+++ b/drivers/iommu/intel/iommu.c
@@ -131,8 +131,6 @@ static struct intel_iommu **g_iommus;
static void __init check_tylersburg_isoch(void);
static int rwbf_quirk;
-static inline struct device_domain_info *
-dmar_search_domain_by_dev_info(int segment, int bus, int devfn);
/*
* set to 1 to panic kernel if can't successfully enable VT-d
@@ -315,8 +313,6 @@ static int iommu_skip_te_disable;
#define IDENTMAP_AZALIA 4
static DEFINE_SPINLOCK(device_domain_lock);
-static LIST_HEAD(device_domain_list);
-
const struct iommu_ops intel_iommu_ops;
static bool translation_pre_enabled(struct intel_iommu *iommu)
@@ -846,9 +842,14 @@ static void pgtable_walk(struct intel_iommu *iommu, unsigned long pfn, u8 bus, u
struct device_domain_info *info;
struct dma_pte *parent, *pte;
struct dmar_domain *domain;
+ struct pci_dev *pdev;
int offset, level;
- info = dmar_search_domain_by_dev_info(iommu->segment, bus, devfn);
+ pdev = pci_get_domain_bus_and_slot(iommu->segment, bus, devfn);
+ if (!pdev)
+ return;
+
+ info = dev_iommu_priv_get(&pdev->dev);
if (!info || !info->domain) {
pr_info("device [%02x:%02x.%d] not probed\n",
bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
@@ -2357,19 +2358,6 @@ static void domain_remove_dev_info(struct dmar_domain *domain)
spin_unlock_irqrestore(&device_domain_lock, flags);
}
-static inline struct device_domain_info *
-dmar_search_domain_by_dev_info(int segment, int bus, int devfn)
-{
- struct device_domain_info *info;
-
- list_for_each_entry(info, &device_domain_list, global)
- if (info->segment == segment && info->bus == bus &&
- info->devfn == devfn)
- return info;
-
- return NULL;
-}
-
static int domain_setup_first_level(struct intel_iommu *iommu,
struct dmar_domain *domain,
struct device *dev,
@@ -4573,7 +4561,6 @@ static struct iommu_device *intel_iommu_probe_device(struct device *dev)
struct pci_dev *pdev = dev_is_pci(dev) ? to_pci_dev(dev) : NULL;
struct device_domain_info *info;
struct intel_iommu *iommu;
- unsigned long flags;
u8 bus, devfn;
iommu = device_to_iommu(dev, &bus, &devfn);
@@ -4616,10 +4603,7 @@ static struct iommu_device *intel_iommu_probe_device(struct device *dev)
}
}
- spin_lock_irqsave(&device_domain_lock, flags);
- list_add(&info->global, &device_domain_list);
dev_iommu_priv_set(dev, info);
- spin_unlock_irqrestore(&device_domain_lock, flags);
return &iommu->iommu;
}
@@ -4627,15 +4611,9 @@ static struct iommu_device *intel_iommu_probe_device(struct device *dev)
static void intel_iommu_release_device(struct device *dev)
{
struct device_domain_info *info = dev_iommu_priv_get(dev);
- unsigned long flags;
dmar_remove_one_dev_info(dev);
-
- spin_lock_irqsave(&device_domain_lock, flags);
dev_iommu_priv_set(dev, NULL);
- list_del(&info->global);
- spin_unlock_irqrestore(&device_domain_lock, flags);
-
kfree(info);
set_dma_ops(dev, NULL);
}
--
2.25.1
next prev parent reply other threads:[~2022-07-12 0:14 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-12 0:08 [PATCH 00/25] [PULL REQUEST] Intel IOMMU updates for Linux v5.20 Lu Baolu
2022-07-12 0:08 ` [PATCH 01/25] iommu/vt-d: Move trace/events/intel_iommu.h under iommu Lu Baolu
2022-07-12 0:08 ` [PATCH 02/25] agp/intel: Use per device iommu check Lu Baolu
2022-07-12 0:08 ` [PATCH 03/25] iommu/vt-d: Remove unnecessary exported symbol Lu Baolu
2022-07-12 0:08 ` [PATCH 04/25] drm/i915: Remove unnecessary include Lu Baolu
2022-07-12 0:08 ` [PATCH 05/25] KVM: x86: " Lu Baolu
2022-07-12 0:08 ` [PATCH 06/25] x86/boot/tboot: Move tboot_force_iommu() to Intel IOMMU Lu Baolu
2022-07-12 0:08 ` [PATCH 07/25] iommu/vt-d: Move include/linux/intel-iommu.h under iommu Lu Baolu
2022-07-12 0:08 ` [PATCH 08/25] iommu/vt-d: Remove unused iovad from dmar_domain Lu Baolu
2022-07-12 0:08 ` [PATCH 09/25] iommu/vt-d: debugfs: Remove device_domain_lock usage Lu Baolu
2022-07-12 0:08 ` [PATCH 10/25] iommu/vt-d: Remove clearing translation data in disable_dmar_iommu() Lu Baolu
2022-07-12 0:08 ` Lu Baolu [this message]
2022-07-12 0:08 ` [PATCH 12/25] iommu/vt-d: Unnecessary spinlock for root table alloc and free Lu Baolu
2022-07-12 0:08 ` [PATCH 13/25] iommu/vt-d: Replace spin_lock_irqsave() with spin_lock() Lu Baolu
2022-07-12 0:08 ` [PATCH 14/25] iommu/vt-d: Acquiring lock in domain ID allocation helpers Lu Baolu
2022-07-12 0:08 ` [PATCH 15/25] iommu/vt-d: Acquiring lock in pasid manipulation helpers Lu Baolu
2022-07-12 0:08 ` [PATCH 16/25] iommu/vt-d: Check device list of domain in domain free path Lu Baolu
2022-07-12 0:09 ` [PATCH 17/25] iommu/vt-d: Fold __dmar_remove_one_dev_info() into its caller Lu Baolu
2022-07-12 0:09 ` [PATCH 18/25] iommu/vt-d: Use device_domain_lock accurately Lu Baolu
2022-07-12 0:09 ` [PATCH 19/25] iommu/vt-d: Convert global spinlock into per domain lock Lu Baolu
2022-07-12 0:09 ` [PATCH 20/25] iommu/vt-d: Remove unused domain_get_iommu() Lu Baolu
2022-07-12 0:09 ` [PATCH 21/25] iommu/vt-d: Use IDA interface to manage iommu sequence id Lu Baolu
2022-07-12 0:09 ` [PATCH 22/25] iommu/vt-d: Refactor iommu information of each domain Lu Baolu
2022-07-12 0:09 ` [PATCH 23/25] iommu/vt-d: Remove unnecessary check in intel_iommu_add() Lu Baolu
2022-07-12 0:09 ` [PATCH 24/25] iommu/vt-d: Remove global g_iommus array Lu Baolu
2022-07-12 0:09 ` [PATCH 25/25] iommu/vt-d: Make DMAR_UNITS_SUPPORTED default 1024 Lu Baolu
2022-07-15 8:22 ` [PATCH 00/25] [PULL REQUEST] Intel IOMMU updates for Linux v5.20 Joerg Roedel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220712000908.3431936-12-baolu.lu@linux.intel.com \
--to=baolu.lu@linux.intel.com \
--cc=iommu@lists.linux.dev \
--cc=joro@8bytes.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox