iommu/io-pgtable-arm: Use dma_wmb() instead of wmb() when publishing table
authorWill Deacon <will.deacon@arm.com>
Fri, 23 Jun 2017 11:02:38 +0000 (12:02 +0100)
committerWill Deacon <will.deacon@arm.com>
Fri, 23 Jun 2017 16:58:02 +0000 (17:58 +0100)
commit77f3445866c39d8866b31d8d9fa47c7c20938e05
treed0cfcf5e936c1e3d584dfbd641003f6a04f95260
parentc1004803b40596c1aabbbc78a6b1b33e4dfd96c6
iommu/io-pgtable-arm: Use dma_wmb() instead of wmb() when publishing table

When writing a new table entry, we must ensure that the contents of the
table is made visible to the SMMU page table walker before the updated
table entry itself.

This is currently achieved using wmb(), which expands to an expensive and
unnecessary DSB instruction. Ideally, we'd just use cmpxchg64_release when
writing the table entry, but this doesn't have memory ordering semantics
on !SMP systems.

Instead, use dma_wmb(), which emits DMB OSHST. Strictly speaking, this
does more than we require (since it targets the outer-shareable domain),
but it's likely to be significantly faster than the DSB approach.

Reported-by: Linu Cherian <linu.cherian@cavium.com>
Suggested-by: Robin Murphy <robin.murphy@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
drivers/iommu/io-pgtable-arm-v7s.c
drivers/iommu/io-pgtable-arm.c