diff mbox series

[kernel] powerpc/iommu: Fix iommu_table_in_use for a small default DMA window case

Message ID 20220714081119.3714605-1-aik@ozlabs.ru (mailing list archive)
State Accepted
Headers show
Series [kernel] powerpc/iommu: Fix iommu_table_in_use for a small default DMA window case | expand

Checks

Context Check Description
snowpatch_ozlabs/github-powerpc_selftests success Successfully ran 10 jobs.
snowpatch_ozlabs/github-powerpc_ppctests success Successfully ran 10 jobs.
snowpatch_ozlabs/github-powerpc_sparse success Successfully ran 4 jobs.
snowpatch_ozlabs/github-powerpc_clang success Successfully ran 7 jobs.
snowpatch_ozlabs/github-powerpc_kernel_qemu success Successfully ran 23 jobs.

Commit Message

Alexey Kardashevskiy July 14, 2022, 8:11 a.m. UTC
The existing iommu_table_in_use() helper checks if the kernel is using
any of TCEs. There are some reserved TCEs:
1) the very first one if DMA window starts from 0 to avoid having a zero
but still valid DMA handle;
2) it_reserved_start..it_reserved_end to exclude MMIO32 window in case
the default window spans across that - this is the default for the first
DMA window on PowerNV.

When 1) is the case and 2) is not the helper does not skip 1) and returns
wrong status.

This only seems occurring when passing through a PCI device to a nested
guest (not something we support really well) so it has not been seen
before.

This fixes the bug by adding a special case for no MMIO32 reservation.

Fixes: 3c33066a2190 ("powerpc/kernel/iommu: Add new iommu_table_in_use() helper")
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
---
 arch/powerpc/kernel/iommu.c | 5 +++++
 1 file changed, 5 insertions(+)

Comments

Michael Ellerman July 29, 2022, 1:02 p.m. UTC | #1
On Thu, 14 Jul 2022 18:11:19 +1000, Alexey Kardashevskiy wrote:
> The existing iommu_table_in_use() helper checks if the kernel is using
> any of TCEs. There are some reserved TCEs:
> 1) the very first one if DMA window starts from 0 to avoid having a zero
> but still valid DMA handle;
> 2) it_reserved_start..it_reserved_end to exclude MMIO32 window in case
> the default window spans across that - this is the default for the first
> DMA window on PowerNV.
> 
> [...]

Applied to powerpc/next.

[1/1] powerpc/iommu: Fix iommu_table_in_use for a small default DMA window case
      https://git.kernel.org/powerpc/c/d80f6de9d601c30b53c17f00cb7cfe3169f2ddad

cheers
diff mbox series

Patch

diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c
index 7e56ddb3e0b9..caebe1431596 100644
--- a/arch/powerpc/kernel/iommu.c
+++ b/arch/powerpc/kernel/iommu.c
@@ -775,6 +775,11 @@  bool iommu_table_in_use(struct iommu_table *tbl)
 	/* ignore reserved bit0 */
 	if (tbl->it_offset == 0)
 		start = 1;
+
+	/* Simple case with no reserved MMIO32 region */
+	if (!tbl->it_reserved_start && !tbl->it_reserved_end)
+		return find_next_bit(tbl->it_map, tbl->it_size, start) != tbl->it_size;
+
 	end = tbl->it_reserved_start - tbl->it_offset;
 	if (find_next_bit(tbl->it_map, end, start) != end)
 		return true;