diff mbox series

[v6,1/1] iommu: enhance IOMMU dma mode build options

Message ID 20190418135701.24668-2-thunder.leizhen@huawei.com
State Superseded
Headers show
Series iommu: enhance IOMMU dma mode build options | expand

Commit Message

Zhen Lei April 18, 2019, 1:57 p.m. UTC
First, add build option IOMMU_DEFAULT_{LAZY|STRICT}, so that we have the
opportunity to set {lazy|strict} mode as default at build time. Then put
the three config options in an choice, make people can only choose one of
the three at a time.

The default IOMMU dma modes on each ARCHs have no change.

Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>

---
 arch/ia64/kernel/pci-dma.c                |  2 +-
 arch/powerpc/platforms/powernv/pci-ioda.c |  3 ++-
 arch/s390/pci/pci_dma.c                   |  2 +-
 arch/x86/kernel/pci-dma.c                 |  7 ++---
 drivers/iommu/Kconfig                     | 44 ++++++++++++++++++++++++++-----
 drivers/iommu/amd_iommu_init.c            |  3 ++-
 drivers/iommu/intel-iommu.c               |  2 +-
 drivers/iommu/iommu.c                     |  3 ++-
 8 files changed, 48 insertions(+), 18 deletions(-)

--
1.8.3

Comments

John Garry May 8, 2019, 9:42 a.m. UTC | #1
On 18/04/2019 14:57, Zhen Lei wrote:
> First, add build option IOMMU_DEFAULT_{LAZY|STRICT}, so that we have the

> opportunity to set {lazy|strict} mode as default at build time. Then put

> the three config options in an choice, make people can only choose one of

> the three at a time.

>

> The default IOMMU dma modes on each ARCHs have no change.

>

> Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>

> ---

>  arch/ia64/kernel/pci-dma.c                |  2 +-

>  arch/powerpc/platforms/powernv/pci-ioda.c |  3 ++-

>  arch/s390/pci/pci_dma.c                   |  2 +-

>  arch/x86/kernel/pci-dma.c                 |  7 ++---

>  drivers/iommu/Kconfig                     | 44 ++++++++++++++++++++++++++-----

>  drivers/iommu/amd_iommu_init.c            |  3 ++-

>  drivers/iommu/intel-iommu.c               |  2 +-

>  drivers/iommu/iommu.c                     |  3 ++-

>  8 files changed, 48 insertions(+), 18 deletions(-)

>

> diff --git a/arch/ia64/kernel/pci-dma.c b/arch/ia64/kernel/pci-dma.c

> index fe988c49f01ce6a..655511dbf3c3b34 100644

> --- a/arch/ia64/kernel/pci-dma.c

> +++ b/arch/ia64/kernel/pci-dma.c

> @@ -22,7 +22,7 @@

>  int force_iommu __read_mostly;

>  #endif

>

> -int iommu_pass_through;

> +int iommu_pass_through = IS_ENABLED(CONFIG_IOMMU_DEFAULT_PASSTHROUGH);

>

>  static int __init pci_iommu_init(void)

