All of lore.kernel.org
 help / color / mirror / Atom feed
From: Robin Murphy <robin.murphy@arm.com>
To: joro@8bytes.org, will@kernel.org
Cc: iommu@lists.linux-foundation.org,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, suravee.suthikulpanit@amd.com,
	baolu.lu@linux.intel.com, john.garry@huawei.com,
	dianders@chromium.org, rajatja@google.com,
	chenxiang66@hisilicon.com
Subject: [PATCH v4 14/24] iommu: Indicate queued flushes via gather data
Date: Wed, 11 Aug 2021 13:21:28 +0100	[thread overview]
Message-ID: <bf5f8e2ad84e48c712ccbf80fa8c610594c7595f.1628682049.git.robin.murphy@arm.com> (raw)
In-Reply-To: <cover.1628682048.git.robin.murphy@arm.com>

Since iommu_iotlb_gather exists to help drivers optimise flushing for a
given unmap request, it is also the logical place to indicate whether
the unmap is strict or not, and thus help them further optimise for
whether to expect a sync or a flush_all subsequently. As part of that,
it also seems fair to make the flush queue code take responsibility for
enforcing the really subtle ordering requirement it brings, so that we
don't need to worry about forgetting that if new drivers want to add
flush queue support, and can consolidate the existing versions.

While we're adding to the kerneldoc, also fill in some info for
@freelist which was overlooked previously.

Signed-off-by: Robin Murphy <robin.murphy@arm.com>

---

v3: New
---
 drivers/iommu/dma-iommu.c | 1 +
 drivers/iommu/iova.c      | 7 +++++++
 include/linux/iommu.h     | 8 +++++++-
 3 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c
