[PATCH] lib: fwts_acpi_tables: speed up table loading on 64 bit systems

IvanHu ivan.hu at canonical.com
Mon Jan 14 09:50:22 UTC 2013


On 01/05/2013 01:12 AM, Colin King wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> When loading tables from an apcidump fwts_acpi_load_table_from_acpidump()
> will load in 16 byte chunks at a time and re-allocate the buffer each
> time using the low 32 bit memory allocator. This allocator is really slow on
> 64 bit systems that don't support MAP_32BIT and generally far slower
> than malloc on systems that do support MAP_32BIT.  So, instead, use plain
> old realloc() to read in the table, and use the low 32 bit allocator for
> the table once we know how big it is.
>
> This noticeably speeds up table loads when testing against my database
> of known problematic ACPI tables.
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
>   src/lib/src/fwts_acpi_tables.c | 16 ++++++++++++----
>   1 file changed, 12 insertions(+), 4 deletions(-)
>
> diff --git a/src/lib/src/fwts_acpi_tables.c b/src/lib/src/fwts_acpi_tables.c
> index 876a6f5..b23efa7 100644
> --- a/src/lib/src/fwts_acpi_tables.c
> +++ b/src/lib/src/fwts_acpi_tables.c
> @@ -327,7 +327,8 @@ static uint8_t *fwts_acpi_load_table_from_acpidump(FILE *fp, char *name, uint64_
>   	uint32_t offset;
>   	uint8_t  data[16];
>   	char buffer[128];
> -	uint8_t *table = NULL;
> +	uint8_t *table;
> +	uint8_t *tmp = NULL;
>   	char *ptr = buffer;
>   	size_t len = 0;
>   	unsigned long long table_addr;
> @@ -381,12 +382,19 @@ static uint8_t *fwts_acpi_load_table_from_acpidump(FILE *fp, char *name, uint64_
>   			break;
>
>   		len += (n - 1);
> -		table = fwts_low_realloc(table, len);
> -		if (table == NULL)
> +		if ((tmp = realloc(tmp, len)) == NULL)
>   			return NULL;
> -		memcpy(table + offset, data, n-1);
> +		memcpy(tmp + offset, data, n-1);
>   	}
>
> +	/* Allocate the table using low 32 bit memory */
> +	if ((table = fwts_low_malloc(len)) == NULL) {
> +		free(tmp);
> +		return NULL;
> +	}
> +	memcpy(table, tmp, len);
> +	free(tmp);
> +
>   	if (table_addr == 0)
>   		table_addr = fwts_fake_physical_addr(len);
>
>

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



More information about the fwts-devel mailing list