public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Lu Baolu <baolu.lu@linux.intel.com>
To: Joerg Roedel <joro@8bytes.org>
Cc: Yi Liu <yi.l.liu@intel.com>, Arnd Bergmann <arnd@arndb.de>,
	Kevin Tian <kevin.tian@intel.com>,
	Joao Martins <joao.m.martins@oracle.com>,
	iommu@lists.linux.dev, linux-kernel@vger.kernel.org
Subject: [PATCH 05/10] iommu/vt-d: Add missing device iotlb flush for parent domain
Date: Mon, 19 Feb 2024 19:15:56 +0800	[thread overview]
Message-ID: <20240219111601.96405-6-baolu.lu@linux.intel.com> (raw)
In-Reply-To: <20240219111601.96405-1-baolu.lu@linux.intel.com>

From: Yi Liu <yi.l.liu@intel.com>

ATS-capable devices cache the result of nested translation. This result
relies on the mappings in s2 domain (a.k.a. parent). When there are
modifications in the s2 domain, the related nested translation caches on
the device should be flushed. This includes the devices that are attached
to the s1 domain. However, the existing code ignores this fact to only
loops its own devices.

As there is no easy way to identify the exact set of nested translations
affected by the change of s2 domain. So, this just flushes the entire
device iotlb on the device.

As above, driver loops the s2 domain's s1_domains list and loops the
devices list of each s1_domain to flush the entire device iotlb on the
devices.

Fixes: b41e38e22539 ("iommu/vt-d: Add nested domain allocation")
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Link: https://lore.kernel.org/r/20240208082307.15759-6-yi.l.liu@intel.com
Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
---
 drivers/iommu/intel/iommu.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
index 711c3e3fe095..2eee83b5441b 100644
--- a/drivers/iommu/intel/iommu.c
+++ b/drivers/iommu/intel/iommu.c
@@ -1461,12 +1461,30 @@ static void parent_domain_flush(struct dmar_domain *domain,
 
 	spin_lock(&domain->s1_lock);
 	list_for_each_entry(s1_domain, &domain->s1_domains, s2_link) {
+		struct device_domain_info *device_info;
 		struct iommu_domain_info *info;
+		unsigned long flags;
 		unsigned long i;
 
 		xa_for_each(&s1_domain->iommu_array, i, info)
 			__iommu_flush_iotlb_psi(info->iommu, info->did,
 						pfn, pages, ih);
+
+		if (!s1_domain->has_iotlb_device)
+			continue;
+
+		spin_lock_irqsave(&s1_domain->lock, flags);
+		list_for_each_entry(device_info, &s1_domain->devices, link)
+			/*
+			 * Address translation cache in device side caches the
+			 * result of nested translation. There is no easy way
+			 * to identify the exact set of nested translations
+			 * affected by a change in S2. So just flush the entire
+			 * device cache.
+			 */
+			__iommu_flush_dev_iotlb(device_info, 0,
+						MAX_AGAW_PFN_WIDTH);
+		spin_unlock_irqrestore(&s1_domain->lock, flags);
 	}
 	spin_unlock(&domain->s1_lock);
 }
-- 
2.34.1


  parent reply	other threads:[~2024-02-19 11:22 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-19 11:15 [PATCH 00/10] [PULL REQUEST] iommu/vt-d: Fixes for v6.8-rc5 Lu Baolu
2024-02-19 11:15 ` [PATCH 01/10] iommu/vt-d: Track nested domains in parent Lu Baolu
2024-02-19 11:15 ` [PATCH 02/10] iommu/vt-d: Add __iommu_flush_iotlb_psi() Lu Baolu
2024-02-19 11:15 ` [PATCH 03/10] iommu/vt-d: Add missing iotlb flush for parent domain Lu Baolu
2024-02-19 11:15 ` [PATCH 04/10] iommu/vt-d: Update iotlb in nested domain attach Lu Baolu
2024-02-19 11:15 ` Lu Baolu [this message]
2024-02-19 11:15 ` [PATCH 06/10] iommu/vt-d: Remove domain parameter for intel_pasid_setup_dirty_tracking() Lu Baolu
2024-02-19 11:15 ` [PATCH 07/10] iommu/vt-d: Wrap the dirty tracking loop to be a helper Lu Baolu
2024-02-19 11:15 ` [PATCH 08/10] iommu/vt-d: Add missing dirty tracking set for parent domain Lu Baolu
2024-02-19 11:16 ` [PATCH 09/10] iommu/vt-d: Set SSADE when attaching to a parent with dirty tracking Lu Baolu
2024-02-19 11:16 ` [PATCH 10/10] iommu/vt-d: Fix constant-out-of-range warning Lu Baolu
2024-02-21  9:29 ` [PATCH 00/10] [PULL REQUEST] iommu/vt-d: Fixes for v6.8-rc5 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=20240219111601.96405-6-baolu.lu@linux.intel.com \
    --to=baolu.lu@linux.intel.com \
    --cc=arnd@arndb.de \
    --cc=iommu@lists.linux.dev \
    --cc=joao.m.martins@oracle.com \
    --cc=joro@8bytes.org \
    --cc=kevin.tian@intel.com \
    --cc=linux-kernel@vger.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