* [PATCH 6.1 0/2] ARM SMMUv3 errata fixes
@ 2023-10-05 19:35 Easwar Hariharan
2023-10-05 19:35 ` [PATCH 6.1 1/2] iommu/arm-smmu-v3: Set TTL invalidation hint better Easwar Hariharan
2023-10-05 19:35 ` [PATCH 6.1 2/2] iommu/arm-smmu-v3: Avoid constructing invalid range commands Easwar Hariharan
0 siblings, 2 replies; 3+ messages in thread
From: Easwar Hariharan @ 2023-10-05 19:35 UTC (permalink / raw)
To: stable
An errata fix, and a fix for it
Robin Murphy (2):
iommu/arm-smmu-v3: Set TTL invalidation hint better
iommu/arm-smmu-v3: Avoid constructing invalid range commands
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 18 ++++++++++++++----
1 file changed, 14 insertions(+), 4 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 6.1 1/2] iommu/arm-smmu-v3: Set TTL invalidation hint better
2023-10-05 19:35 [PATCH 6.1 0/2] ARM SMMUv3 errata fixes Easwar Hariharan
@ 2023-10-05 19:35 ` Easwar Hariharan
2023-10-05 19:35 ` [PATCH 6.1 2/2] iommu/arm-smmu-v3: Avoid constructing invalid range commands Easwar Hariharan
1 sibling, 0 replies; 3+ messages in thread
From: Easwar Hariharan @ 2023-10-05 19:35 UTC (permalink / raw)
To: stable; +Cc: Robin Murphy, Will Deacon
From: Robin Murphy <robin.murphy@arm.com>
commit 6833b8f2e19945a41e4d5efd8c6d9f4cae9a5b7d upstream
When io-pgtable unmaps a whole table, rather than waste time walking it
to find the leaf entries to invalidate exactly, it simply expects
.tlb_flush_walk with nominal last-level granularity to invalidate any
leaf entries at higher intermediate levels as well. This works fine with
page-based invalidation, but with range commands we need to be careful
with the TTL hint - unconditionally setting it based on the given level
3 granule means that an invalidation for a level 1 table would strictly
not be required to affect level 2 block entries. It's easy to comply
with the expected behaviour by simply not setting the TTL hint for
non-leaf invalidations, so let's do that.
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Link: https://lore.kernel.org/r/b409d9a17c52dc0db51faee91d92737bb7975f5b.1685637456.git.robin.murphy@arm.com
Signed-off-by: Will Deacon <will@kernel.org>
Signed-off-by: Easwar Hariharan <eahariha@linux.microsoft.com>
---
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
index db33dc87f69e..becf37c08877 100644
--- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
+++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
@@ -1889,8 +1889,13 @@ static void __arm_smmu_tlb_inv_range(struct arm_smmu_cmdq_ent *cmd,
/* Convert page size of 12,14,16 (log2) to 1,2,3 */
cmd->tlbi.tg = (tg - 10) / 2;
- /* Determine what level the granule is at */
- cmd->tlbi.ttl = 4 - ((ilog2(granule) - 3) / (tg - 3));
+ /*
+ * Determine what level the granule is at. For non-leaf, io-pgtable
+ * assumes .tlb_flush_walk can invalidate multiple levels at once,
+ * so ignore the nominal last-level granule and leave TTL=0.
+ */
+ if (cmd->tlbi.leaf)
+ cmd->tlbi.ttl = 4 - ((ilog2(granule) - 3) / (tg - 3));
num_pages = size >> tg;
}
--
2.34.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 6.1 2/2] iommu/arm-smmu-v3: Avoid constructing invalid range commands
2023-10-05 19:35 [PATCH 6.1 0/2] ARM SMMUv3 errata fixes Easwar Hariharan
2023-10-05 19:35 ` [PATCH 6.1 1/2] iommu/arm-smmu-v3: Set TTL invalidation hint better Easwar Hariharan
@ 2023-10-05 19:35 ` Easwar Hariharan
1 sibling, 0 replies; 3+ messages in thread
From: Easwar Hariharan @ 2023-10-05 19:35 UTC (permalink / raw)
To: stable; +Cc: Robin Murphy, Rui Zhu, Will Deacon
From: Robin Murphy <robin.murphy@arm.com>
commit eb6c97647be227822c7ce23655482b05e348fba5 upstream
Although io-pgtable's non-leaf invalidations are always for full tables,
I missed that SVA also uses non-leaf invalidations, while being at the
mercy of whatever range the MMU notifier throws at it. This means it
definitely wants the previous TTL fix as well, since it also doesn't
know exactly which leaf level(s) may need invalidating, but it can also
give us less-aligned ranges wherein certain corners may lead to building
an invalid command where TTL, Num and Scale are all 0. It should be fine
to handle this by over-invalidating an extra page, since falling back to
a non-range command opens up a whole can of errata-flavoured worms.
Fixes: 6833b8f2e199 ("iommu/arm-smmu-v3: Set TTL invalidation hint better")
Reported-by: Rui Zhu <zhurui3@huawei.com>
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Link: https://lore.kernel.org/r/b99cfe71af2bd93a8a2930f20967fb2a4f7748dd.1694432734.git.robin.murphy@arm.com
Signed-off-by: Will Deacon <will@kernel.org>
Signed-off-by: Easwar Hariharan <eahariha@linux.microsoft.com>
---
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
index becf37c08877..8966f7d5aab6 100644
--- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
+++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
@@ -1886,18 +1886,23 @@ static void __arm_smmu_tlb_inv_range(struct arm_smmu_cmdq_ent *cmd,
/* Get the leaf page size */
tg = __ffs(smmu_domain->domain.pgsize_bitmap);
+ num_pages = size >> tg;
+
/* Convert page size of 12,14,16 (log2) to 1,2,3 */
cmd->tlbi.tg = (tg - 10) / 2;
/*
- * Determine what level the granule is at. For non-leaf, io-pgtable
- * assumes .tlb_flush_walk can invalidate multiple levels at once,
- * so ignore the nominal last-level granule and leave TTL=0.
+ * Determine what level the granule is at. For non-leaf, both
+ * io-pgtable and SVA pass a nominal last-level granule because
+ * they don't know what level(s) actually apply, so ignore that
+ * and leave TTL=0. However for various errata reasons we still
+ * want to use a range command, so avoid the SVA corner case
+ * where both scale and num could be 0 as well.
*/
if (cmd->tlbi.leaf)
cmd->tlbi.ttl = 4 - ((ilog2(granule) - 3) / (tg - 3));
-
- num_pages = size >> tg;
+ else if ((num_pages & CMDQ_TLBI_RANGE_NUM_MAX) == 1)
+ num_pages++;
}
cmds.num = 0;
--
2.34.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2023-10-05 19:35 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-10-05 19:35 [PATCH 6.1 0/2] ARM SMMUv3 errata fixes Easwar Hariharan
2023-10-05 19:35 ` [PATCH 6.1 1/2] iommu/arm-smmu-v3: Set TTL invalidation hint better Easwar Hariharan
2023-10-05 19:35 ` [PATCH 6.1 2/2] iommu/arm-smmu-v3: Avoid constructing invalid range commands Easwar Hariharan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox