[U-Boot] [PATCH 1/2] bouncebuf: Add static buffer allocation method for SPL.

Marek Vasut marex at denx.de
Tue May 7 13:06:35 UTC 2019


On 5/7/19 11:09 AM, Christoph Muellner wrote:
> If we are using malloc-simple, we get into the problem, that
> calls to free() won't free any memory. When using bouncebuf
> in SPL with malloc-simple this means, that every allocated buffer
> is lost. This can quickly consume the whole heap.

When does such a scenario happen ?

> This patch addresses this memory wasting by introducing a static
> allocated memory location, which is used instead of dynamically
> allocated buffers.
> 
> Signed-off-by: Christoph Muellner <christoph.muellner at theobroma-systems.com>
> ---
> 
>  common/Kconfig     | 15 +++++++++++++++
>  common/bouncebuf.c | 14 ++++++++++++++
>  2 files changed, 29 insertions(+)
> 
> diff --git a/common/Kconfig b/common/Kconfig
> index 1a1951f874..5fbca1e61a 100644
> --- a/common/Kconfig
> +++ b/common/Kconfig
> @@ -702,6 +702,21 @@ config BOUNCE_BUFFER
>  	  A second possible use of bounce buffers is their ability to
>  	  provide aligned buffers for DMA operations.
>  
> +config SPL_BOUNCE_BUFFER_STATIC
> +	bool "Static bounce buffer in SPL"
> +	depends on SPL && BOUNCE_BUFFER
> +	default n
> +	help
> +	  This option uses a static allocated memory area as
> +	  bounce buffer (i.e. no dynamic allocation).
> +
> +config SPL_BOUNCE_BUFFER_STATIC_SIZE
> +	hex "Size of static bounce buffer in SPL"
> +	depends on SPL_BOUNCE_BUFFER_STATIC
> +	default 0x2800
> +	help
> +	  Size of the static allocated bounce buffer.
> +
>  config BOARD_TYPES
>  	bool "Call get_board_type() to get and display the board type"
>  	help
> diff --git a/common/bouncebuf.c b/common/bouncebuf.c
> index a7098e2caf..92ee10fb93 100644
> --- a/common/bouncebuf.c
> +++ b/common/bouncebuf.c
> @@ -10,6 +10,11 @@
>  #include <errno.h>
>  #include <bouncebuf.h>
>  
> +#if CONFIG_IS_ENABLED(BOUNCE_BUFFER_STATIC)
> +static u8 static_bb[CONFIG_VAL(BOUNCE_BUFFER_STATIC_SIZE)];
> +static const size_t static_bb_size = CONFIG_VAL(BOUNCE_BUFFER_STATIC_SIZE);
> +#endif
> +
>  static int addr_aligned(struct bounce_buffer *state)
>  {
>  	const ulong align_mask = ARCH_DMA_MINALIGN - 1;
> @@ -40,10 +45,19 @@ int bounce_buffer_start(struct bounce_buffer *state, void *data,
>  	state->flags = flags;
>  
>  	if (!addr_aligned(state)) {
> +#if CONFIG_IS_ENABLED(BOUNCE_BUFFER_STATIC)
> +		if (state->len_aligned > static_bb_size) {
> +			debug("Static allocated bounce buffer too small.\n");
> +			return -ENOMEM;
> +		}
> +
> +		state->bounce_buffer = static_bb;
> +#else
>  		state->bounce_buffer = memalign(ARCH_DMA_MINALIGN,
>  						state->len_aligned);
>  		if (!state->bounce_buffer)
>  			return -ENOMEM;
> +#endif
>  
>  		if (state->flags & GEN_BB_READ)
>  			memcpy(state->bounce_buffer, state->user_buffer,
> 


-- 
Best regards,
Marek Vasut


More information about the U-Boot mailing list