Message ID | 20190520135947.14960-2-thunder.leizhen@huawei.com |
---|---|
State | New |
Headers | show |
Series | iommu: enhance IOMMU dma mode build options | expand |
On 20/05/2019 14:59, 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> Apart from more minor comments, FWIW: Reviewed-by: John Garry <john.garry@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); As commented privately, I could never see this set for ia64, and it seems to exist just to keep the linker happy. Anyway, I am not sure if ever suitable to be set. > > 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 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 I'd say /s/allows IOMMU/allows an IOMMU/, /s/chose/chosen/ > + override the default DMA mode of each ARCHs, removing the need to ARCHs should be singular > + 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 > + translation. 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 slower 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_group { > struct kobject kobj; > -- > 1.8.3 > > > > . >
Hi Zhen Lei, On Mon, May 20, 2019 at 09:59:47PM +0800, Zhen Lei wrote: > 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(-) This needs Acks from the arch maintainers of ia64, powerpc, s390 and x86, at least. It is easier for them if you split it up into the Kconfig change and separete patches per arch and per iommu driver. Then collect the Acks on the individual patches. Thanks, Joerg
On 2019/5/27 22:21, Joerg Roedel wrote: > Hi Zhen Lei, > > On Mon, May 20, 2019 at 09:59:47PM +0800, Zhen Lei wrote: >> 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(-) > > This needs Acks from the arch maintainers of ia64, powerpc, s390 and > x86, at least. > > It is easier for them if you split it up into the Kconfig change and > separete patches per arch and per iommu driver. Then collect the Acks on > the individual patches. OK, thanks. I will do it tomorrow. > > Thanks, > > Joerg > > . > -- Thanks! BestRegards
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 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 + 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 + translation. 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 slower 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_group { struct kobject kobj;
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