[U-Boot] [PATCH v4 4/6] dlmalloc: do memset in malloc init as new default config

Simon Glass sjg at chromium.org
Mon Feb 23 18:38:48 CET 2015


Hi Przemyslaw,

On 23 February 2015 at 10:16, Przemyslaw Marczak <p.marczak at samsung.com> wrote:
> This commit introduces new config: CONFIG_SYS_MALLOC_INIT_DO_ZEROING.
>

Minor nit: CONFIG_SYS_MALLOC_CLEAR_ON_INIT might be better.

> This config is an expert option and is enabled by default.
>
> The all amount of memory reserved for the malloc, is by default set
> to zero in mem_malloc_init(). When the malloc reserved memory exceeds
> few MiB, then the boot process can slow down.
>
> So disabling this config, is an expert option to reduce the boot time,
> and can be disabled by Kconfig.
>
> Note:
> After disable this option, only calloc() will return the pointer
> to the zeroed memory area. Previously, without this option,
> the memory pointed to untouched malloc memory region, was filled
> with zeros. So it means, that code with malloc() calls should
> be reexamined.
>
> Signed-off-by: Przemyslaw Marczak <p.marczak at samsung.com>
>

Reviewed-by: Simon Glass <sjg at chromium.org>

> ---
> Changes v3:
> - squash the commit with the Kconfig option
>
> Changes v4:
> - adjust commit message for the new config
> ---
>  Kconfig           | 32 +++++++++++++++++++++++++-------
>  common/dlmalloc.c | 10 +++++++---
>  2 files changed, 32 insertions(+), 10 deletions(-)
>
> diff --git a/Kconfig b/Kconfig
> index 75bab7f..9ea99b5 100644
> --- a/Kconfig
> +++ b/Kconfig
> @@ -76,13 +76,31 @@ config SYS_MALLOC_F_LEN
>           initial serial device and any others that are needed.
>
>  menuconfig EXPERT
> -        bool "Configure standard U-Boot features (expert users)"
> -        help
> -          This option allows certain base U-Boot options and settings
> -          to be disabled or tweaked. This is for specialized
> -          environments which can tolerate a "non-standard" U-Boot.
> -          Only use this if you really know what you are doing.
> -
> +       bool "Configure standard U-Boot features (expert users)"
> +       default y
> +       help
> +         This option allows certain base U-Boot options and settings
> +         to be disabled or tweaked. This is for specialized
> +         environments which can tolerate a "non-standard" U-Boot.
> +         Only use this if you really know what you are doing.
> +
> +if EXPERT
> +       config SYS_MALLOC_INIT_DO_ZEROING
> +       bool "Init with zeros the memory reserved for malloc (slow)"
> +       default y
> +       help
> +         This setting is enabled by default. The reserved malloc
> +         memory is initialized with zeros, so first malloc calls
> +         will return the pointer to the zeroed memory. But this
> +         slows the boot time.
> +
> +         It is recommended to disable it, when CONFIG_SYS_MALLOC_LEN
> +         value, has more than few MiB, e.g. when uses bzip2 or bmp logo.
> +         Then the boot time can be significantly reduced.
> +         Warning:
> +         When disabling this, please check if malloc calls, maybe
> +         should be replaced by calloc - if expects zeroed memory.
> +endif
>  endmenu                # General setup
>
>  menu "Boot images"
> diff --git a/common/dlmalloc.c b/common/dlmalloc.c
> index 6453ee9..21e103b 100644
> --- a/common/dlmalloc.c
> +++ b/common/dlmalloc.c
> @@ -1535,9 +1535,9 @@ void mem_malloc_init(ulong start, ulong size)
>
>         debug("using memory %#lx-%#lx for malloc()\n", mem_malloc_start,
>               mem_malloc_end);
> -
> -       memset((void *)mem_malloc_start, 0, size);
> -
> +#ifdef CONFIG_SYS_MALLOC_INIT_DO_ZEROING
> +       memset((void *)mem_malloc_start, 0x0, size);
> +#endif
>         malloc_bin_reloc();
>  }
>
> @@ -2948,10 +2948,12 @@ Void_t* cALLOc(n, elem_size) size_t n; size_t elem_size;
>
>
>    /* check if expand_top called, in which case don't need to clear */
> +#ifdef CONFIG_SYS_MALLOC_INIT_DO_ZEROING
>  #if MORECORE_CLEARS
>    mchunkptr oldtop = top;
>    INTERNAL_SIZE_T oldtopsize = chunksize(top);
>  #endif
> +#endif
>    Void_t* mem = mALLOc (sz);
>
>    if ((long)n < 0) return NULL;
> @@ -2977,6 +2979,7 @@ Void_t* cALLOc(n, elem_size) size_t n; size_t elem_size;
>
>      csz = chunksize(p);
>
> +#ifdef CONFIG_SYS_MALLOC_INIT_DO_ZEROING
>  #if MORECORE_CLEARS
>      if (p == oldtop && csz > oldtopsize)
>      {
> @@ -2984,6 +2987,7 @@ Void_t* cALLOc(n, elem_size) size_t n; size_t elem_size;
>        csz = oldtopsize;
>      }
>  #endif
> +#endif
>
>      MALLOC_ZERO(mem, csz - SIZE_SZ);
>      return mem;
> --
> 1.9.1
>


More information about the U-Boot mailing list