[U-Boot] [PATCH] malloc_simple: Add simple malloc free function

Marek Vasut marex at denx.de
Wed Aug 3 08:58:21 CEST 2016


On 08/03/2016 05:24 AM, Chin Liang See wrote:
> Enable a simple malloc implementation which will minimize
> memory usage prior relocation. This is essential as memory
> available prior location is internal memory and limited in
> size.
> 
> This implementation will stored last 2 usage of malloc. When
> free is invoked and the free address matched, we shall revert
> to previous value of gd->malloc_ptr that we stored.

This looks unnecessarily convoluted and fragile design.
What problem do you observe and on what platform ?

> Signed-off-by: Chin Liang See <clsee at altera.com>
> Cc: Marek Vasut <marex at denx.de>
> Cc: Simon Glass <sjg at chromium.org>
> Cc: Tom Rini <trini at konsulko.com>
> Cc: Dinh Nguyen <dinguyen at opensource.altera.com>
> Cc: Tien Fong Chee <tfchee at altera.com>
> ---
>  common/dlmalloc.c                 |  6 ++++--
>  common/malloc_simple.c            | 34 ++++++++++++++++++++++++++++++++++
>  include/asm-generic/global_data.h |  2 ++
>  include/malloc.h                  |  3 ++-
>  4 files changed, 42 insertions(+), 3 deletions(-)
> 
> diff --git a/common/dlmalloc.c b/common/dlmalloc.c
> index adc680e..ba42d0d 100644
> --- a/common/dlmalloc.c
> +++ b/common/dlmalloc.c
> @@ -1523,9 +1523,11 @@ void fREe(mem) Void_t* mem;
>    int       islr;      /* track whether merging with last_remainder */
>  
>  #ifdef CONFIG_SYS_MALLOC_F_LEN
> -	/* free() is a no-op - all the memory will be freed on relocation */
> -	if (!(gd->flags & GD_FLG_FULL_MALLOC_INIT))
> +	/* Invoke free_simple. All the memory will be freed on relocation */
> +	if (!(gd->flags & GD_FLG_FULL_MALLOC_INIT)) {
> +		free_simple(mem);
>  		return;
> +	}
>  #endif
>  
>    if (mem == NULL)                              /* free(0) has no effect */
> diff --git a/common/malloc_simple.c b/common/malloc_simple.c
> index 0f6bcbc..383a546 100644
> --- a/common/malloc_simple.c
> +++ b/common/malloc_simple.c
> @@ -26,6 +26,18 @@ void *malloc_simple(size_t bytes)
>  		return NULL;
>  	}
>  	ptr = map_sysmem(gd->malloc_base + gd->malloc_ptr, bytes);
> +
> +	/* implement a simple free mechanism which stored last 2 usage */
> +	if (gd->malloc_free_addr[0] != 0) {
> +		/* shifting as we are storing depth of 2 */
> +		gd->malloc_free_addr[1] = gd->malloc_free_addr[0];
> +		gd->malloc_free_ptr[1] = gd->malloc_free_ptr[0];
> +	}
> +	/* saving last malloc address for malloc free */
> +	gd->malloc_free_addr[0] = ptr;
> +	/* saving last malloc_ptr prior allocation for malloc free */
> +	gd->malloc_free_ptr[0] = gd->malloc_ptr;
> +
>  	gd->malloc_ptr = ALIGN(new_ptr, sizeof(new_ptr));
>  	debug("%lx\n", (ulong)ptr);
>  
> @@ -42,6 +54,18 @@ void *memalign_simple(size_t align, size_t bytes)
>  	if (new_ptr > gd->malloc_limit)
>  		return NULL;
>  	ptr = map_sysmem(addr, bytes);
> +
> +	/* implement a simple free mechanism which stored last 2 usage */
> +	if (gd->malloc_free_addr[0] != 0) {
> +		/* shifting as we are storing depth of 2 */
> +		gd->malloc_free_addr[1] = gd->malloc_free_addr[0];
> +		gd->malloc_free_ptr[1] = gd->malloc_free_ptr[0];
> +	}
> +	/* saving last malloc address for malloc free */
> +	gd->malloc_free_addr[0] = ptr;
> +	/* saving last malloc_ptr prior allocation for malloc free */
> +	gd->malloc_free_ptr[0] = gd->malloc_ptr;
> +
>  	gd->malloc_ptr = ALIGN(new_ptr, sizeof(new_ptr));
>  
>  	return ptr;
> @@ -59,3 +83,13 @@ void *calloc(size_t nmemb, size_t elem_size)
>  	return ptr;
>  }
>  #endif
> +
> +void free_simple(Void_t* mem)
> +{
> +	if (mem == gd->malloc_free_addr[0]) {
> +		gd->malloc_ptr = gd->malloc_free_ptr[0];
> +		/* shifting as we are storing depth of 2 */
> +		gd->malloc_free_addr[0] = gd->malloc_free_addr[1];
> +		gd->malloc_free_ptr[0] = gd->malloc_free_ptr[1];
> +	}
> +}
> diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h
> index a6d1d2a..9380772 100644
> --- a/include/asm-generic/global_data.h
> +++ b/include/asm-generic/global_data.h
> @@ -90,6 +90,8 @@ typedef struct global_data {
>  	unsigned long malloc_base;	/* base address of early malloc() */
>  	unsigned long malloc_limit;	/* limit address */
>  	unsigned long malloc_ptr;	/* current address */
> +	void *malloc_free_addr[2];	/* Last malloc pointer address*/
> +	unsigned long malloc_free_ptr[2];	/* Last malloc_ptr */
>  #endif
>  #ifdef CONFIG_PCI
>  	struct pci_controller *hose;	/* PCI hose for early use */
> diff --git a/include/malloc.h b/include/malloc.h
> index 8175c75..02651aa 100644
> --- a/include/malloc.h
> +++ b/include/malloc.h
> @@ -876,7 +876,7 @@ extern Void_t*     sbrk();
>  #define malloc malloc_simple
>  #define realloc realloc_simple
>  #define memalign memalign_simple
> -static inline void free(void *ptr) {}
> +#define free free_simple
>  void *calloc(size_t nmemb, size_t size);
>  void *memalign_simple(size_t alignment, size_t bytes);
>  void *realloc_simple(void *ptr, size_t size);
> @@ -913,6 +913,7 @@ int initf_malloc(void);
>  
>  /* Simple versions which can be used when space is tight */
>  void *malloc_simple(size_t size);
> +void free_simple(Void_t* mem);
>  
>  #pragma GCC visibility push(hidden)
>  # if __STD_C
> 


-- 
Best regards,
Marek Vasut


More information about the U-Boot mailing list