Commit 712d8f20 authored by Zhen Lei's avatar Zhen Lei Committed by Joerg Roedel

iommu: Enhance IOMMU default DMA mode build options

First, add build options IOMMU_DEFAULT_{LAZY|STRICT}, so that we have the
opportunity to set {lazy|strict} mode as default at build time. Then put
the two config options in an choice, as they are mutually exclusive.

[jpg: Make choice between strict and lazy only (and not passthrough)]
Signed-off-by: default avatarZhen Lei <thunder.leizhen@huawei.com>
Signed-off-by: default avatarJohn Garry <john.garry@huawei.com>
Reviewed-by: default avatarRobin Murphy <robin.murphy@arm.com>
Reviewed-by: default avatarLu Baolu <baolu.lu@linux.intel.com>
Link: https://lore.kernel.org/r/1626088340-5838-4-git-send-email-john.garry@huawei.comSigned-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent d8577d2e
...@@ -2042,9 +2042,10 @@ ...@@ -2042,9 +2042,10 @@
throughput at the cost of reduced device isolation. throughput at the cost of reduced device isolation.
Will fall back to strict mode if not supported by Will fall back to strict mode if not supported by
the relevant IOMMU driver. the relevant IOMMU driver.
1 - Strict mode (default). 1 - Strict mode.
DMA unmap operations invalidate IOMMU hardware TLBs DMA unmap operations invalidate IOMMU hardware TLBs
synchronously. synchronously.
unset - Use value of CONFIG_IOMMU_DEFAULT_{LAZY,STRICT}.
Note: on x86, the default behaviour depends on the Note: on x86, the default behaviour depends on the
equivalent driver-specific parameters, but a strict equivalent driver-specific parameters, but a strict
mode explicitly specified by either method takes mode explicitly specified by either method takes
......
...@@ -90,6 +90,46 @@ config IOMMU_DEFAULT_PASSTHROUGH ...@@ -90,6 +90,46 @@ config IOMMU_DEFAULT_PASSTHROUGH
If unsure, say N here. If unsure, say N here.
choice
prompt "IOMMU default DMA IOTLB invalidation mode"
depends on IOMMU_DMA
default IOMMU_DEFAULT_STRICT
help
This option allows an IOMMU DMA IOTLB invalidation mode to be
chosen at build time, to override the default mode of each ARCH,
removing the need to pass in kernel parameters through command line.
It is still possible to provide common boot params to override this
config.
If unsure, keep the default.
config IOMMU_DEFAULT_STRICT
bool "strict"
help
For every IOMMU DMA unmap operation, the flush operation of IOTLB and
the free operation of IOVA are guaranteed to be done in the unmap
function.
config IOMMU_DEFAULT_LAZY
bool "lazy"
help
Support lazy mode, where for every IOMMU DMA unmap operation, the
flush operation of IOTLB and the free operation of IOVA are deferred.
They are only guaranteed to be done before the related IOVA will be
reused.
The isolation provided in this mode is not as secure as STRICT mode,
such that a vulnerable time window may be created between the DMA
unmap and the mappings cached in the IOMMU IOTLB or device TLB
finally being invalidated, where the device could still access the
memory which has already been unmapped by the device driver.
However this mode may provide better performance in high throughput
scenarios, and is still considerably more secure than passthrough
mode or no IOMMU.
endchoice
config OF_IOMMU config OF_IOMMU
def_bool y def_bool y
depends on OF && IOMMU_API depends on OF && IOMMU_API
......
...@@ -30,7 +30,7 @@ static struct kset *iommu_group_kset; ...@@ -30,7 +30,7 @@ static struct kset *iommu_group_kset;
static DEFINE_IDA(iommu_group_ida); static DEFINE_IDA(iommu_group_ida);
static unsigned int iommu_def_domain_type __read_mostly; static unsigned int iommu_def_domain_type __read_mostly;
static bool iommu_dma_strict __read_mostly = true; static bool iommu_dma_strict __read_mostly = IS_ENABLED(CONFIG_IOMMU_DEFAULT_STRICT);
static u32 iommu_cmd_line __read_mostly; static u32 iommu_cmd_line __read_mostly;
struct iommu_group { struct iommu_group {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment