From: Yi Liu <yi.l.liu@intel.com>
To: joro@8bytes.org, jgg@nvidia.com, kevin.tian@intel.com,
baolu.lu@linux.intel.com
Cc: alex.williamson@redhat.com, robin.murphy@arm.com,
eric.auger@redhat.com, nicolinc@nvidia.com, kvm@vger.kernel.org,
chao.p.peng@linux.intel.com, yi.l.liu@intel.com,
iommu@lists.linux.dev
Subject: [PATCH 3/6] iommu/vt-d: Make helpers support modifying present pasid entry
Date: Fri, 28 Jun 2024 01:55:35 -0700 [thread overview]
Message-ID: <20240628085538.47049-4-yi.l.liu@intel.com> (raw)
In-Reply-To: <20240628085538.47049-1-yi.l.liu@intel.com>
To handle domain replacement, set_dev_pasid op needs to modify a present
pasid entry. One way is sharing the most logics of remove_dev_pasid() in
the beginning of set_dev_pasid() to remove the old config. But this means
the set_dev_pasid path needs to rollback to the old config if it fails to
set up the new pasid entry. This needs to invoke the set_dev_pasid op of
the old domain. It breaks the iommu layering a bit. Another way is
implementing the set_dev_pasid() without rollback to old hardware config.
This can be achieved by implementing it in the order of preparing the
dev_pasid info for the new domain, modify the pasid entry, then undo the
dev_pasid info of the old domain, and if failed, undo the dev_pasid info
of the new domain. This would keep the old domain unchanged.
Following the second way, needs to make the pasid entry set up helpers
support modifying present pasid entry.
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
---
drivers/iommu/intel/pasid.c | 37 ++++++++++++-------------------------
1 file changed, 12 insertions(+), 25 deletions(-)
diff --git a/drivers/iommu/intel/pasid.c b/drivers/iommu/intel/pasid.c
index b18eebb479de..5d3a12b081a2 100644
--- a/drivers/iommu/intel/pasid.c
+++ b/drivers/iommu/intel/pasid.c
@@ -314,6 +314,9 @@ int intel_pasid_setup_first_level(struct intel_iommu *iommu,
return -EINVAL;
}
+ /* Clear the old configuration if it already exists */
+ intel_pasid_tear_down_entry(iommu, dev, pasid, false, true);
+
spin_lock(&iommu->lock);
pte = intel_pasid_get_entry(dev, pasid);
if (!pte) {
@@ -321,13 +324,6 @@ int intel_pasid_setup_first_level(struct intel_iommu *iommu,
return -ENODEV;
}
- if (pasid_pte_is_present(pte)) {
- spin_unlock(&iommu->lock);
- return -EBUSY;
- }
-
- pasid_clear_entry(pte);
-
/* Setup the first level page table pointer: */
pasid_set_flptr(pte, (u64)__pa(pgd));
@@ -378,6 +374,9 @@ int intel_pasid_setup_second_level(struct intel_iommu *iommu,
pgd_val = virt_to_phys(pgd);
did = domain_id_iommu(domain, iommu);
+ /* Clear the old configuration if it already exists */
+ intel_pasid_tear_down_entry(iommu, dev, pasid, false, true);
+
spin_lock(&iommu->lock);
pte = intel_pasid_get_entry(dev, pasid);
if (!pte) {
@@ -385,12 +384,6 @@ int intel_pasid_setup_second_level(struct intel_iommu *iommu,
return -ENODEV;
}
- if (pasid_pte_is_present(pte)) {
- spin_unlock(&iommu->lock);
- return -EBUSY;
- }
-
- pasid_clear_entry(pte);
pasid_set_domain_id(pte, did);
pasid_set_slptr(pte, pgd_val);
pasid_set_address_width(pte, domain->agaw);
@@ -488,6 +481,9 @@ int intel_pasid_setup_pass_through(struct intel_iommu *iommu,
u16 did = FLPT_DEFAULT_DID;
struct pasid_entry *pte;
+ /* Clear the old configuration if it already exists */
+ intel_pasid_tear_down_entry(iommu, dev, pasid, false, true);
+
spin_lock(&iommu->lock);
pte = intel_pasid_get_entry(dev, pasid);
if (!pte) {
@@ -495,12 +491,6 @@ int intel_pasid_setup_pass_through(struct intel_iommu *iommu,
return -ENODEV;
}
- if (pasid_pte_is_present(pte)) {
- spin_unlock(&iommu->lock);
- return -EBUSY;
- }
-
- pasid_clear_entry(pte);
pasid_set_domain_id(pte, did);
pasid_set_address_width(pte, iommu->agaw);
pasid_set_translation_type(pte, PASID_ENTRY_PGTT_PT);
@@ -606,18 +596,15 @@ int intel_pasid_setup_nested(struct intel_iommu *iommu, struct device *dev,
return -EINVAL;
}
+ /* Clear the old configuration if it already exists */
+ intel_pasid_tear_down_entry(iommu, dev, pasid, false, true);
+
spin_lock(&iommu->lock);
pte = intel_pasid_get_entry(dev, pasid);
if (!pte) {
spin_unlock(&iommu->lock);
return -ENODEV;
}
- if (pasid_pte_is_present(pte)) {
- spin_unlock(&iommu->lock);
- return -EBUSY;
- }
-
- pasid_clear_entry(pte);
if (s1_cfg->addr_width == ADDR_WIDTH_5LEVEL)
pasid_set_flpm(pte, 1);
--
2.34.1
next prev parent reply other threads:[~2024-06-28 8:55 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-28 8:55 [PATCH 0/6] Make set_dev_pasid op supportting domain replacement Yi Liu
2024-06-28 8:55 ` [PATCH 1/6] iommu: Pass old domain to set_dev_pasid op Yi Liu
2024-06-28 8:55 ` [PATCH 2/6] iommu/vt-d: Move intel_drain_pasid_prq() into intel_pasid_tear_down_entry() Yi Liu
2024-06-28 9:42 ` Baolu Lu
2024-06-28 10:51 ` Yi Liu
2024-07-10 8:25 ` Tian, Kevin
2024-06-28 8:55 ` Yi Liu [this message]
2024-06-28 9:52 ` [PATCH 3/6] iommu/vt-d: Make helpers support modifying present pasid entry Baolu Lu
2024-06-28 10:56 ` Yi Liu
2024-07-15 7:53 ` Tian, Kevin
2024-07-15 8:05 ` Yi Liu
2024-06-28 8:55 ` [PATCH 4/6] iommu/vt-d: Make intel_iommu_set_dev_pasid() to handle domain replacement Yi Liu
2024-07-15 7:58 ` Tian, Kevin
2024-06-28 8:55 ` [PATCH 5/6] iommu/vt-d: Add set_dev_pasid callback for nested domain Yi Liu
2024-06-28 8:55 ` [PATCH 6/6] iommu: Make set_dev_pasid op support domain replacement Yi Liu
2024-07-15 8:02 ` Tian, Kevin
2024-07-15 8:37 ` Yi Liu
2024-07-10 8:24 ` [PATCH 0/6] Make set_dev_pasid op supportting " Tian, Kevin
2024-07-11 18:41 ` Jason Gunthorpe
2024-07-15 8:16 ` Tian, Kevin
2024-07-15 12:19 ` Jason Gunthorpe
2024-07-15 8:23 ` Yi Liu
2024-07-15 12:19 ` Jason Gunthorpe
2024-07-16 2:07 ` Yi Liu
2024-07-11 18:37 ` Jason Gunthorpe
2024-07-15 8:11 ` Yi Liu
2024-07-15 12:16 ` Jason Gunthorpe
2024-08-15 17:49 ` Vasant Hegde
2024-08-16 1:19 ` Yi Liu
2024-08-16 2:49 ` Baolu Lu
2024-08-16 5:17 ` Vasant Hegde
2024-08-16 2:52 ` Baolu Lu
2024-08-16 6:08 ` Yi Liu
2024-08-16 5:19 ` Vasant Hegde
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=20240628085538.47049-4-yi.l.liu@intel.com \
--to=yi.l.liu@intel.com \
--cc=alex.williamson@redhat.com \
--cc=baolu.lu@linux.intel.com \
--cc=chao.p.peng@linux.intel.com \
--cc=eric.auger@redhat.com \
--cc=iommu@lists.linux.dev \
--cc=jgg@nvidia.com \
--cc=joro@8bytes.org \
--cc=kevin.tian@intel.com \
--cc=kvm@vger.kernel.org \
--cc=nicolinc@nvidia.com \
--cc=robin.murphy@arm.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