RE: [PATCH] swiotlb: introduce Kconfig option for compile-time default pool size

From: Michael Kelley

Date: Thu Jun 18 2026 - 12:05:47 EST


From: bibek.patro@xxxxxxxxxxxxxxxx <bibek.patro@xxxxxxxxxxxxxxxx> Sent: Tuesday, June 16, 2026 2:36 PM
>
> From: Jagadeesh Pagadala <jpagadal@xxxxxxxxxxxxxxxx>
>
> 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@xxxxxxxxxxxxxxxx>
> Signed-off-by: Bibek Kumar Patro <bibek.patro@xxxxxxxxxxxxxxxx>
> ---
> 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@xxxxxxxxxxxxxxxx>
>