[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