ACK: [PATCH] fwts-alloc: garbage collect hash records

ivanhu ivan.hu at canonical.com
Wed Feb 8 04:32:32 UTC 2017


On 2017年02月03日 01:02, Colin King wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> The hash table that tracks low memory allocations does not
> automatically free records when they are not used (instead
> it marks them as re-usable which is faster).  This patch
> adds garbage collection to the hash table when the number
> of free'd items drops down to zero. This lazy deferral
> allows us to efficiently reap the hash when it is no longer
> in use.
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
>  src/lib/src/fwts_alloc.c | 29 +++++++++++++++++++++++++++++
>  1 file changed, 29 insertions(+)
>
> diff --git a/src/lib/src/fwts_alloc.c b/src/lib/src/fwts_alloc.c
> index 1901a53..2e9b60b 100644
> --- a/src/lib/src/fwts_alloc.c
> +++ b/src/lib/src/fwts_alloc.c
> @@ -39,6 +39,7 @@ typedef struct hash_alloc {
>  } hash_alloc_t;
>
>  static hash_alloc_t *hash_allocs[HASH_ALLOC_SIZE];
> +static int hash_count;
>
>  /*
>   *  hash_addr()
> @@ -87,6 +88,7 @@ static bool hash_alloc_add(void *addr)
>  	new->addr = addr;
>  	new->next = hash_allocs[h];
>  	hash_allocs[h] = new;
> +	hash_count++;
>
>  	return true;
>  }
> @@ -104,6 +106,7 @@ static bool hash_alloc_remove(const void *addr)
>  	while (ha) {
>  		if (ha->addr == addr) {
>  			/* Just nullify it */
> +			hash_count--;
>  			ha->addr = NULL;
>  			return true;
>  		}
> @@ -113,6 +116,30 @@ static bool hash_alloc_remove(const void *addr)
>  }
>
>  /*
> + *  hash_alloc_garbage_collect()
> + *	free all hash records when the hash
> + *	is empty.
> + */
> +static void hash_alloc_garbage_collect(void)
> +{
> +	size_t i;
> +
> +	if (hash_count)
> +		return;
> +
> +	for (i = 0; i < HASH_ALLOC_SIZE; i++) {
> +		hash_alloc_t *ha = hash_allocs[i];
> +
> +		while (ha) {
> +			hash_alloc_t *next = ha->next;
> +
> +			free(ha);
> +			ha = next;
> +		}
> +	}
> +}
> +
> +/*
>   * We implement a low memory allocator to allow us to allocate
>   * memory < 2G limit for the ACPICA table handling.  On 64 bit
>   * machines we have to ensure that cached copies of ACPI tables
> @@ -406,4 +433,6 @@ void fwts_low_free(const void *ptr)
>  	/* Be doubly sure by checking magic before we munmap */
>  	if (hdr->magic == FWTS_ALLOC_MAGIC)
>  		munmap(hdr, hdr->size);
> +
> +	hash_alloc_garbage_collect();
>  }
>

Acked-by: Ivan Hu <ivan.hu at canonical.com>



More information about the fwts-devel mailing list