From: Baolu Lu <baolu.lu@linux.intel.com>
To: Jason Gunthorpe <jgg@nvidia.com>
Cc: Kevin Tian <kevin.tian@intel.com>,
Ashok Raj <ashok.raj@intel.com>,
Robin Murphy <robin.murphy@arm.com>,
linux-kernel@vger.kernel.org,
Christoph Hellwig <hch@infradead.org>,
iommu@lists.linux-foundation.org,
Jacob jun Pan <jacob.jun.pan@intel.com>,
Will Deacon <will@kernel.org>
Subject: Re: [PATCH 01/12] iommu/vt-d: Use iommu_get_domain_for_dev() in debugfs
Date: Sun, 29 May 2022 13:14:46 +0800 [thread overview]
Message-ID: <eda4d688-257b-d12a-56c0-0f9d3a10ef8c@linux.intel.com> (raw)
In-Reply-To: <20220527145910.GQ1343366@nvidia.com>
On 2022/5/27 22:59, Jason Gunthorpe wrote:
> On Fri, May 27, 2022 at 02:30:08PM +0800, Lu Baolu wrote:
>> Retrieve the attached domain for a device through the generic interface
>> exposed by the iommu core. This also makes device_domain_lock static.
>>
>> Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
>> drivers/iommu/intel/iommu.h | 1 -
>> drivers/iommu/intel/debugfs.c | 20 ++++++++------------
>> drivers/iommu/intel/iommu.c | 2 +-
>> 3 files changed, 9 insertions(+), 14 deletions(-)
>>
>> diff --git a/drivers/iommu/intel/iommu.h b/drivers/iommu/intel/iommu.h
>> index a22adfbdf870..8a6d64d726c0 100644
>> +++ b/drivers/iommu/intel/iommu.h
>> @@ -480,7 +480,6 @@ enum {
>> #define VTD_FLAG_SVM_CAPABLE (1 << 2)
>>
>> extern int intel_iommu_sm;
>> -extern spinlock_t device_domain_lock;
>>
>> #define sm_supported(iommu) (intel_iommu_sm && ecap_smts((iommu)->ecap))
>> #define pasid_supported(iommu) (sm_supported(iommu) && \
>> diff --git a/drivers/iommu/intel/debugfs.c b/drivers/iommu/intel/debugfs.c
>> index d927ef10641b..eea8727aa7bc 100644
>> +++ b/drivers/iommu/intel/debugfs.c
>> @@ -344,19 +344,21 @@ static void pgtable_walk_level(struct seq_file *m, struct dma_pte *pde,
>>
>> static int show_device_domain_translation(struct device *dev, void *data)
>> {
>> - struct device_domain_info *info = dev_iommu_priv_get(dev);
>> - struct dmar_domain *domain = info->domain;
>> + struct dmar_domain *dmar_domain;
>> + struct iommu_domain *domain;
>> struct seq_file *m = data;
>> u64 path[6] = { 0 };
>>
>> + domain = iommu_get_domain_for_dev(dev);
>> if (!domain)
>> return 0;
>
> The iommu_get_domain_for_dev() API should be called something like
> 'iommu_get_dma_api_domain()' and clearly documented that it is safe to
> call only so long as a DMA API using driver is attached to the device,
> which is most of the current callers.
Yes, agreed.
> This use in random sysfs inside the iommu driver is not OK because it
> doesn't have any locking protecting domain from concurrent free.
This is not sysfs, but debugfs. The description of this patch is
confusing. I should make it specific and straight-forward.
How about below one?
From 1e87b5df40c6ce9414cdd03988c3b52bfb17af5f Mon Sep 17 00:00:00 2001
From: Lu Baolu <baolu.lu@linux.intel.com>
Date: Sun, 29 May 2022 10:18:56 +0800
Subject: [PATCH 1/1] iommu/vt-d: debugfs: Remove device_domain_lock usage
The domain_translation_struct debugfs node is used to dump static
mappings of PCI devices. It potentially races with setting new
domains to devices and the iommu_map/unmap() interfaces. The existing
code tries to use the global spinlock device_domain_lock to avoid the
races, but this is problematical as this lock is only used to protect
the device tracking lists of the domains.
Instead of using an immature lock to cover up the problem, it's better
to explicitly restrict the use of this debugfs node. This also makes
device_domain_lock static.
Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
---
drivers/iommu/intel/debugfs.c | 17 ++++++++---------
drivers/iommu/intel/iommu.c | 2 +-
drivers/iommu/intel/iommu.h | 1 -
3 files changed, 9 insertions(+), 11 deletions(-)
diff --git a/drivers/iommu/intel/debugfs.c b/drivers/iommu/intel/debugfs.c
index d927ef10641b..9642e3e9d6b0 100644
--- a/drivers/iommu/intel/debugfs.c
+++ b/drivers/iommu/intel/debugfs.c
@@ -362,17 +362,16 @@ static int show_device_domain_translation(struct
device *dev, void *data)
return 0;
}
+/*
+ * Dump the static mappings of PCI devices. This is only for DEBUGFS code,
+ * don't use it for other purposes. It potentially races with setting new
+ * domains to devices and iommu_map/unmap(). Use the trace events under
+ * /sys/kernel/debug/tracing/events/iommu/ for dynamic debugging.
+ */
static int domain_translation_struct_show(struct seq_file *m, void
*unused)
{
- unsigned long flags;
- int ret;
-
- spin_lock_irqsave(&device_domain_lock, flags);
- ret = bus_for_each_dev(&pci_bus_type, NULL, m,
- show_device_domain_translation);
- spin_unlock_irqrestore(&device_domain_lock, flags);
-
- return ret;
+ return bus_for_each_dev(&pci_bus_type, NULL, m,
+ show_device_domain_translation);
}
DEFINE_SHOW_ATTRIBUTE(domain_translation_struct);
diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
index 1af4b6562266..cacae8bdaa65 100644
--- a/drivers/iommu/intel/iommu.c
+++ b/drivers/iommu/intel/iommu.c
@@ -314,7 +314,7 @@ static int iommu_skip_te_disable;
#define IDENTMAP_GFX 2
#define IDENTMAP_AZALIA 4
-DEFINE_SPINLOCK(device_domain_lock);
+static DEFINE_SPINLOCK(device_domain_lock);
static LIST_HEAD(device_domain_list);
/*
diff --git a/drivers/iommu/intel/iommu.h b/drivers/iommu/intel/iommu.h
index a22adfbdf870..8a6d64d726c0 100644
--- a/drivers/iommu/intel/iommu.h
+++ b/drivers/iommu/intel/iommu.h
@@ -480,7 +480,6 @@ enum {
#define VTD_FLAG_SVM_CAPABLE (1 << 2)
extern int intel_iommu_sm;
-extern spinlock_t device_domain_lock;
#define sm_supported(iommu) (intel_iommu_sm && ecap_smts((iommu)->ecap))
#define pasid_supported(iommu) (sm_supported(iommu) && \
--
2.25.1
Best regards,
baolu
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
next prev parent reply other threads:[~2022-05-29 5:14 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-27 6:30 [PATCH 00/12] iommu/vt-d: Optimize the use of locks Lu Baolu
2022-05-27 6:30 ` [PATCH 01/12] iommu/vt-d: Use iommu_get_domain_for_dev() in debugfs Lu Baolu
2022-05-27 14:59 ` Jason Gunthorpe via iommu
2022-05-29 5:14 ` Baolu Lu [this message]
2022-05-30 12:14 ` Jason Gunthorpe via iommu
2022-05-31 3:02 ` Baolu Lu
2022-05-31 13:10 ` Jason Gunthorpe via iommu
2022-05-31 14:11 ` Baolu Lu
2022-05-31 14:53 ` Jason Gunthorpe via iommu
2022-05-31 15:01 ` Robin Murphy
2022-05-31 15:13 ` Jason Gunthorpe via iommu
2022-05-31 16:01 ` Robin Murphy
2022-05-31 16:21 ` Jason Gunthorpe via iommu
2022-05-31 18:07 ` Robin Murphy
2022-05-31 18:51 ` Jason Gunthorpe via iommu
2022-05-31 21:22 ` Robin Murphy
2022-05-31 23:10 ` Jason Gunthorpe via iommu
2022-06-01 8:53 ` Tian, Kevin
2022-06-01 12:18 ` Joao Martins
2022-06-01 12:33 ` Jason Gunthorpe via iommu
2022-06-01 13:52 ` Joao Martins
2022-06-01 14:22 ` Jason Gunthorpe via iommu
2022-06-01 6:39 ` Baolu Lu
2022-05-31 13:52 ` Robin Murphy
2022-05-31 15:59 ` Jason Gunthorpe via iommu
2022-05-31 16:42 ` Robin Murphy
2022-06-01 5:47 ` Baolu Lu
2022-06-01 5:33 ` Baolu Lu
2022-05-27 6:30 ` [PATCH 02/12] iommu/vt-d: Remove for_each_device_domain() Lu Baolu
2022-05-27 15:00 ` Jason Gunthorpe via iommu
2022-06-01 8:53 ` Tian, Kevin
2022-05-27 6:30 ` [PATCH 03/12] iommu/vt-d: Remove clearing translation data in disable_dmar_iommu() Lu Baolu
2022-05-27 15:01 ` Jason Gunthorpe via iommu
2022-05-29 5:22 ` Baolu Lu
2022-05-27 6:30 ` [PATCH 04/12] iommu/vt-d: Use pci_get_domain_bus_and_slot() in pgtable_walk() Lu Baolu
2022-05-27 15:01 ` Jason Gunthorpe via iommu
2022-06-01 8:56 ` Tian, Kevin
2022-05-27 6:30 ` [PATCH 05/12] iommu/vt-d: Unncessary spinlock for root table alloc and free Lu Baolu
2022-06-01 9:05 ` Tian, Kevin
2022-05-27 6:30 ` [PATCH 06/12] iommu/vt-d: Acquiring lock in domain ID allocation helpers Lu Baolu
2022-06-01 9:09 ` Tian, Kevin
2022-06-01 10:38 ` Baolu Lu
2022-05-27 6:30 ` [PATCH 07/12] iommu/vt-d: Acquiring lock in pasid manipulation helpers Lu Baolu
2022-06-01 9:18 ` Tian, Kevin
2022-06-01 10:48 ` Baolu Lu
2022-05-27 6:30 ` [PATCH 08/12] iommu/vt-d: Replace spin_lock_irqsave() with spin_lock() Lu Baolu
2022-05-27 6:30 ` [PATCH 09/12] iommu/vt-d: Check device list of domain in domain free path Lu Baolu
2022-05-27 15:05 ` Jason Gunthorpe via iommu
2022-06-01 9:28 ` Tian, Kevin
2022-06-01 11:02 ` Baolu Lu
2022-06-02 6:29 ` Tian, Kevin
2022-06-06 1:34 ` Baolu Lu
2022-05-27 6:30 ` [PATCH 10/12] iommu/vt-d: Fold __dmar_remove_one_dev_info() into its caller Lu Baolu
2022-05-27 6:30 ` [PATCH 11/12] iommu/vt-d: Use device_domain_lock accurately Lu Baolu
2022-05-27 6:30 ` [PATCH 12/12] iommu/vt-d: Convert device_domain_lock into per-domain mutex Lu Baolu
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=eda4d688-257b-d12a-56c0-0f9d3a10ef8c@linux.intel.com \
--to=baolu.lu@linux.intel.com \
--cc=ashok.raj@intel.com \
--cc=hch@infradead.org \
--cc=iommu@lists.linux-foundation.org \
--cc=jacob.jun.pan@intel.com \
--cc=jgg@nvidia.com \
--cc=kevin.tian@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=robin.murphy@arm.com \
--cc=will@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