* [PATCH] swiotlb: introduce Kconfig option for compile-time default pool size @ 2026-06-16 21:36 bibek.patro 2026-06-17 8:47 ` Mostafa Saleh 2026-06-18 16:04 ` Michael Kelley 0 siblings, 2 replies; 7+ messages in thread From: bibek.patro @ 2026-06-16 21:36 UTC (permalink / raw) To: Marek Szyprowski, Robin Murphy Cc: iommu, linux-kernel, Jagadeesh Pagadala, Bibek Kumar Patro From: Jagadeesh Pagadala <jpagadal@qti.qualcomm.com> The SWIOTLB bounce buffer pool size is hardcoded at 64 MB via IO_TLB_DEFAULT_SIZE with no compile-time knob to adjust it. On memory-constrained embedded or mobile platforms equipped with a hardware IOMMU (e.g., ARM SMMU) covering most DMA-capable devices, reserving 64 MB at boot is unnecessarily wasteful — the SWIOTLB is only exercised for devices that bypass the IOMMU or have restricted DMA address ranges. Introduce CONFIG_SWIOTLB_DEFAULT_SIZE_MB, an integer Kconfig option (range 1–64 MB, default 64) that allows platforms to set a smaller compile-time default. IO_TLB_DEFAULT_SIZE is updated to derive from this value when CONFIG_SWIOTLB is enabled, preserving the existing 64 MB default when the option is not configured. The runtime "swiotlb=<nslabs>" kernel parameter override remains fully supported and takes precedence over the compile-time default. Signed-off-by: Jagadeesh Pagadala <jpagadal@qti.qualcomm.com> Signed-off-by: Bibek Kumar Patro <bibek.patro@oss.qualcomm.com> --- The SWIOTLB bounce buffer pool size is hardcoded at 64 MB. On memory-constrained platforms with a hardware IOMMU (e.g., ARM SMMU), this reservation is wasteful as SWIOTLB is only needed for devices that bypass the IOMMU or have restricted DMA address ranges. Introduce CONFIG_SWIOTLB_DEFAULT_SIZE_MB (range 1–64 MB, default 64) to allow a smaller compile-time default. The runtime "swiotlb=" parameter override remains supported and takes precedence. Before (default 64 MB): [ 0.000000] software IO TLB: area num 8. [ 0.000000] software IO TLB: mapped [mem 0x00000000fbfff000-0x00000000fffff000] (64MB) After (CONFIG_SWIOTLB_DEFAULT_SIZE_MB=2): [ 0.000000] software IO TLB: area num 8. [ 0.000000] software IO TLB: SWIOTLB bounce buffer size roundup to 2MB [ 0.000000] software IO TLB: mapped [mem 0x00000000ffdff000-0x00000000fffff000] (2MB) --- include/linux/swiotlb.h | 8 ++++++-- kernel/dma/Kconfig | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h index 3dae0f592063..1665a9ce8f94 100644 --- a/include/linux/swiotlb.h +++ b/include/linux/swiotlb.h @@ -32,8 +32,12 @@ struct scatterlist; #define IO_TLB_SHIFT 11 #define IO_TLB_SIZE (1 << IO_TLB_SHIFT) -/* default to 64MB */ -#define IO_TLB_DEFAULT_SIZE (64UL<<20) +/* compile-time default; overridable via CONFIG_SWIOTLB_DEFAULT_SIZE_MB */ +#ifdef CONFIG_SWIOTLB +#define IO_TLB_DEFAULT_SIZE ((unsigned long)CONFIG_SWIOTLB_DEFAULT_SIZE_MB << 20) +#else +#define IO_TLB_DEFAULT_SIZE (64UL << 20) +#endif unsigned long swiotlb_size_or_default(void); void __init swiotlb_init_remap(bool addressing_limit, unsigned int flags, diff --git a/kernel/dma/Kconfig b/kernel/dma/Kconfig index 0a4ba21a57a7..3830a63ae032 100644 --- a/kernel/dma/Kconfig +++ b/kernel/dma/Kconfig @@ -86,6 +86,28 @@ config SWIOTLB bool select NEED_DMA_MAP_STATE +config SWIOTLB_DEFAULT_SIZE_MB + int "Default SWIOTLB bounce buffer size in MB" + depends on SWIOTLB + range 1 64 + default 64 + help + Sets the default size of the software IO TLB (SWIOTLB) bounce buffer + pool allocated at boot time. The default is 64 MB. + + On memory-constrained embedded or mobile platforms (e.g., those with + a hardware IOMMU such as ARM SMMU covering most DMA-capable devices), + a smaller value such as 4 or 8 MB may be sufficient. The SWIOTLB is + then only needed for devices that bypass the IOMMU or have restricted + DMA address ranges. + + The minimum allowed value is 1 MB. This compile-time default can be + overridden at runtime using the "swiotlb=<nslabs>" kernel command line + parameter. Refer to Documentation/admin-guide/kernel-parameters.txt + for details. + + If unsure, leave at the default value of 64. + config SWIOTLB_DYNAMIC bool "Dynamic allocation of DMA bounce buffers" default n --- base-commit: 4fa3f5fabb30bf00d7475d5a33459ea83d639bf9 change-id: 20260617-swiotlb-c215ce0b23f7 Best regards, -- Bibek Kumar Patro <bibek.patro@oss.qualcomm.com> ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] swiotlb: introduce Kconfig option for compile-time default pool size 2026-06-16 21:36 [PATCH] swiotlb: introduce Kconfig option for compile-time default pool size bibek.patro @ 2026-06-17 8:47 ` Mostafa Saleh 2026-06-17 16:13 ` Bibek Kumar Patro 2026-06-18 16:04 ` Michael Kelley 1 sibling, 1 reply; 7+ messages in thread From: Mostafa Saleh @ 2026-06-17 8:47 UTC (permalink / raw) To: bibek.patro Cc: Marek Szyprowski, Robin Murphy, iommu, linux-kernel, Jagadeesh Pagadala On Tue, Jun 16, 2026 at 10:36 PM <bibek.patro@oss.qualcomm.com> wrote: > > From: Jagadeesh Pagadala <jpagadal@qti.qualcomm.com> > > The SWIOTLB bounce buffer pool size is hardcoded at 64 MB via > IO_TLB_DEFAULT_SIZE with no compile-time knob to adjust it. On > memory-constrained embedded or mobile platforms equipped with a > hardware IOMMU (e.g., ARM SMMU) covering most DMA-capable devices, > reserving 64 MB at boot is unnecessarily wasteful — the SWIOTLB is > only exercised for devices that bypass the IOMMU or have restricted > DMA address ranges. > > Introduce CONFIG_SWIOTLB_DEFAULT_SIZE_MB, an integer Kconfig option > (range 1–64 MB, default 64) that allows platforms to set a smaller > compile-time default. IO_TLB_DEFAULT_SIZE is updated to derive from > this value when CONFIG_SWIOTLB is enabled, preserving the existing > 64 MB default when the option is not configured. > > The runtime "swiotlb=<nslabs>" kernel parameter override remains > fully supported and takes precedence over the compile-time default. > Just curious, why is not "swiotlb=" enough in your case? Thanks, Mostafa > Signed-off-by: Jagadeesh Pagadala <jpagadal@qti.qualcomm.com> > Signed-off-by: Bibek Kumar Patro <bibek.patro@oss.qualcomm.com> > --- > The SWIOTLB bounce buffer pool size is hardcoded at 64 MB. On > memory-constrained platforms with a hardware IOMMU (e.g., ARM SMMU), > this reservation is wasteful as SWIOTLB is only needed for devices > that bypass the IOMMU or have restricted DMA address ranges. > > Introduce CONFIG_SWIOTLB_DEFAULT_SIZE_MB (range 1–64 MB, default 64) > to allow a smaller compile-time default. The runtime "swiotlb=" > parameter override remains supported and takes precedence. > > Before (default 64 MB): > [ 0.000000] software IO TLB: area num 8. > [ 0.000000] software IO TLB: mapped [mem 0x00000000fbfff000-0x00000000fffff000] (64MB) > > After (CONFIG_SWIOTLB_DEFAULT_SIZE_MB=2): > [ 0.000000] software IO TLB: area num 8. > [ 0.000000] software IO TLB: SWIOTLB bounce buffer size roundup to 2MB > [ 0.000000] software IO TLB: mapped [mem 0x00000000ffdff000-0x00000000fffff000] (2MB) > --- > include/linux/swiotlb.h | 8 ++++++-- > kernel/dma/Kconfig | 22 ++++++++++++++++++++++ > 2 files changed, 28 insertions(+), 2 deletions(-) > > diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h > index 3dae0f592063..1665a9ce8f94 100644 > --- a/include/linux/swiotlb.h > +++ b/include/linux/swiotlb.h > @@ -32,8 +32,12 @@ struct scatterlist; > #define IO_TLB_SHIFT 11 > #define IO_TLB_SIZE (1 << IO_TLB_SHIFT) > > -/* default to 64MB */ > -#define IO_TLB_DEFAULT_SIZE (64UL<<20) > +/* compile-time default; overridable via CONFIG_SWIOTLB_DEFAULT_SIZE_MB */ > +#ifdef CONFIG_SWIOTLB > +#define IO_TLB_DEFAULT_SIZE ((unsigned long)CONFIG_SWIOTLB_DEFAULT_SIZE_MB << 20) > +#else > +#define IO_TLB_DEFAULT_SIZE (64UL << 20) > +#endif > > unsigned long swiotlb_size_or_default(void); > void __init swiotlb_init_remap(bool addressing_limit, unsigned int flags, > diff --git a/kernel/dma/Kconfig b/kernel/dma/Kconfig > index 0a4ba21a57a7..3830a63ae032 100644 > --- a/kernel/dma/Kconfig > +++ b/kernel/dma/Kconfig > @@ -86,6 +86,28 @@ config SWIOTLB > bool > select NEED_DMA_MAP_STATE > > +config SWIOTLB_DEFAULT_SIZE_MB > + int "Default SWIOTLB bounce buffer size in MB" > + depends on SWIOTLB > + range 1 64 > + default 64 > + help > + Sets the default size of the software IO TLB (SWIOTLB) bounce buffer > + pool allocated at boot time. The default is 64 MB. > + > + On memory-constrained embedded or mobile platforms (e.g., those with > + a hardware IOMMU such as ARM SMMU covering most DMA-capable devices), > + a smaller value such as 4 or 8 MB may be sufficient. The SWIOTLB is > + then only needed for devices that bypass the IOMMU or have restricted > + DMA address ranges. > + > + The minimum allowed value is 1 MB. This compile-time default can be > + overridden at runtime using the "swiotlb=<nslabs>" kernel command line > + parameter. Refer to Documentation/admin-guide/kernel-parameters.txt > + for details. > + > + If unsure, leave at the default value of 64. > + > config SWIOTLB_DYNAMIC > bool "Dynamic allocation of DMA bounce buffers" > default n > > --- > base-commit: 4fa3f5fabb30bf00d7475d5a33459ea83d639bf9 > change-id: 20260617-swiotlb-c215ce0b23f7 > > Best regards, > -- > Bibek Kumar Patro <bibek.patro@oss.qualcomm.com> > > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] swiotlb: introduce Kconfig option for compile-time default pool size 2026-06-17 8:47 ` Mostafa Saleh @ 2026-06-17 16:13 ` Bibek Kumar Patro 0 siblings, 0 replies; 7+ messages in thread From: Bibek Kumar Patro @ 2026-06-17 16:13 UTC (permalink / raw) To: Mostafa Saleh Cc: Marek Szyprowski, Robin Murphy, iommu, linux-kernel, Jagadeesh Pagadala On 6/17/2026 2:17 PM, Mostafa Saleh wrote: > On Tue, Jun 16, 2026 at 10:36 PM <bibek.patro@oss.qualcomm.com> wrote: >> >> From: Jagadeesh Pagadala <jpagadal@qti.qualcomm.com> >> >> The SWIOTLB bounce buffer pool size is hardcoded at 64 MB via >> IO_TLB_DEFAULT_SIZE with no compile-time knob to adjust it. On >> memory-constrained embedded or mobile platforms equipped with a >> hardware IOMMU (e.g., ARM SMMU) covering most DMA-capable devices, >> reserving 64 MB at boot is unnecessarily wasteful — the SWIOTLB is >> only exercised for devices that bypass the IOMMU or have restricted >> DMA address ranges. >> >> Introduce CONFIG_SWIOTLB_DEFAULT_SIZE_MB, an integer Kconfig option >> (range 1–64 MB, default 64) that allows platforms to set a smaller >> compile-time default. IO_TLB_DEFAULT_SIZE is updated to derive from >> this value when CONFIG_SWIOTLB is enabled, preserving the existing >> 64 MB default when the option is not configured. >> >> The runtime "swiotlb=<nslabs>" kernel parameter override remains >> fully supported and takes precedence over the compile-time default. >> > > Just curious, why is not "swiotlb=" enough in your case? > We are looking for an approach where we can set a default value of IO_TLB_DEFAULT_SIZE to maintain and sustain it for a specific platform or a kernel configuration. So introducing a Kconfig tunable seemed to be a maintainable approach compared to "swiotlb=" runtime variable. (since defconfig is the right mechanism for platform specific compile-time defaults) Further in case of any bootloader constraints - to make default runtime parameter, it might require firmware changes on production devices as well. (since in embedded/mobile platforms the kernel command line is typically managed by the bootloader) Thanks & regards, Bibek > Thanks, > Mostafa > >> Signed-off-by: Jagadeesh Pagadala <jpagadal@qti.qualcomm.com> >> Signed-off-by: Bibek Kumar Patro <bibek.patro@oss.qualcomm.com> >> --- >> The SWIOTLB bounce buffer pool size is hardcoded at 64 MB. On >> memory-constrained platforms with a hardware IOMMU (e.g., ARM SMMU), >> this reservation is wasteful as SWIOTLB is only needed for devices >> that bypass the IOMMU or have restricted DMA address ranges. >> >> Introduce CONFIG_SWIOTLB_DEFAULT_SIZE_MB (range 1–64 MB, default 64) >> to allow a smaller compile-time default. The runtime "swiotlb=" >> parameter override remains supported and takes precedence. >> >> Before (default 64 MB): >> [ 0.000000] software IO TLB: area num 8. >> [ 0.000000] software IO TLB: mapped [mem 0x00000000fbfff000-0x00000000fffff000] (64MB) >> >> After (CONFIG_SWIOTLB_DEFAULT_SIZE_MB=2): >> [ 0.000000] software IO TLB: area num 8. >> [ 0.000000] software IO TLB: SWIOTLB bounce buffer size roundup to 2MB >> [ 0.000000] software IO TLB: mapped [mem 0x00000000ffdff000-0x00000000fffff000] (2MB) >> --- >> include/linux/swiotlb.h | 8 ++++++-- >> kernel/dma/Kconfig | 22 ++++++++++++++++++++++ >> 2 files changed, 28 insertions(+), 2 deletions(-) >> >> diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h >> index 3dae0f592063..1665a9ce8f94 100644 >> --- a/include/linux/swiotlb.h >> +++ b/include/linux/swiotlb.h >> @@ -32,8 +32,12 @@ struct scatterlist; >> #define IO_TLB_SHIFT 11 >> #define IO_TLB_SIZE (1 << IO_TLB_SHIFT) >> >> -/* default to 64MB */ >> -#define IO_TLB_DEFAULT_SIZE (64UL<<20) >> +/* compile-time default; overridable via CONFIG_SWIOTLB_DEFAULT_SIZE_MB */ >> +#ifdef CONFIG_SWIOTLB >> +#define IO_TLB_DEFAULT_SIZE ((unsigned long)CONFIG_SWIOTLB_DEFAULT_SIZE_MB << 20) >> +#else >> +#define IO_TLB_DEFAULT_SIZE (64UL << 20) >> +#endif >> >> unsigned long swiotlb_size_or_default(void); >> void __init swiotlb_init_remap(bool addressing_limit, unsigned int flags, >> diff --git a/kernel/dma/Kconfig b/kernel/dma/Kconfig >> index 0a4ba21a57a7..3830a63ae032 100644 >> --- a/kernel/dma/Kconfig >> +++ b/kernel/dma/Kconfig >> @@ -86,6 +86,28 @@ config SWIOTLB >> bool >> select NEED_DMA_MAP_STATE >> >> +config SWIOTLB_DEFAULT_SIZE_MB >> + int "Default SWIOTLB bounce buffer size in MB" >> + depends on SWIOTLB >> + range 1 64 >> + default 64 >> + help >> + Sets the default size of the software IO TLB (SWIOTLB) bounce buffer >> + pool allocated at boot time. The default is 64 MB. >> + >> + On memory-constrained embedded or mobile platforms (e.g., those with >> + a hardware IOMMU such as ARM SMMU covering most DMA-capable devices), >> + a smaller value such as 4 or 8 MB may be sufficient. The SWIOTLB is >> + then only needed for devices that bypass the IOMMU or have restricted >> + DMA address ranges. >> + >> + The minimum allowed value is 1 MB. This compile-time default can be >> + overridden at runtime using the "swiotlb=<nslabs>" kernel command line >> + parameter. Refer to Documentation/admin-guide/kernel-parameters.txt >> + for details. >> + >> + If unsure, leave at the default value of 64. >> + >> config SWIOTLB_DYNAMIC >> bool "Dynamic allocation of DMA bounce buffers" >> default n >> >> --- >> base-commit: 4fa3f5fabb30bf00d7475d5a33459ea83d639bf9 >> change-id: 20260617-swiotlb-c215ce0b23f7 >> >> Best regards, >> -- >> Bibek Kumar Patro <bibek.patro@oss.qualcomm.com> >> >> ^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [PATCH] swiotlb: introduce Kconfig option for compile-time default pool size 2026-06-16 21:36 [PATCH] swiotlb: introduce Kconfig option for compile-time default pool size bibek.patro 2026-06-17 8:47 ` Mostafa Saleh @ 2026-06-18 16:04 ` Michael Kelley 2026-06-22 14:45 ` Bibek Kumar Patro 1 sibling, 1 reply; 7+ messages in thread From: Michael Kelley @ 2026-06-18 16:04 UTC (permalink / raw) To: bibek.patro, Marek Szyprowski, Robin Murphy Cc: iommu, linux-kernel, Jagadeesh Pagadala From: bibek.patro@oss.qualcomm.com <bibek.patro@oss.qualcomm.com> Sent: Tuesday, June 16, 2026 2:36 PM > > From: Jagadeesh Pagadala <jpagadal@qti.qualcomm.com> > > The SWIOTLB bounce buffer pool size is hardcoded at 64 MB via > IO_TLB_DEFAULT_SIZE with no compile-time knob to adjust it. On > memory-constrained embedded or mobile platforms equipped with a > hardware IOMMU (e.g., ARM SMMU) covering most DMA-capable devices, > reserving 64 MB at boot is unnecessarily wasteful — the SWIOTLB is > only exercised for devices that bypass the IOMMU or have restricted > DMA address ranges. > > Introduce CONFIG_SWIOTLB_DEFAULT_SIZE_MB, an integer Kconfig option > (range 1–64 MB, default 64) that allows platforms to set a smaller > compile-time default. IO_TLB_DEFAULT_SIZE is updated to derive from > this value when CONFIG_SWIOTLB is enabled, preserving the existing > 64 MB default when the option is not configured. > > The runtime "swiotlb=<nslabs>" kernel parameter override remains > fully supported and takes precedence over the compile-time default. > > Signed-off-by: Jagadeesh Pagadala <jpagadal@qti.qualcomm.com> > Signed-off-by: Bibek Kumar Patro <bibek.patro@oss.qualcomm.com> > --- > The SWIOTLB bounce buffer pool size is hardcoded at 64 MB. On > memory-constrained platforms with a hardware IOMMU (e.g., ARM SMMU), > this reservation is wasteful as SWIOTLB is only needed for devices > that bypass the IOMMU or have restricted DMA address ranges. > > Introduce CONFIG_SWIOTLB_DEFAULT_SIZE_MB (range 1–64 MB, default 64) > to allow a smaller compile-time default. The runtime "swiotlb=" > parameter override remains supported and takes precedence. > > Before (default 64 MB): > [ 0.000000] software IO TLB: area num 8. > [ 0.000000] software IO TLB: mapped [mem 0x00000000fbfff000-0x00000000fffff000] (64MB) > > After (CONFIG_SWIOTLB_DEFAULT_SIZE_MB=2): > [ 0.000000] software IO TLB: area num 8. > [ 0.000000] software IO TLB: SWIOTLB bounce buffer size roundup to 2MB > [ 0.000000] software IO TLB: mapped [mem 0x00000000ffdff000-0x00000000fffff000] (2MB) This message sequence is surprising to me -- there should not be any roundup if the default size is 2 MiB and there are 8 CPUs. I ran the patch with 8 CPUs and set CONFIG_SWIOTLB_DEFAULT_SIZE_MB=2, and no roundup was reported. I'm curious as to what configuration produced the "roundup" message. Also, there's some text in Documentation/core-api/swiotlb.rst that describes the default size of the swiotlb, and how it can be overridden with the swiotlb= kernel boot option. This patch should include an update to that text to mention the new CONFIG option. Michael > --- > include/linux/swiotlb.h | 8 ++++++-- > kernel/dma/Kconfig | 22 ++++++++++++++++++++++ > 2 files changed, 28 insertions(+), 2 deletions(-) > > diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h > index 3dae0f592063..1665a9ce8f94 100644 > --- a/include/linux/swiotlb.h > +++ b/include/linux/swiotlb.h > @@ -32,8 +32,12 @@ struct scatterlist; > #define IO_TLB_SHIFT 11 > #define IO_TLB_SIZE (1 << IO_TLB_SHIFT) > > -/* default to 64MB */ > -#define IO_TLB_DEFAULT_SIZE (64UL<<20) > +/* compile-time default; overridable via CONFIG_SWIOTLB_DEFAULT_SIZE_MB */ > +#ifdef CONFIG_SWIOTLB > +#define IO_TLB_DEFAULT_SIZE ((unsigned long)CONFIG_SWIOTLB_DEFAULT_SIZE_MB << 20) > +#else > +#define IO_TLB_DEFAULT_SIZE (64UL << 20) > +#endif > > unsigned long swiotlb_size_or_default(void); > void __init swiotlb_init_remap(bool addressing_limit, unsigned int flags, > diff --git a/kernel/dma/Kconfig b/kernel/dma/Kconfig > index 0a4ba21a57a7..3830a63ae032 100644 > --- a/kernel/dma/Kconfig > +++ b/kernel/dma/Kconfig > @@ -86,6 +86,28 @@ config SWIOTLB > bool > select NEED_DMA_MAP_STATE > > +config SWIOTLB_DEFAULT_SIZE_MB > + int "Default SWIOTLB bounce buffer size in MB" > + depends on SWIOTLB > + range 1 64 > + default 64 > + help > + Sets the default size of the software IO TLB (SWIOTLB) bounce buffer > + pool allocated at boot time. The default is 64 MB. > + > + On memory-constrained embedded or mobile platforms (e.g., those with > + a hardware IOMMU such as ARM SMMU covering most DMA-capable devices), > + a smaller value such as 4 or 8 MB may be sufficient. The SWIOTLB is > + then only needed for devices that bypass the IOMMU or have restricted > + DMA address ranges. > + > + The minimum allowed value is 1 MB. This compile-time default can be > + overridden at runtime using the "swiotlb=<nslabs>" kernel command line > + parameter. Refer to Documentation/admin-guide/kernel-parameters.txt > + for details. > + > + If unsure, leave at the default value of 64. > + > config SWIOTLB_DYNAMIC > bool "Dynamic allocation of DMA bounce buffers" > default n > > --- > base-commit: 4fa3f5fabb30bf00d7475d5a33459ea83d639bf9 > change-id: 20260617-swiotlb-c215ce0b23f7 > > Best regards, > -- > Bibek Kumar Patro <bibek.patro@oss.qualcomm.com> > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] swiotlb: introduce Kconfig option for compile-time default pool size 2026-06-18 16:04 ` Michael Kelley @ 2026-06-22 14:45 ` Bibek Kumar Patro 2026-07-02 13:44 ` Bibek Kumar Patro 0 siblings, 1 reply; 7+ messages in thread From: Bibek Kumar Patro @ 2026-06-22 14:45 UTC (permalink / raw) To: Michael Kelley, Marek Szyprowski, Robin Murphy Cc: iommu, linux-kernel, Jagadeesh Pagadala On 6/18/2026 9:34 PM, Michael Kelley wrote: > From: bibek.patro@oss.qualcomm.com <bibek.patro@oss.qualcomm.com> Sent: Tuesday, June 16, 2026 2:36 PM >> >> From: Jagadeesh Pagadala <jpagadal@qti.qualcomm.com> >> >> The SWIOTLB bounce buffer pool size is hardcoded at 64 MB via >> IO_TLB_DEFAULT_SIZE with no compile-time knob to adjust it. On >> memory-constrained embedded or mobile platforms equipped with a >> hardware IOMMU (e.g., ARM SMMU) covering most DMA-capable devices, >> reserving 64 MB at boot is unnecessarily wasteful — the SWIOTLB is >> only exercised for devices that bypass the IOMMU or have restricted >> DMA address ranges. >> >> Introduce CONFIG_SWIOTLB_DEFAULT_SIZE_MB, an integer Kconfig option >> (range 1–64 MB, default 64) that allows platforms to set a smaller >> compile-time default. IO_TLB_DEFAULT_SIZE is updated to derive from >> this value when CONFIG_SWIOTLB is enabled, preserving the existing >> 64 MB default when the option is not configured. >> >> The runtime "swiotlb=<nslabs>" kernel parameter override remains >> fully supported and takes precedence over the compile-time default. >> >> Signed-off-by: Jagadeesh Pagadala <jpagadal@qti.qualcomm.com> >> Signed-off-by: Bibek Kumar Patro <bibek.patro@oss.qualcomm.com> >> --- >> The SWIOTLB bounce buffer pool size is hardcoded at 64 MB. On >> memory-constrained platforms with a hardware IOMMU (e.g., ARM SMMU), >> this reservation is wasteful as SWIOTLB is only needed for devices >> that bypass the IOMMU or have restricted DMA address ranges. >> >> Introduce CONFIG_SWIOTLB_DEFAULT_SIZE_MB (range 1–64 MB, default 64) >> to allow a smaller compile-time default. The runtime "swiotlb=" >> parameter override remains supported and takes precedence. >> >> Before (default 64 MB): >> [ 0.000000] software IO TLB: area num 8. >> [ 0.000000] software IO TLB: mapped [mem 0x00000000fbfff000-0x00000000fffff000] (64MB) >> >> After (CONFIG_SWIOTLB_DEFAULT_SIZE_MB=2): >> [ 0.000000] software IO TLB: area num 8. >> [ 0.000000] software IO TLB: SWIOTLB bounce buffer size roundup to 2MB >> [ 0.000000] software IO TLB: mapped [mem 0x00000000ffdff000-0x00000000fffff000] (2MB) > > This message sequence is surprising to me -- there should not be any > roundup if the default size is 2 MiB and there are 8 CPUs. I ran the patch > with 8 CPUs and set CONFIG_SWIOTLB_DEFAULT_SIZE_MB=2, and > no roundup was reported. I'm curious as to what configuration produced > the "roundup" message. > I see inside swiotlb.c, we have a print for rounding off based on the number of slabs, inside the check for "round_up_default_nslabs()" pr_info("SWIOTLB bounce buffer size roundup to %luMB", Probability of getting the print based on the number of slabs. <I am assuming your configuration is having nslabs in power of 2> > Also, there's some text in Documentation/core-api/swiotlb.rst that > describes the default size of the swiotlb, and how it can be overridden > with the swiotlb= kernel boot option. This patch should include an update > to that text to mention the new CONFIG option. > Ack, thanks for this suggestion. I will incorporate in next revision. It would be a good information for someone trying a similar approach for setting the default option to custom value. Thanks & regards, Bibek > Michael > >> --- >> include/linux/swiotlb.h | 8 ++++++-- >> kernel/dma/Kconfig | 22 ++++++++++++++++++++++ >> 2 files changed, 28 insertions(+), 2 deletions(-) >> >> diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h >> index 3dae0f592063..1665a9ce8f94 100644 >> --- a/include/linux/swiotlb.h >> +++ b/include/linux/swiotlb.h >> @@ -32,8 +32,12 @@ struct scatterlist; >> #define IO_TLB_SHIFT 11 >> #define IO_TLB_SIZE (1 << IO_TLB_SHIFT) >> >> -/* default to 64MB */ >> -#define IO_TLB_DEFAULT_SIZE (64UL<<20) >> +/* compile-time default; overridable via CONFIG_SWIOTLB_DEFAULT_SIZE_MB */ >> +#ifdef CONFIG_SWIOTLB >> +#define IO_TLB_DEFAULT_SIZE ((unsigned long)CONFIG_SWIOTLB_DEFAULT_SIZE_MB << 20) >> +#else >> +#define IO_TLB_DEFAULT_SIZE (64UL << 20) >> +#endif >> >> unsigned long swiotlb_size_or_default(void); >> void __init swiotlb_init_remap(bool addressing_limit, unsigned int flags, >> diff --git a/kernel/dma/Kconfig b/kernel/dma/Kconfig >> index 0a4ba21a57a7..3830a63ae032 100644 >> --- a/kernel/dma/Kconfig >> +++ b/kernel/dma/Kconfig >> @@ -86,6 +86,28 @@ config SWIOTLB >> bool >> select NEED_DMA_MAP_STATE >> >> +config SWIOTLB_DEFAULT_SIZE_MB >> + int "Default SWIOTLB bounce buffer size in MB" >> + depends on SWIOTLB >> + range 1 64 >> + default 64 >> + help >> + Sets the default size of the software IO TLB (SWIOTLB) bounce buffer >> + pool allocated at boot time. The default is 64 MB. >> + >> + On memory-constrained embedded or mobile platforms (e.g., those with >> + a hardware IOMMU such as ARM SMMU covering most DMA-capable devices), >> + a smaller value such as 4 or 8 MB may be sufficient. The SWIOTLB is >> + then only needed for devices that bypass the IOMMU or have restricted >> + DMA address ranges. >> + >> + The minimum allowed value is 1 MB. This compile-time default can be >> + overridden at runtime using the "swiotlb=<nslabs>" kernel command line >> + parameter. Refer to Documentation/admin-guide/kernel-parameters.txt >> + for details. >> + >> + If unsure, leave at the default value of 64. >> + >> config SWIOTLB_DYNAMIC >> bool "Dynamic allocation of DMA bounce buffers" >> default n >> >> --- >> base-commit: 4fa3f5fabb30bf00d7475d5a33459ea83d639bf9 >> change-id: 20260617-swiotlb-c215ce0b23f7 >> >> Best regards, >> -- >> Bibek Kumar Patro <bibek.patro@oss.qualcomm.com> >> > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] swiotlb: introduce Kconfig option for compile-time default pool size 2026-06-22 14:45 ` Bibek Kumar Patro @ 2026-07-02 13:44 ` Bibek Kumar Patro 2026-07-02 15:48 ` Michael Kelley 0 siblings, 1 reply; 7+ messages in thread From: Bibek Kumar Patro @ 2026-07-02 13:44 UTC (permalink / raw) To: Michael Kelley, Marek Szyprowski, Robin Murphy Cc: iommu, linux-kernel, Jagadeesh Pagadala On 6/22/2026 8:15 PM, Bibek Kumar Patro wrote: > > > On 6/18/2026 9:34 PM, Michael Kelley wrote: >> From: bibek.patro@oss.qualcomm.com <bibek.patro@oss.qualcomm.com> >> Sent: Tuesday, June 16, 2026 2:36 PM >>> >>> From: Jagadeesh Pagadala <jpagadal@qti.qualcomm.com> >>> >>> The SWIOTLB bounce buffer pool size is hardcoded at 64 MB via >>> IO_TLB_DEFAULT_SIZE with no compile-time knob to adjust it. On >>> memory-constrained embedded or mobile platforms equipped with a >>> hardware IOMMU (e.g., ARM SMMU) covering most DMA-capable devices, >>> reserving 64 MB at boot is unnecessarily wasteful — the SWIOTLB is >>> only exercised for devices that bypass the IOMMU or have restricted >>> DMA address ranges. >>> >>> Introduce CONFIG_SWIOTLB_DEFAULT_SIZE_MB, an integer Kconfig option >>> (range 1–64 MB, default 64) that allows platforms to set a smaller >>> compile-time default. IO_TLB_DEFAULT_SIZE is updated to derive from >>> this value when CONFIG_SWIOTLB is enabled, preserving the existing >>> 64 MB default when the option is not configured. >>> >>> The runtime "swiotlb=<nslabs>" kernel parameter override remains >>> fully supported and takes precedence over the compile-time default. >>> >>> Signed-off-by: Jagadeesh Pagadala <jpagadal@qti.qualcomm.com> >>> Signed-off-by: Bibek Kumar Patro <bibek.patro@oss.qualcomm.com> >>> --- >>> The SWIOTLB bounce buffer pool size is hardcoded at 64 MB. On >>> memory-constrained platforms with a hardware IOMMU (e.g., ARM SMMU), >>> this reservation is wasteful as SWIOTLB is only needed for devices >>> that bypass the IOMMU or have restricted DMA address ranges. >>> >>> Introduce CONFIG_SWIOTLB_DEFAULT_SIZE_MB (range 1–64 MB, default 64) >>> to allow a smaller compile-time default. The runtime "swiotlb=" >>> parameter override remains supported and takes precedence. >>> >>> Before (default 64 MB): >>> [ 0.000000] software IO TLB: area num 8. >>> [ 0.000000] software IO TLB: mapped [mem >>> 0x00000000fbfff000-0x00000000fffff000] (64MB) >>> >>> After (CONFIG_SWIOTLB_DEFAULT_SIZE_MB=2): >>> [ 0.000000] software IO TLB: area num 8. >>> [ 0.000000] software IO TLB: SWIOTLB bounce buffer size roundup >>> to 2MB >>> [ 0.000000] software IO TLB: mapped [mem >>> 0x00000000ffdff000-0x00000000fffff000] (2MB) >> >> This message sequence is surprising to me -- there should not be any >> roundup if the default size is 2 MiB and there are 8 CPUs. I ran the >> patch >> with 8 CPUs and set CONFIG_SWIOTLB_DEFAULT_SIZE_MB=2, and >> no roundup was reported. I'm curious as to what configuration produced >> the "roundup" message. >> I might have misunderstood your query Michael, you're correct. I rechecked my system configuration with 8 CPUs and CONFIG_SWIOTLB_DEFAULT_SIZE_MB=2, and I did not get the "roundup" message. I did a few experiments while developing the patch initially with CONFIG_SWIOTLB_DEFAULT_SIZE_MB across a range of values. CONFIG_SWIOTLB_DEFAULT_SIZE_MB=1 gives the roundup message: [ 0.000000] software IO TLB: area num 8. [ 0.000000] software IO TLB: SWIOTLB bounce buffer size roundup to 2MB [ 0.000000] software IO TLB: mapped [mem 0x00000000ffdff000-0x00000000fffff000] (2MB) With CONFIG_SWIOTLB_DEFAULT_SIZE_MB=1: nslabs = CONFIG_SWIOTLB_DEFAULT_SIZE_MB << 9 = 1 << 9 = 512 With 8 CPUs, default_nareas = 8, so the minimum required nslabs is: IO_TLB_SEGSIZE * default_nareas = 128 * 8 = 1024 Since 512 < 1024, nslabs is rounded up to 1024 (2MB), which explains the roundup message. I have incorrectly labelled this log in cover letter by posting the logs for CONFIG_SWIOTLB_DEFAULT_SIZE_MB=1 instead of CONFIG_SWIOTLB_DEFAULT_SIZE_MB=2 I will correct this info in the cover letter while sending the next revision along with the documentation update as you suggested. Thanks & regards, Bibek > > I see inside swiotlb.c, we have a print for rounding off based on the > number of slabs, inside the check for "round_up_default_nslabs()" > pr_info("SWIOTLB bounce buffer size roundup to %luMB", > > Probability of getting the print based on the number of slabs. > <I am assuming your configuration is having nslabs in power of 2> > > >> Also, there's some text in Documentation/core-api/swiotlb.rst that >> describes the default size of the swiotlb, and how it can be overridden >> with the swiotlb= kernel boot option. This patch should include an update >> to that text to mention the new CONFIG option. >> > > Ack, thanks for this suggestion. I will incorporate in next revision. > It would be a good information for someone trying a similar approach for > setting the default option to custom value. > > Thanks & regards, > Bibek > >> Michael >> >>> --- >>> include/linux/swiotlb.h | 8 ++++++-- >>> kernel/dma/Kconfig | 22 ++++++++++++++++++++++ >>> 2 files changed, 28 insertions(+), 2 deletions(-) >>> >>> diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h >>> index 3dae0f592063..1665a9ce8f94 100644 >>> --- a/include/linux/swiotlb.h >>> +++ b/include/linux/swiotlb.h >>> @@ -32,8 +32,12 @@ struct scatterlist; >>> #define IO_TLB_SHIFT 11 >>> #define IO_TLB_SIZE (1 << IO_TLB_SHIFT) >>> >>> -/* default to 64MB */ >>> -#define IO_TLB_DEFAULT_SIZE (64UL<<20) >>> +/* compile-time default; overridable via >>> CONFIG_SWIOTLB_DEFAULT_SIZE_MB */ >>> +#ifdef CONFIG_SWIOTLB >>> +#define IO_TLB_DEFAULT_SIZE ((unsigned >>> long)CONFIG_SWIOTLB_DEFAULT_SIZE_MB << 20) >>> +#else >>> +#define IO_TLB_DEFAULT_SIZE (64UL << 20) >>> +#endif >>> >>> unsigned long swiotlb_size_or_default(void); >>> void __init swiotlb_init_remap(bool addressing_limit, unsigned int >>> flags, >>> diff --git a/kernel/dma/Kconfig b/kernel/dma/Kconfig >>> index 0a4ba21a57a7..3830a63ae032 100644 >>> --- a/kernel/dma/Kconfig >>> +++ b/kernel/dma/Kconfig >>> @@ -86,6 +86,28 @@ config SWIOTLB >>> bool >>> select NEED_DMA_MAP_STATE >>> >>> +config SWIOTLB_DEFAULT_SIZE_MB >>> + int "Default SWIOTLB bounce buffer size in MB" >>> + depends on SWIOTLB >>> + range 1 64 >>> + default 64 >>> + help >>> + Sets the default size of the software IO TLB (SWIOTLB) bounce >>> buffer >>> + pool allocated at boot time. The default is 64 MB. >>> + >>> + On memory-constrained embedded or mobile platforms (e.g., >>> those with >>> + a hardware IOMMU such as ARM SMMU covering most DMA-capable >>> devices), >>> + a smaller value such as 4 or 8 MB may be sufficient. The >>> SWIOTLB is >>> + then only needed for devices that bypass the IOMMU or have >>> restricted >>> + DMA address ranges. >>> + >>> + The minimum allowed value is 1 MB. This compile-time default >>> can be >>> + overridden at runtime using the "swiotlb=<nslabs>" kernel >>> command line >>> + parameter. Refer to Documentation/admin-guide/kernel- >>> parameters.txt >>> + for details. >>> + >>> + If unsure, leave at the default value of 64. >>> + >>> config SWIOTLB_DYNAMIC >>> bool "Dynamic allocation of DMA bounce buffers" >>> default n >>> >>> --- >>> base-commit: 4fa3f5fabb30bf00d7475d5a33459ea83d639bf9 >>> change-id: 20260617-swiotlb-c215ce0b23f7 >>> >>> Best regards, >>> -- >>> Bibek Kumar Patro <bibek.patro@oss.qualcomm.com> >>> >> > ^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [PATCH] swiotlb: introduce Kconfig option for compile-time default pool size 2026-07-02 13:44 ` Bibek Kumar Patro @ 2026-07-02 15:48 ` Michael Kelley 0 siblings, 0 replies; 7+ messages in thread From: Michael Kelley @ 2026-07-02 15:48 UTC (permalink / raw) To: Bibek Kumar Patro, Michael Kelley, Marek Szyprowski, Robin Murphy Cc: iommu, linux-kernel, Jagadeesh Pagadala From: Bibek Kumar Patro <bibek.patro@oss.qualcomm.com> Sent: Thursday, July 2, 2026 6:45 AM > > On 6/22/2026 8:15 PM, Bibek Kumar Patro wrote: > > > > > > On 6/18/2026 9:34 PM, Michael Kelley wrote: > >> From: bibek.patro@oss.qualcomm.com <bibek.patro@oss.qualcomm.com> > >> Sent: Tuesday, June 16, 2026 2:36 PM > >>> > >>> From: Jagadeesh Pagadala <jpagadal@qti.qualcomm.com> > >>> > >>> The SWIOTLB bounce buffer pool size is hardcoded at 64 MB via > >>> IO_TLB_DEFAULT_SIZE with no compile-time knob to adjust it. On > >>> memory-constrained embedded or mobile platforms equipped with a > >>> hardware IOMMU (e.g., ARM SMMU) covering most DMA-capable devices, > >>> reserving 64 MB at boot is unnecessarily wasteful — the SWIOTLB is > >>> only exercised for devices that bypass the IOMMU or have restricted > >>> DMA address ranges. > >>> > >>> Introduce CONFIG_SWIOTLB_DEFAULT_SIZE_MB, an integer Kconfig option > >>> (range 1–64 MB, default 64) that allows platforms to set a smaller > >>> compile-time default. IO_TLB_DEFAULT_SIZE is updated to derive from > >>> this value when CONFIG_SWIOTLB is enabled, preserving the existing > >>> 64 MB default when the option is not configured. > >>> > >>> The runtime "swiotlb=<nslabs>" kernel parameter override remains > >>> fully supported and takes precedence over the compile-time default. > >>> > >>> Signed-off-by: Jagadeesh Pagadala <jpagadal@qti.qualcomm.com> > >>> Signed-off-by: Bibek Kumar Patro <bibek.patro@oss.qualcomm.com> > >>> --- > >>> The SWIOTLB bounce buffer pool size is hardcoded at 64 MB. On > >>> memory-constrained platforms with a hardware IOMMU (e.g., ARM SMMU), > >>> this reservation is wasteful as SWIOTLB is only needed for devices > >>> that bypass the IOMMU or have restricted DMA address ranges. > >>> > >>> Introduce CONFIG_SWIOTLB_DEFAULT_SIZE_MB (range 1–64 MB, default 64) > >>> to allow a smaller compile-time default. The runtime "swiotlb=" > >>> parameter override remains supported and takes precedence. > >>> > >>> Before (default 64 MB): > >>> [ 0.000000] software IO TLB: area num 8. > >>> [ 0.000000] software IO TLB: mapped [mem > >>> 0x00000000fbfff000-0x00000000fffff000] (64MB) > >>> > >>> After (CONFIG_SWIOTLB_DEFAULT_SIZE_MB=2): > >>> [ 0.000000] software IO TLB: area num 8. > >>> [ 0.000000] software IO TLB: SWIOTLB bounce buffer size roundup > >>> to 2MB > >>> [ 0.000000] software IO TLB: mapped [mem > >>> 0x00000000ffdff000-0x00000000fffff000] (2MB) > >> > >> This message sequence is surprising to me -- there should not be any > >> roundup if the default size is 2 MiB and there are 8 CPUs. I ran the > >> patch > >> with 8 CPUs and set CONFIG_SWIOTLB_DEFAULT_SIZE_MB=2, and > >> no roundup was reported. I'm curious as to what configuration produced > >> the "roundup" message. > >> > > I might have misunderstood your query Michael, you're correct. > > I rechecked my system configuration with 8 CPUs and > CONFIG_SWIOTLB_DEFAULT_SIZE_MB=2, and I did not get the "roundup" > message. I did a few experiments while developing the patch initially > with CONFIG_SWIOTLB_DEFAULT_SIZE_MB across a range of values. > CONFIG_SWIOTLB_DEFAULT_SIZE_MB=1 gives the roundup message: > > [ 0.000000] software IO TLB: area num 8. > [ 0.000000] software IO TLB: SWIOTLB bounce buffer size roundup to 2MB > [ 0.000000] software IO TLB: mapped [mem > 0x00000000ffdff000-0x00000000fffff000] (2MB) > > With CONFIG_SWIOTLB_DEFAULT_SIZE_MB=1: > > nslabs = CONFIG_SWIOTLB_DEFAULT_SIZE_MB << 9 = 1 << 9 = 512 > > With 8 CPUs, default_nareas = 8, so the minimum required nslabs is: > > IO_TLB_SEGSIZE * default_nareas = 128 * 8 = 1024 > > Since 512 < 1024, nslabs is rounded up to 1024 (2MB), which explains > the roundup message. > I have incorrectly labelled this log in cover letter by posting the logs > for CONFIG_SWIOTLB_DEFAULT_SIZE_MB=1 instead of > CONFIG_SWIOTLB_DEFAULT_SIZE_MB=2 > I will correct this info in the cover letter while sending the next > revision along with the documentation update as you suggested. > Thanks. That all makes sense now. Michael ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-07-02 15:48 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2026-06-16 21:36 [PATCH] swiotlb: introduce Kconfig option for compile-time default pool size bibek.patro 2026-06-17 8:47 ` Mostafa Saleh 2026-06-17 16:13 ` Bibek Kumar Patro 2026-06-18 16:04 ` Michael Kelley 2026-06-22 14:45 ` Bibek Kumar Patro 2026-07-02 13:44 ` Bibek Kumar Patro 2026-07-02 15:48 ` Michael Kelley
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®