Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

iommu/arm-smmu-v3: Mark STE MEV safe when computing the update sequence

Nested CD tables set the MEV bit to try to reduce multi-fault spamming on
the hypervisor. Since MEV is in STE word 1 this causes a breaking update
sequence that is not required and impacts real workloads.

For the purposes of STE updates the value of MEV doesn't matter, if it is
set/cleared early or late it just results in a change to the fault reports
that must be supported by the kernel anyhow. The spec says:

Note: Software must expect, and be able to deal with, coalesced fault
records even when MEV == 0.

So mark STE MEV safe when computing the update sequence, to avoid creating
a breaking update.

Fixes: da0c56520e88 ("iommu/arm-smmu-v3: Set MEV bit in nested STE for DoS mitigations")
Cc: stable@vger.kernel.org
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: Shuai Xue <xueshuai@linux.alibaba.com>
Reviewed-by: Mostafa Saleh <smostafa@google.com>
Reviewed-by: Pranjal Shrivastava <praan@google.com>
Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
Signed-off-by: Will Deacon <will@kernel.org>

authored by

Jason Gunthorpe and committed by
Will Deacon
f3c1d372 2781f2a9

+10
+10
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
··· 1097 1097 void arm_smmu_get_ste_update_safe(const __le64 *cur, const __le64 *target, 1098 1098 __le64 *safe_bits) 1099 1099 { 1100 + /* 1101 + * MEV does not meaningfully impact the operation of the HW, it only 1102 + * changes how many fault events are generated, thus we can relax it 1103 + * when computing the ordering. The spec notes the device can act like 1104 + * MEV=1 anyhow: 1105 + * 1106 + * Note: Software must expect, and be able to deal with, coalesced 1107 + * fault records even when MEV == 0. 1108 + */ 1109 + safe_bits[1] |= cpu_to_le64(STRTAB_STE_1_MEV); 1100 1110 } 1101 1111 EXPORT_SYMBOL_IF_KUNIT(arm_smmu_get_ste_update_safe); 1102 1112