public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Tom Rini <trini@konsulko.com>
To: u-boot@lists.denx.de
Subject: [PATCH] dlmalloc: Add an option to default malloc to init
Date: Fri, 20 Mar 2020 14:27:11 -0400	[thread overview]
Message-ID: <20200320182711.GF5793@bill-the-cat> (raw)
In-Reply-To: <20200318121443.14064-1-marek.bykowski@gmail.com>

On Wed, Mar 18, 2020 at 01:14:43PM +0100, marek.bykowski at gmail.com wrote:

> From: Marek Bykowski <marek.bykowski@gmail.com>
> 
> If a system wants the malloc to get moved around from one to another
> memory range it should call mem_malloc_init() with the updated memory
> ranges. However setting aside the new memory alone isn't enough.
> It should also bring the bins and static bookkeeping data to init.
> 
> One of the use cases could be SPL U-Boot that allocates first to
> the (limited) static memory and then when needs more memory, and
> the DDR memory becomes available, moves the pools around.
> 
> Note that defaulting the malloc to init discards all the memory
> previously allocated.
> 
> Signed-off-by: Marek Bykowski <marek.bykowski@gmail.com>
> ---
>  Kconfig           | 14 ++++++++++++++
>  common/dlmalloc.c | 41 ++++++++++++++++++++++++++++++++++++++---
>  2 files changed, 52 insertions(+), 3 deletions(-)
> 
> diff --git a/Kconfig b/Kconfig
> index 1f0904f704..958553c90a 100644
> --- a/Kconfig
> +++ b/Kconfig
> @@ -209,6 +209,20 @@ if EXPERT
>  	  When disabling this, please check if malloc calls, maybe
>  	  should be replaced by calloc - if one expects zeroed memory.
>  
> +config SYS_MALLOC_DEFAULT_TO_INIT
> +	bool "Default malloc to init while reserving the memory for it"
> +	default n
> +	help
> +	  It may happen that one needs to move the dynamic allocation
> +	  from one to another memory range, eg. when moving the malloc
> +	  from the limited static to a potentially large dynamic (DDR)
> +	  memory.
> +
> +	  If so then on top of setting the updated memory aside one
> +	  needs to bring the malloc init.
> +
> +	  If such a scenario is sought choose yes.
> +
>  config TOOLS_DEBUG
>  	bool "Enable debug information for tools"
>  	help
> diff --git a/common/dlmalloc.c b/common/dlmalloc.c
> index 6f12a18d54..8b2796e280 100644
> --- a/common/dlmalloc.c
> +++ b/common/dlmalloc.c
> @@ -280,6 +280,7 @@ nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
>  	    |             Unused space (may be 0 bytes long)                .
>  	    .                                                               .
>  	    .                                                               |
> +
>  nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
>      `foot:' |             Size of chunk, in bytes                           |
>  	    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
> @@ -574,6 +575,10 @@ static void malloc_bin_reloc(void)
>  static inline void malloc_bin_reloc(void) {}
>  #endif
>  
> +#ifdef CONFIG_SYS_MALLOC_DEFAULT_TO_INIT
> +static void malloc_init(void);
> +#endif
> +
>  ulong mem_malloc_start = 0;
>  ulong mem_malloc_end = 0;
>  ulong mem_malloc_brk = 0;
> @@ -604,6 +609,10 @@ void mem_malloc_init(ulong start, ulong size)
>  	mem_malloc_end = start + size;
>  	mem_malloc_brk = start;
>  
> +#ifdef CONFIG_SYS_MALLOC_DEFAULT_TO_INIT
> +	malloc_init();
> +#endif
> +
>  	debug("using memory %#lx-%#lx for malloc()\n", mem_malloc_start,
>  	      mem_malloc_end);
>  #ifdef CONFIG_SYS_MALLOC_CLEAR_ON_INIT
> @@ -708,7 +717,36 @@ static unsigned int max_n_mmaps = 0;
>  static unsigned long max_mmapped_mem = 0;
>  #endif
>  
> +#ifdef CONFIG_SYS_MALLOC_DEFAULT_TO_INIT
> +static void malloc_init(void)
> +{
> +	int i, j;
> +
> +	debug("bins (av_ array) are at %p\n", (void *)av_);
> +
> +	av_[0] = NULL; av_[1] = NULL;
> +	for (i = 2, j = 2; i < NAV * 2 + 2; i += 2, j++) {
> +		av_[i] = bin_at(j - 2);
> +		av_[i + 1] = bin_at(j - 2);
> +
> +		/* Just print the first few bins so that
> +		 * we can see there are alright.
> +		 */
> +		if (i < 10)
> +			debug("av_[%d]=%lx av_[%d]=%lx\n",
> +			      i, (ulong)av_[i],
> +			      i + 1, (ulong)av_[i + 1]);
> +	}
>  
> +	/* Init the static bookkeeping as well */
> +	sbrk_base = (char *)(-1);
> +	max_sbrked_mem = 0;
> +	max_total_mem = 0;
> +#ifdef DEBUG
> +	memset((void *)&current_mallinfo, 0, sizeof(struct mallinfo));
> +#endif
> +}
> +#endif
>  
>  /*
>    Debugging support

Can you please showcase using this feature somewhere?  Thanks!

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 659 bytes
Desc: not available
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20200320/30db8978/attachment.sig>

  reply	other threads:[~2020-03-20 18:27 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-18 12:14 [PATCH] dlmalloc: Add an option to default malloc to init marek.bykowski at gmail.com
2020-03-20 18:27 ` Tom Rini [this message]
2020-04-21  0:21   ` Marek
2020-04-21 10:54     ` Marek
2020-04-21 11:00   ` Marek
2020-04-24 17:27     ` Tom Rini
2020-04-24 23:19       ` Marek Bykowski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200320182711.GF5793@bill-the-cat \
    --to=trini@konsulko.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox