mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 02:32:09 -04:00
x86, iommu/vt-d: Add an option to disable Intel IOMMU force on
IOMMU harms performance signficantly when we run very fast networking workloads. It's 40GB networking doing XDP test. Software overhead is almost unaware, but it's the IOTLB miss (based on our analysis) which kills the performance. We observed the same performance issue even with software passthrough (identity mapping), only the hardware passthrough survives. The pps with iommu (with software passthrough) is only about ~30% of that without it. This is a limitation in hardware based on our observation, so we'd like to disable the IOMMU force on, but we do want to use TBOOT and we can sacrifice the DMA security bought by IOMMU. I must admit I know nothing about TBOOT, but TBOOT guys (cc-ed) think not eabling IOMMU is totally ok. So introduce a new boot option to disable the force on. It's kind of silly we need to run into intel_iommu_init even without force on, but we need to disable TBOOT PMR registers. For system without the boot option, nothing is changed. Signed-off-by: Shaohua Li <[email protected]> Signed-off-by: Joerg Roedel <[email protected]>
This commit is contained in:
parent
161b28aae1
commit
bfd20f1cc8
4 changed files with 31 additions and 0 deletions
|
|
@ -183,6 +183,7 @@ static int rwbf_quirk;
|
|||
* (used when kernel is launched w/ TXT)
|
||||
*/
|
||||
static int force_on = 0;
|
||||
int intel_iommu_tboot_noforce;
|
||||
|
||||
/*
|
||||
* 0: Present
|
||||
|
|
@ -607,6 +608,10 @@ static int __init intel_iommu_setup(char *str)
|
|||
"Intel-IOMMU: enable pre-production PASID support\n");
|
||||
intel_iommu_pasid28 = 1;
|
||||
iommu_identity_mapping |= IDENTMAP_GFX;
|
||||
} else if (!strncmp(str, "tboot_noforce", 13)) {
|
||||
printk(KERN_INFO
|
||||
"Intel-IOMMU: not forcing on after tboot. This could expose security risk for tboot\n");
|
||||
intel_iommu_tboot_noforce = 1;
|
||||
}
|
||||
|
||||
str += strcspn(str, ",");
|
||||
|
|
@ -4850,6 +4855,19 @@ int __init intel_iommu_init(void)
|
|||
}
|
||||
|
||||
if (no_iommu || dmar_disabled) {
|
||||
/*
|
||||
* We exit the function here to ensure IOMMU's remapping and
|
||||
* mempool aren't setup, which means that the IOMMU's PMRs
|
||||
* won't be disabled via the call to init_dmars(). So disable
|
||||
* it explicitly here. The PMRs were setup by tboot prior to
|
||||
* calling SENTER, but the kernel is expected to reset/tear
|
||||
* down the PMRs.
|
||||
*/
|
||||
if (intel_iommu_tboot_noforce) {
|
||||
for_each_iommu(iommu, drhd)
|
||||
iommu_disable_protect_mem_regions(iommu);
|
||||
}
|
||||
|
||||
/*
|
||||
* Make sure the IOMMUs are switched off, even when we
|
||||
* boot into a kexec kernel and the previous kernel left
|
||||
|
|
|
|||
Loading…
Reference in a new issue