>  {

> diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c

> index 3ead4c237ed0ec9..383e082a9bb985c 100644

> --- a/arch/powerpc/platforms/powernv/pci-ioda.c

> +++ b/arch/powerpc/platforms/powernv/pci-ioda.c

> @@ -85,7 +85,8 @@ void pe_level_printk(const struct pnv_ioda_pe *pe, const char *level,

>  	va_end(args);

>  }

>

> -static bool pnv_iommu_bypass_disabled __read_mostly;

> +static bool pnv_iommu_bypass_disabled __read_mostly =

> +			!IS_ENABLED(CONFIG_IOMMU_DEFAULT_PASSTHROUGH);

>  static bool pci_reset_phbs __read_mostly;

>

>  static int __init iommu_setup(char *str)

> diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c

> index 9e52d1527f71495..784ad1e0acecfb1 100644

> --- a/arch/s390/pci/pci_dma.c

> +++ b/arch/s390/pci/pci_dma.c

> @@ -17,7 +17,7 @@

>

>  static struct kmem_cache *dma_region_table_cache;

>  static struct kmem_cache *dma_page_table_cache;

> -static int s390_iommu_strict;

> +static int s390_iommu_strict = IS_ENABLED(CONFIG_IOMMU_DEFAULT_STRICT);

>

>  static int zpci_refresh_global(struct zpci_dev *zdev)

>  {

> diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c

> index d460998ae828514..fb2bab42a0a3173 100644

> --- a/arch/x86/kernel/pci-dma.c

> +++ b/arch/x86/kernel/pci-dma.c

> @@ -43,11 +43,8 @@

>   * It is also possible to disable by default in kernel config, and enable with

>   * iommu=nopt at boot time.

>   */

> -#ifdef CONFIG_IOMMU_DEFAULT_PASSTHROUGH

> -int iommu_pass_through __read_mostly = 1;

> -#else

> -int iommu_pass_through __read_mostly;

> -#endif

> +int iommu_pass_through __read_mostly =

> +			IS_ENABLED(CONFIG_IOMMU_DEFAULT_PASSTHROUGH);

>

>  extern struct iommu_table_entry __iommu_table[], __iommu_table_end[];

>

> diff --git a/drivers/iommu/Kconfig b/drivers/iommu/Kconfig

> index 6f07f3b21816c64..8a1f1793cde76b4 100644

> --- a/drivers/iommu/Kconfig

> +++ b/drivers/iommu/Kconfig

> @@ -74,17 +74,47 @@ config IOMMU_DEBUGFS

>  	  debug/iommu directory, and then populate a subdirectory with

>  	  entries as required.

>

> -config IOMMU_DEFAULT_PASSTHROUGH

> -	bool "IOMMU passthrough by default"

> +choice

> +	prompt "IOMMU dma mode"


/s/dma/DMA/

And how about add "default", as in "Default IOMMU DMA mode" or "IOMMU 
default DMA mode"?

>  	depends on IOMMU_API

> -        help

> -	  Enable passthrough by default, removing the need to pass in

> -	  iommu.passthrough=on or iommu=pt through command line. If this

> -	  is enabled, you can still disable with iommu.passthrough=off

> -	  or iommu=nopt depending on the architecture.

> +	default IOMMU_DEFAULT_PASSTHROUGH if (PPC_POWERNV && PCI)

> +	default IOMMU_DEFAULT_LAZY if (AMD_IOMMU || INTEL_IOMMU || S390_IOMMU)

> +	default IOMMU_DEFAULT_STRICT

> +	help

> +	  This option allows IOMMU dma mode to be chose at build time, to


again, capitalize acronyms, i.e. /s/dma/DMA/ (more of these above and below)

> +	  override the default dma mode of each ARCHs, removing the need to

> +	  pass in kernel parameters through command line. You can still use

> +	  ARCHs specific boot options to override this option again.

> +

> +config IOMMU_DEFAULT_PASSTHROUGH


I think that it may need to be indented, along with the other choices

> +	bool "passthrough"

> +	help

> +	  In this mode, the dma access through IOMMU without any addresses

> +	  transformation. That means, the wrong or illegal dma access can not


transformation, or translation?

> +	  be caught, no error information will be reported.

>

>  	  If unsure, say N here.

>

> +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.

> +

> +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.

> +

> +	  This mode is safer than the two above, but it maybe slow in some high


slow, or slower? And passthough is not safe, so anything is implicitly 
safer.

> +	  performace scenarios.

> +

> +endchoice

> +

>  config OF_IOMMU

>         def_bool y

>         depends on OF && IOMMU_API

> diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c

> index ff40ba758cf365e..16c02b08adb4cb2 100644

> --- a/drivers/iommu/amd_iommu_init.c

> +++ b/drivers/iommu/amd_iommu_init.c

> @@ -166,7 +166,8 @@ struct ivmd_header {

>  					   to handle */

>  LIST_HEAD(amd_iommu_unity_map);		/* a list of required unity mappings

>  					   we find in ACPI */

> -bool amd_iommu_unmap_flush;		/* if true, flush on every unmap */

> +bool amd_iommu_unmap_flush = IS_ENABLED(CONFIG_IOMMU_DEFAULT_STRICT);

> +					/* if true, flush on every unmap */

>

>  LIST_HEAD(amd_iommu_list);		/* list of all AMD IOMMUs in the

>  					   system */

> diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c

> index 28cb713d728ceef..0c3cc716210f35a 100644

> --- a/drivers/iommu/intel-iommu.c

> +++ b/drivers/iommu/intel-iommu.c

> @@ -362,7 +362,7 @@ static int domain_detach_iommu(struct dmar_domain *domain,

>

>  static int dmar_map_gfx = 1;

>  static int dmar_forcedac;

> -static int intel_iommu_strict;

> +static int intel_iommu_strict = IS_ENABLED(CONFIG_IOMMU_DEFAULT_STRICT);

>  static int intel_iommu_superpage = 1;

>  static int intel_iommu_sm;

>  static int iommu_identity_mapping;

> diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c

> index 109de67d5d727c2..0ec5952ac60e2a3 100644

> --- a/drivers/iommu/iommu.c

> +++ b/drivers/iommu/iommu.c

> @@ -43,7 +43,8 @@

>  #else

>  static unsigned int iommu_def_domain_type = IOMMU_DOMAIN_DMA;

>  #endif

> -static bool iommu_dma_strict __read_mostly = true;

> +static bool iommu_dma_strict __read_mostly =

> +			IS_ENABLED(CONFIG_IOMMU_DEFAULT_STRICT);

>

>  struct iommu_callback_data {

>  	const struct iommu_ops *ops;

> --

> 1.8.3

>

>

>

> .

>
Zhen Lei May 13, 2019, 2:04 p.m. UTC | #2
On 2019/5/8 17:42, John Garry wrote:
> On 18/04/2019 14:57, Zhen Lei wrote:

>> First, add build option IOMMU_DEFAULT_{LAZY|STRICT}, so that we have the

>> opportunity to set {lazy|strict} mode as default at build time. Then put

>> the three config options in an choice, make people can only choose one of

>> the three at a time.

>>

>> The default IOMMU dma modes on each ARCHs have no change.

>>

>> Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>

>> ---

>>  arch/ia64/kernel/pci-dma.c                |  2 +-

>>  arch/powerpc/platforms/powernv/pci-ioda.c |  3 ++-

>>  arch/s390/pci/pci_dma.c                   |  2 +-

>>  arch/x86/kernel/pci-dma.c                 |  7 ++---

>>  drivers/iommu/Kconfig                     | 44 ++++++++++++++++++++++++++-----

>>  drivers/iommu/amd_iommu_init.c            |  3 ++-

>>  drivers/iommu/intel-iommu.c               |  2 +-

>>  drivers/iommu/iommu.c                     |  3 ++-

>>  8 files changed, 48 insertions(+), 18 deletions(-)

>>

>> diff --git a/arch/ia64/kernel/pci-dma.c b/arch/ia64/kernel/pci-dma.c

>> index fe988c49f01ce6a..655511dbf3c3b34 100644

>> --- a/arch/ia64/kernel/pci-dma.c

>> +++ b/arch/ia64/kernel/pci-dma.c

>> @@ -22,7 +22,7 @@

>>  int force_iommu __read_mostly;

>>  #endif

>>

>> -int iommu_pass_through;

>> +int iommu_pass_through = IS_ENABLED(CONFIG_IOMMU_DEFAULT_PASSTHROUGH);

>>

>>  static int __init pci_iommu_init(void)

>>  {

>> diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c

>> index 3ead4c237ed0ec9..383e082a9bb985c 100644

>> --- a/arch/powerpc/platforms/powernv/pci-ioda.c

>> +++ b/arch/powerpc/platforms/powernv/pci-ioda.c

>> @@ -85,7 +85,8 @@ void pe_level_printk(const struct pnv_ioda_pe *pe, const char *level,

>>      va_end(args);

>>  }

>>

>> -static bool pnv_iommu_bypass_disabled __read_mostly;

>> +static bool pnv_iommu_bypass_disabled __read_mostly =

>> +            !IS_ENABLED(CONFIG_IOMMU_DEFAULT_PASSTHROUGH);

>>  static bool pci_reset_phbs __read_mostly;

>>

>>  static int __init iommu_setup(char *str)

>> diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c

>> index 9e52d1527f71495..784ad1e0acecfb1 100644

>> --- a/arch/s390/pci/pci_dma.c

>> +++ b/arch/s390/pci/pci_dma.c

>> @@ -17,7 +17,7 @@

>>

>>  static struct kmem_cache *dma_region_table_cache;

>>  static struct kmem_cache *dma_page_table_cache;

>> -static int s390_iommu_strict;

>> +static int s390_iommu_strict = IS_ENABLED(CONFIG_IOMMU_DEFAULT_STRICT);

>>

>>  static int zpci_refresh_global(struct zpci_dev *zdev)

>>  {

>> diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c

>> index d460998ae828514..fb2bab42a0a3173 100644

>> --- a/arch/x86/kernel/pci-dma.c

>> +++ b/arch/x86/kernel/pci-dma.c

>> @@ -43,11 +43,8 @@

>>   * It is also possible to disable by default in kernel config, and enable with

>>   * iommu=nopt at boot time.

>>   */

>> -#ifdef CONFIG_IOMMU_DEFAULT_PASSTHROUGH

>> -int iommu_pass_through __read_mostly = 1;

>> -#else

>> -int iommu_pass_through __read_mostly;

>> -#endif

>> +int iommu_pass_through __read_mostly =

>> +            IS_ENABLED(CONFIG_IOMMU_DEFAULT_PASSTHROUGH);

>>

>>  extern struct iommu_table_entry __iommu_table[], __iommu_table_end[];

>>

>> diff --git a/drivers/iommu/Kconfig b/drivers/iommu/Kconfig

>> index 6f07f3b21816c64..8a1f1793cde76b4 100644

>> --- a/drivers/iommu/Kconfig

>> +++ b/drivers/iommu/Kconfig

>> @@ -74,17 +74,47 @@ config IOMMU_DEBUGFS

>>        debug/iommu directory, and then populate a subdirectory with

>>        entries as required.

>>

>> -config IOMMU_DEFAULT_PASSTHROUGH

>> -    bool "IOMMU passthrough by default"

>> +choice

>> +    prompt "IOMMU dma mode"

> 

> /s/dma/DMA/

OK

> 

> And how about add "default", as in "Default IOMMU DMA mode" or "IOMMU default DMA mode"?

Yes. I prefer "IOMMU default DMA mode".

> 

>>      depends on IOMMU_API

>> -        help

>> -      Enable passthrough by default, removing the need to pass in

>> -      iommu.passthrough=on or iommu=pt through command line. If this

>> -      is enabled, you can still disable with iommu.passthrough=off

>> -      or iommu=nopt depending on the architecture.

>> +    default IOMMU_DEFAULT_PASSTHROUGH if (PPC_POWERNV && PCI)

>> +    default IOMMU_DEFAULT_LAZY if (AMD_IOMMU || INTEL_IOMMU || S390_IOMMU)

>> +    default IOMMU_DEFAULT_STRICT

>> +    help

>> +      This option allows IOMMU dma mode to be chose at build time, to

> 

> again, capitalize acronyms, i.e. /s/dma/DMA/ (more of these above and below)

OK, I will check it all. Thanks.

> 

>> +      override the default dma mode of each ARCHs, removing the need to

>> +      pass in kernel parameters through command line. You can still use

>> +      ARCHs specific boot options to override this option again.

>> +

>> +config IOMMU_DEFAULT_PASSTHROUGH

> 

> I think that it may need to be indented, along with the other choices

There is no problem. I referred to mm/Kconfig.

> 

>> +    bool "passthrough"

>> +    help

>> +      In this mode, the dma access through IOMMU without any addresses

>> +      transformation. That means, the wrong or illegal dma access can not

> 

> transformation, or translation?

I copied from somewhere. OK, "translation" will be more clear.

> 

>> +      be caught, no error information will be reported.

>>

>>        If unsure, say N here.

>>

>> +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.

>> +

>> +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.

>> +

>> +      This mode is safer than the two above, but it maybe slow in some high

> 

> slow, or slower? And passthough is not safe, so anything is implicitly safer.

OK. I will change it to "slower".

> 

>> +      performace scenarios.

>> +

>> +endchoice

>> +

>>  config OF_IOMMU

>>         def_bool y

>>         depends on OF && IOMMU_API

>> diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c

>> index ff40ba758cf365e..16c02b08adb4cb2 100644

>> --- a/drivers/iommu/amd_iommu_init.c

>> +++ b/drivers/iommu/amd_iommu_init.c

>> @@ -166,7 +166,8 @@ struct ivmd_header {

>>                         to handle */

>>  LIST_HEAD(amd_iommu_unity_map);        /* a list of required unity mappings

>>                         we find in ACPI */

>> -bool amd_iommu_unmap_flush;        /* if true, flush on every unmap */

>> +bool amd_iommu_unmap_flush = IS_ENABLED(CONFIG_IOMMU_DEFAULT_STRICT);

>> +                    /* if true, flush on every unmap */

>>

>>  LIST_HEAD(amd_iommu_list);        /* list of all AMD IOMMUs in the

>>                         system */

>> diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c

>> index 28cb713d728ceef..0c3cc716210f35a 100644

>> --- a/drivers/iommu/intel-iommu.c

>> +++ b/drivers/iommu/intel-iommu.c

>> @@ -362,7 +362,7 @@ static int domain_detach_iommu(struct dmar_domain *domain,

>>

>>  static int dmar_map_gfx = 1;

>>  static int dmar_forcedac;

>> -static int intel_iommu_strict;

>> +static int intel_iommu_strict = IS_ENABLED(CONFIG_IOMMU_DEFAULT_STRICT);

>>  static int intel_iommu_superpage = 1;

>>  static int intel_iommu_sm;

>>  static int iommu_identity_mapping;

>> diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c

>> index 109de67d5d727c2..0ec5952ac60e2a3 100644

>> --- a/drivers/iommu/iommu.c

>> +++ b/drivers/iommu/iommu.c

>> @@ -43,7 +43,8 @@

>>  #else

>>  static unsigned int iommu_def_domain_type = IOMMU_DOMAIN_DMA;

>>  #endif

>> -static bool iommu_dma_strict __read_mostly = true;

>> +static bool iommu_dma_strict __read_mostly =

>> +            IS_ENABLED(CONFIG_IOMMU_DEFAULT_STRICT);

>>

>>  struct iommu_callback_data {

>>      const struct iommu_ops *ops;

>> -- 

>> 1.8.3

>>

>>

>>

>> .

>>

> 

> 

> 

> .

> 


-- 
Thanks!
BestRegards
diff mbox series

Patch

diff --git a/arch/ia64/kernel/pci-dma.c b/arch/ia64/kernel/pci-dma.c
index fe988c49f01ce6a..655511dbf3c3b34 100644
--- a/arch/ia64/kernel/pci-dma.c
+++ b/arch/ia64/kernel/pci-dma.c
@@ -22,7 +22,7 @@ 
 int force_iommu __read_mostly;
 #endif

-int iommu_pass_through;
+int iommu_pass_through = IS_ENABLED(CONFIG_IOMMU_DEFAULT_PASSTHROUGH);

 static int __init pci_iommu_init(void)
 {
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
index 3ead4c237ed0ec9..383e082a9bb985c 100644
--- a/arch/powerpc/platforms/powernv/pci-ioda.c
+++ b/arch/powerpc/platforms/powernv/pci-ioda.c
@@ -85,7 +85,8 @@  void pe_level_printk(const struct pnv_ioda_pe *pe, const char *level,
 	va_end(args);
 }

-static bool pnv_iommu_bypass_disabled __read_mostly;
+static bool pnv_iommu_bypass_disabled __read_mostly =
+			!IS_ENABLED(CONFIG_IOMMU_DEFAULT_PASSTHROUGH);
 static bool pci_reset_phbs __read_mostly;

 static int __init iommu_setup(char *str)
diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c
index 9e52d1527f71495..784ad1e0acecfb1 100644
--- a/arch/s390/pci/pci_dma.c
+++ b/arch/s390/pci/pci_dma.c
@@ -17,7 +17,7 @@ 

 static struct kmem_cache *dma_region_table_cache;
 static struct kmem_cache *dma_page_table_cache;
-static int s390_iommu_strict;
+static int s390_iommu_strict = IS_ENABLED(CONFIG_IOMMU_DEFAULT_STRICT);

 static int zpci_refresh_global(struct zpci_dev *zdev)
 {
diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c
index d460998ae828514..fb2bab42a0a3173 100644
--- a/arch/x86/kernel/pci-dma.c
+++ b/arch/x86/kernel/pci-dma.c
@@ -43,11 +43,8 @@ 
  * It is also possible to disable by default in kernel config, and enable with
  * iommu=nopt at boot time.
  */
-#ifdef CONFIG_IOMMU_DEFAULT_PASSTHROUGH
-int iommu_pass_through __read_mostly = 1;
-#else
-int iommu_pass_through __read_mostly;
-#endif
+int iommu_pass_through __read_mostly =
+			IS_ENABLED(CONFIG_IOMMU_DEFAULT_PASSTHROUGH);

 extern struct iommu_table_entry __iommu_table[], __iommu_table_end[];

diff --git a/drivers/iommu/Kconfig b/drivers/iommu/Kconfig
index 6f07f3b21816c64..8a1f1793cde76b4 100644
--- a/drivers/iommu/Kconfig
+++ b/drivers/iommu/Kconfig
@@ -74,17 +74,47 @@  config IOMMU_DEBUGFS
 	  debug/iommu directory, and then populate a subdirectory with
 	  entries as required.

-config IOMMU_DEFAULT_PASSTHROUGH
-	bool "IOMMU passthrough by default"
+choice
+	prompt "IOMMU dma mode"
 	depends on IOMMU_API
-        help
-	  Enable passthrough by default, removing the need to pass in
-	  iommu.passthrough=on or iommu=pt through command line. If this
-	  is enabled, you can still disable with iommu.passthrough=off
-	  or iommu=nopt depending on the architecture.
+	default IOMMU_DEFAULT_PASSTHROUGH if (PPC_POWERNV && PCI)
+	default IOMMU_DEFAULT_LAZY if (AMD_IOMMU || INTEL_IOMMU || S390_IOMMU)
+	default IOMMU_DEFAULT_STRICT
+	help
+	  This option allows IOMMU dma mode to be chose at build time, to
+	  override the default dma mode of each ARCHs, removing the need to
+	  pass in kernel parameters through command line. You can still use
+	  ARCHs specific boot options to override this option again.
+
+config IOMMU_DEFAULT_PASSTHROUGH
+	bool "passthrough"
+	help
+	  In this mode, the dma access through IOMMU without any addresses
+	  transformation. That means, the wrong or illegal dma access can not
+	  be caught, no error information will be reported.

 	  If unsure, say N here.

+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.
+
+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.
+
+	  This mode is safer than the two above, but it maybe slow in some high
+	  performace scenarios.
+
+endchoice
+
 config OF_IOMMU
        def_bool y
        depends on OF && IOMMU_API
diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c
index ff40ba758cf365e..16c02b08adb4cb2 100644
--- a/drivers/iommu/amd_iommu_init.c
+++ b/drivers/iommu/amd_iommu_init.c
@@ -166,7 +166,8 @@  struct ivmd_header {
 					   to handle */
 LIST_HEAD(amd_iommu_unity_map);		/* a list of required unity mappings
 					   we find in ACPI */
-bool amd_iommu_unmap_flush;		/* if true, flush on every unmap */
+bool amd_iommu_unmap_flush = IS_ENABLED(CONFIG_IOMMU_DEFAULT_STRICT);
+					/* if true, flush on every unmap */

 LIST_HEAD(amd_iommu_list);		/* list of all AMD IOMMUs in the
 					   system */
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index 28cb713d728ceef..0c3cc716210f35a 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -362,7 +362,7 @@  static int domain_detach_iommu(struct dmar_domain *domain,

 static int dmar_map_gfx = 1;
 static int dmar_forcedac;
-static int intel_iommu_strict;
+static int intel_iommu_strict = IS_ENABLED(CONFIG_IOMMU_DEFAULT_STRICT);
 static int intel_iommu_superpage = 1;
 static int intel_iommu_sm;
 static int iommu_identity_mapping;
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index 109de67d5d727c2..0ec5952ac60e2a3 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -43,7 +43,8 @@ 
 #else
 static unsigned int iommu_def_domain_type = IOMMU_DOMAIN_DMA;
 #endif
-static bool iommu_dma_strict __read_mostly = true;
+static bool iommu_dma_strict __read_mostly =
+			IS_ENABLED(CONFIG_IOMMU_DEFAULT_STRICT);

 struct iommu_callback_data {
 	const struct iommu_ops *ops;