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 <[email protected]>
> ---
> 
>  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
_______________________________________________
U-Boot mailing list
[email protected]
https://lists.denx.de/listinfo/u-boot

Reply via email to