index e28396cea6eb..d63b30a7dc82 100644
--- a/drivers/iommu/dma-iommu.c
+++ b/drivers/iommu/dma-iommu.c
@@ -474,6 +474,7 @@ static void __iommu_dma_unmap(struct device *dev, dma_addr_t dma_addr,
 	dma_addr -= iova_off;
 	size = iova_align(iovad, size + iova_off);
 	iommu_iotlb_gather_init(&iotlb_gather);
+	iotlb_gather.queued = cookie->fq_domain;
 
 	unmapped = iommu_unmap_fast(domain, dma_addr, size, &iotlb_gather);
 	WARN_ON(unmapped != size);
diff --git a/drivers/iommu/iova.c b/drivers/iommu/iova.c
index b6cf5f16123b..2ad73fb2e94e 100644
--- a/drivers/iommu/iova.c
+++ b/drivers/iommu/iova.c
@@ -637,6 +637,13 @@ void queue_iova(struct iova_domain *iovad,
 	unsigned long flags;
 	unsigned idx;
 
+	/*
+	 * Order against the IOMMU driver's pagetable update from unmapping
+	 * @pte, to guarantee that iova_domain_flush() observes that if called
+	 * from a different CPU before we release the lock below.
+	 */
+	smp_wmb();
+
 	spin_lock_irqsave(&fq->lock, flags);
 
 	/*
diff --git a/include/linux/iommu.h b/include/linux/iommu.h
index 141779d76035..f7679f6684b1 100644
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@ -161,16 +161,22 @@ enum iommu_dev_features {
  * @start: IOVA representing the start of the range to be flushed
  * @end: IOVA representing the end of the range to be flushed (inclusive)
  * @pgsize: The interval at which to perform the flush
+ * @freelist: Removed pages to free after sync
+ * @queued: Indicates that the flush will be queued
  *
  * This structure is intended to be updated by multiple calls to the
  * ->unmap() function in struct iommu_ops before eventually being passed
- * into ->iotlb_sync().
+ * into ->iotlb_sync(). Drivers can add pages to @freelist to be freed after
+ * ->iotlb_sync() or ->iotlb_flush_all() have cleared all cached references to
+ * them. @queued is set to indicate when ->iotlb_flush_all() will be called
+ * later instead of ->iotlb_sync(), so drivers may optimise accordingly.
  */
 struct iommu_iotlb_gather {
 	unsigned long		start;
 	unsigned long		end;
 	size_t			pgsize;
 	struct page		*freelist;
+	bool			queued;
 };
 
 /**
-- 
2.25.1


WARNING: multiple messages have this Message-ID (diff)
From: Robin Murphy <robin.murphy@arm.com>
To: joro@8bytes.org, will@kernel.org
Cc: linux-kernel@vger.kernel.org, dianders@chromium.org,
	iommu@lists.linux-foundation.org, rajatja@google.com,
	linux-arm-kernel@lists.infradead.org
Subject: [PATCH v4 14/24] iommu: Indicate queued flushes via gather data
Date: Wed, 11 Aug 2021 13:21:28 +0100	[thread overview]
Message-ID: <bf5f8e2ad84e48c712ccbf80fa8c610594c7595f.1628682049.git.robin.murphy@arm.com> (raw)
In-Reply-To: <cover.1628682048.git.robin.murphy@arm.com>

Since iommu_iotlb_gather exists to help drivers optimise flushing for a
given unmap request, it is also the logical place to indicate whether
the unmap is strict or not, and thus help them further optimise for
whether to expect a sync or a flush_all subsequently. As part of that,
it also seems fair to make the flush queue code take responsibility for
enforcing the really subtle ordering requirement it brings, so that we
don't need to worry about forgetting that if new drivers want to add
flush queue support, and can consolidate the existing versions.

While we're adding to the kerneldoc, also fill in some info for
@freelist which was overlooked previously.

Signed-off-by: Robin Murphy <robin.murphy@arm.com>

---

v3: New
---
 drivers/iommu/dma-iommu.c | 1 +
 drivers/iommu/iova.c      | 7 +++++++
 include/linux/iommu.h     | 8 +++++++-
 3 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c
index e28396cea6eb..d63b30a7dc82 100644
--- a/drivers/iommu/dma-iommu.c
+++ b/drivers/iommu/dma-iommu.c
@@ -474,6 +474,7 @@ static void __iommu_dma_unmap(struct device *dev, dma_addr_t dma_addr,
 	dma_addr -= iova_off;
 	size = iova_align(iovad, size + iova_off);
 	iommu_iotlb_gather_init(&iotlb_gather);
+	iotlb_gather.queued = cookie->fq_domain;
 
 	unmapped = iommu_unmap_fast(domain, dma_addr, size, &iotlb_gather);
 	WARN_ON(unmapped != size);
diff --git a/drivers/iommu/iova.c b/drivers/iommu/iova.c
index b6cf5f16123b..2ad73fb2e94e 100644
--- a/drivers/iommu/iova.c
+++ b/drivers/iommu/iova.c
@@ -637,6 +637,13 @@ void queue_iova(struct iova_domain *iovad,
 	unsigned long flags;
 	unsigned idx;
 
+	/*
+	 * Order against the IOMMU driver's pagetable update from unmapping
+	 * @pte, to guarantee that iova_domain_flush() observes that if called
+	 * from a different CPU before we release the lock below.
+	 */
+	smp_wmb();
+
 	spin_lock_irqsave(&fq->lock, flags);
 
 	/*
diff --git a/include/linux/iommu.h b/include/linux/iommu.h
index 141779d76035..f7679f6684b1 100644
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@ -161,16 +161,22 @@ enum iommu_dev_features {
  * @start: IOVA representing the start of the range to be flushed
  * @end: IOVA representing the end of the range to be flushed (inclusive)
  * @pgsize: The interval at which to perform the flush
+ * @freelist: Removed pages to free after sync
+ * @queued: Indicates that the flush will be queued
  *
  * This structure is intended to be updated by multiple calls to the
  * ->unmap() function in struct iommu_ops before eventually being passed
- * into ->iotlb_sync().
+ * into ->iotlb_sync(). Drivers can add pages to @freelist to be freed after
+ * ->iotlb_sync() or ->iotlb_flush_all() have cleared all cached references to
+ * them. @queued is set to indicate when ->iotlb_flush_all() will be called
+ * later instead of ->iotlb_sync(), so drivers may optimise accordingly.
  */
 struct iommu_iotlb_gather {
 	unsigned long		start;
 	unsigned long		end;
 	size_t			pgsize;
 	struct page		*freelist;
+	bool			queued;
 };
 
 /**
-- 
2.25.1

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

WARNING: multiple messages have this Message-ID (diff)
From: Robin Murphy <robin.murphy@arm.com>
To: joro@8bytes.org, will@kernel.org
Cc: iommu@lists.linux-foundation.org,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, suravee.suthikulpanit@amd.com,
	baolu.lu@linux.intel.com, john.garry@huawei.com,
	dianders@chromium.org, rajatja@google.com,
	chenxiang66@hisilicon.com
Subject: [PATCH v4 14/24] iommu: Indicate queued flushes via gather data
Date: Wed, 11 Aug 2021 13:21:28 +0100	[thread overview]
Message-ID: <bf5f8e2ad84e48c712ccbf80fa8c610594c7595f.1628682049.git.robin.murphy@arm.com> (raw)
In-Reply-To: <cover.1628682048.git.robin.murphy@arm.com>

Since iommu_iotlb_gather exists to help drivers optimise flushing for a
given unmap request, it is also the logical place to indicate whether
the unmap is strict or not, and thus help them further optimise for
whether to expect a sync or a flush_all subsequently. As part of that,
it also seems fair to make the flush queue code take responsibility for
enforcing the really subtle ordering requirement it brings, so that we
don't need to worry about forgetting that if new drivers want to add
flush queue support, and can consolidate the existing versions.

While we're adding to the kerneldoc, also fill in some info for
@freelist which was overlooked previously.

Signed-off-by: Robin Murphy <robin.murphy@arm.com>

---

v3: New
---
 drivers/iommu/dma-iommu.c | 1 +
 drivers/iommu/iova.c      | 7 +++++++
 include/linux/iommu.h     | 8 +++++++-
 3 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c
index e28396cea6eb..d63b30a7dc82 100644
--- a/drivers/iommu/dma-iommu.c
+++ b/drivers/iommu/dma-iommu.c
@@ -474,6 +474,7 @@ static void __iommu_dma_unmap(struct device *dev, dma_addr_t dma_addr,
 	dma_addr -= iova_off;
 	size = iova_align(iovad, size + iova_off);
 	iommu_iotlb_gather_init(&iotlb_gather);
+	iotlb_gather.queued = cookie->fq_domain;
 
 	unmapped = iommu_unmap_fast(domain, dma_addr, size, &iotlb_gather);
 	WARN_ON(unmapped != size);
diff --git a/drivers/iommu/iova.c b/drivers/iommu/iova.c
index b6cf5f16123b..2ad73fb2e94e 100644
--- a/drivers/iommu/iova.c
+++ b/drivers/iommu/iova.c
@@ -637,6 +637,13 @@ void queue_iova(struct iova_domain *iovad,
 	unsigned long flags;
 	unsigned idx;
 
+	/*
+	 * Order against the IOMMU driver's pagetable update from unmapping
+	 * @pte, to guarantee that iova_domain_flush() observes that if called
+	 * from a different CPU before we release the lock below.
+	 */
+	smp_wmb();
+
 	spin_lock_irqsave(&fq->lock, flags);
 
 	/*
diff --git a/include/linux/iommu.h b/include/linux/iommu.h
index 141779d76035..f7679f6684b1 100644
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@ -161,16 +161,22 @@ enum iommu_dev_features {
  * @start: IOVA representing the start of the range to be flushed
  * @end: IOVA representing the end of the range to be flushed (inclusive)
  * @pgsize: The interval at which to perform the flush
+ * @freelist: Removed pages to free after sync
+ * @queued: Indicates that the flush will be queued
  *
  * This structure is intended to be updated by multiple calls to the
  * ->unmap() function in struct iommu_ops before eventually being passed
- * into ->iotlb_sync().
+ * into ->iotlb_sync(). Drivers can add pages to @freelist to be freed after
+ * ->iotlb_sync() or ->iotlb_flush_all() have cleared all cached references to
+ * them. @queued is set to indicate when ->iotlb_flush_all() will be called
+ * later instead of ->iotlb_sync(), so drivers may optimise accordingly.
  */
 struct iommu_iotlb_gather {
 	unsigned long		start;
 	unsigned long		end;
 	size_t			pgsize;
 	struct page		*freelist;
+	bool			queued;
 };
 
 /**
-- 
2.25.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  parent reply	other threads:[~2021-08-11 12:22 UTC|newest]

Thread overview: 90+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-11 12:21 [PATCH v4 00/24] iommu: Refactor DMA domain strictness Robin Murphy
2021-08-11 12:21 ` Robin Murphy
2021-08-11 12:21 ` Robin Murphy
2021-08-11 12:21 ` [PATCH v4 01/24] iommu: Pull IOVA cookie management into the core Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21 ` [PATCH v4 02/24] iommu/amd: Drop IOVA cookie management Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21 ` [PATCH v4 03/24] iommu/arm-smmu: " Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21 ` [PATCH v4 04/24] iommu/vt-d: " Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21 ` [PATCH v4 05/24] iommu/exynos: " Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21 ` [PATCH v4 06/24] iommu/ipmmu-vmsa: " Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21 ` [PATCH v4 07/24] iommu/mtk: " Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21 ` [PATCH v4 08/24] iommu/rockchip: " Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21 ` [PATCH v4 09/24] iommu/sprd: " Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21 ` [PATCH v4 10/24] iommu/sun50i: " Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21 ` [PATCH v4 11/24] iommu/virtio: " Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21 ` [PATCH v4 12/24] iommu/dma: Unexport " Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21 ` [PATCH v4 13/24] iommu/dma: Remove redundant "!dev" checks Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21 ` Robin Murphy [this message]
2021-08-11 12:21   ` [PATCH v4 14/24] iommu: Indicate queued flushes via gather data Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21 ` [PATCH v4 15/24] iommu/io-pgtable: Remove non-strict quirk Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-24 13:25   ` Geert Uytterhoeven
2021-08-24 13:25     ` Geert Uytterhoeven
2021-08-24 13:25     ` Geert Uytterhoeven
2021-08-24 13:46     ` Robin Murphy
2021-08-24 13:46       ` Robin Murphy
2021-08-24 13:46       ` Robin Murphy
2021-08-11 12:21 ` [PATCH v4 16/24] iommu: Introduce explicit type for non-strict DMA domains Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21 ` [PATCH v4 17/24] iommu/amd: Prepare for multiple DMA domain types Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21 ` [PATCH v4 18/24] iommu/arm-smmu: " Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21 ` [PATCH v4 19/24] iommu/vt-d: " Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21 ` [PATCH v4 20/24] iommu: Express DMA strictness via the domain type Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21 ` [PATCH v4 21/24] iommu: Expose DMA domain strictness via sysfs Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21 ` [PATCH v4 22/24] iommu: Only log strictness for DMA domains Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21 ` [PATCH v4 23/24] iommu: Merge strictness and domain type configs Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21 ` [PATCH v4 24/24] iommu: Allow enabling non-strict mode dynamically Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-11 12:21   ` Robin Murphy
2021-08-18 11:29 ` [PATCH v4 00/24] iommu: Refactor DMA domain strictness Joerg Roedel
2021-08-18 11:29   ` Joerg Roedel
2021-08-18 11:29   ` Joerg Roedel
2021-08-18 15:13   ` Robin Murphy
2021-08-18 15:13     ` Robin Murphy
2021-08-18 15:13     ` Robin Murphy
2021-08-21  8:55     ` Sven Peter
2021-08-21  8:55       ` Sven Peter
2021-08-21  8:55       ` Sven Peter via iommu

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=bf5f8e2ad84e48c712ccbf80fa8c610594c7595f.1628682049.git.robin.murphy@arm.com \
    --to=robin.murphy@arm.com \
    --cc=baolu.lu@linux.intel.com \
    --cc=chenxiang66@hisilicon.com \
    --cc=dianders@chromium.org \
    --cc=iommu@lists.linux-foundation.org \
    --cc=john.garry@huawei.com \
    --cc=joro@8bytes.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rajatja@google.com \
    --cc=suravee.suthikulpanit@amd.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.