From: Ethan Zhao <haifeng.zhao@linux.intel.com>
To: baolu.lu@linux.intel.com, bhelgaas@google.com,
robin.murphy@arm.com, jgg@ziepe.ca
Cc: kevin.tian@intel.com, dwmw2@infradead.org, will@kernel.org,
lukas@wunner.de, yi.l.liu@intel.com, dan.carpenter@linaro.org,
iommu@lists.linux.dev, linux-kernel@vger.kernel.org,
Ethan Zhao <haifeng.zhao@linux.intel.com>
Subject: [PATCH] iommu/vt-d: avoid sending explicit ATS invalidation request to released device
Date: Wed, 28 Feb 2024 22:31:38 -0500 [thread overview]
Message-ID: <20240229033138.3379560-1-haifeng.zhao@linux.intel.com> (raw)
The introduction of per iommu device rbtree also defines the lifetime of
interoperation between iommu and devices, if the device has been released
from device rbtree, no need to send ATS invalidation request to it anymore,
thus avoid the possibility of later ITE fault to be triggered.
This is part of the followup of prior proposed patchset
https://do-db2.lkml.org/lkml/2024/2/22/350
To make sure all the devTLB entries to be invalidated in the device release
path, do implict invalidation by fapping the E bit of ATS control register.
see PCIe spec v6.2, sec 10.3.7 implicit invalidation events.
Fixes: 6f7db75e1c46 ("iommu/vt-d: Add second level page table interface")
Signed-off-by: Ethan Zhao <haifeng.zhao@linux.intel.com>
---
drivers/iommu/intel/iommu.c | 6 ++++++
drivers/iommu/intel/pasid.c | 7 +++++++
2 files changed, 13 insertions(+)
diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
index 6743fe6c7a36..b85d88ccb4b0 100644
--- a/drivers/iommu/intel/iommu.c
+++ b/drivers/iommu/intel/iommu.c
@@ -1368,6 +1368,12 @@ static void iommu_disable_pci_caps(struct device_domain_info *info)
pdev = to_pci_dev(info->dev);
if (info->ats_enabled) {
+ pci_disable_ats(pdev);
+ /*
+ * flap the E bit of ATS control register to do implicit
+ * ATS invlidation, see PCIe spec v6.2, sec 10.3.7
+ */
+ pci_enable_ats(pdev, VTD_PAGE_SHIFT);
pci_disable_ats(pdev);
info->ats_enabled = 0;
domain_update_iotlb(info->domain);
diff --git a/drivers/iommu/intel/pasid.c b/drivers/iommu/intel/pasid.c
index 108158e2b907..5f13e017a12c 100644
--- a/drivers/iommu/intel/pasid.c
+++ b/drivers/iommu/intel/pasid.c
@@ -215,6 +215,13 @@ devtlb_invalidation_with_pasid(struct intel_iommu *iommu,
return;
sid = info->bus << 8 | info->devfn;
+ /*
+ * If device has been released from rbtree, no need to send ATS
+ * Invalidation request anymore, that could cause ITE fault.
+ */
+ if (!device_rbtree_find(iommu, sid))
+ return;
+
qdep = info->ats_qdep;
pfsid = info->pfsid;
--
2.31.1
next reply other threads:[~2024-02-29 3:31 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-29 3:31 Ethan Zhao [this message]
2024-02-29 3:34 ` Ethan Zhao
2024-02-29 21:06 ` Bjorn Helgaas
2024-03-01 1:50 ` Ethan Zhao
2024-03-01 21:56 ` Bjorn Helgaas
2024-03-04 1:52 ` Ethan Zhao
2024-03-01 7:04 ` Ethan Zhao
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=20240229033138.3379560-1-haifeng.zhao@linux.intel.com \
--to=haifeng.zhao@linux.intel.com \
--cc=baolu.lu@linux.intel.com \
--cc=bhelgaas@google.com \
--cc=dan.carpenter@linaro.org \
--cc=dwmw2@infradead.org \
--cc=iommu@lists.linux.dev \
--cc=jgg@ziepe.ca \
--cc=kevin.tian@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=lukas@wunner.de \
--cc=robin.murphy@arm.com \
--cc=will@kernel.org \
--cc=yi.l.liu@intel.com \
/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
all inboxes | Powered by JetHome®