Message ID | 1424774311-23726-5-git-send-email-p.marczak@samsung.com |
---|---|
State | Superseded |
Headers | show |
Hi Przemyslaw, > This commit introduces new config: CONFIG_SYS_MALLOC_CLEAR_ON_INIT. > > 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@samsung.com> > Reviewed-by: Simon Glass <sjg@chromium.org> > > --- > Changes v3: > - squash the commit with the Kconfig option > > Changes v4: > - adjust commit message for the new config > > Changes v5: > - change config name to CONFIG_SYS_MALLOC_CLEAR_ON_INIT > --- > Kconfig | 32 +++++++++++++++++++++++++------- > common/dlmalloc.c | 10 +++++++--- > 2 files changed, 32 insertions(+), 10 deletions(-) > > diff --git a/Kconfig b/Kconfig > index 75bab7f..d6c75d5 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_CLEAR_ON_INIT > + 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..b2ce063 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_CLEAR_ON_INIT > + 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_CLEAR_ON_INIT > #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_CLEAR_ON_INIT > #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; Acked-by: Lukasz Majewski <l.majewski@samsung.com>
diff --git a/Kconfig b/Kconfig index 75bab7f..d6c75d5 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_CLEAR_ON_INIT + 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..b2ce063 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_CLEAR_ON_INIT + 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_CLEAR_ON_INIT #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_CLEAR_ON_INIT #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;