mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 10:33:41 +02:00
iommu/arm-smmu-v3: Add a missing dma_wmb() for hitless STE update
When writing a new (previously invalid) valid IOPTE to a page table, then
installing the page table into an STE hitlesslessly (e.g. in S2TTB field),
there is a window before an STE invalidation, where the page-table may be
accessed by SMMU but the new IOPTE is still siting in the CPU cache.
This could occur when we allocate an iommu_domain and immediately install
it hitlessly, while there would be no dma_wmb() for the page table memory
prior to the earliest point of HW reading the STE.
Fix it by adding a dma_wmb() prior to updating the STE.
Fixes: 56e1a4cc25 ("iommu/arm-smmu-v3: Add unit tests for arm_smmu_write_entry")
Cc: stable@vger.kernel.org
Reported-by: Will Deacon <will@kernel.org>
Closes: https://lore.kernel.org/linux-iommu/aXdlnLLFUBwjT0V5@willie-the-truck/
Suggested-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
parent
f338e77383
commit
6fabce53f6
|
|
@ -1236,6 +1236,13 @@ void arm_smmu_write_entry(struct arm_smmu_entry_writer *writer, __le64 *entry,
|
|||
__le64 unused_update[NUM_ENTRY_QWORDS];
|
||||
u8 used_qword_diff;
|
||||
|
||||
/*
|
||||
* Many of the entry structures have pointers to other structures that
|
||||
* need to have their updates be visible before any writes of the entry
|
||||
* happen.
|
||||
*/
|
||||
dma_wmb();
|
||||
|
||||
used_qword_diff =
|
||||
arm_smmu_entry_qword_diff(writer, entry, target, unused_update);
|
||||
if (hweight8(used_qword_diff) == 1) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user