[U-Boot] [PATCH v1 13/15] efi_loader: make pool allocations cacheline aligned

Heinrich Schuchardt xypron.glpk at gmx.de
Fri Aug 11 19:04:18 UTC 2017


On 08/10/2017 08:29 PM, Rob Clark wrote:
> This avoids printf() spam about file reads (such as loading an image)
> into unaligned buffers (and the associated memcpy()).  And generally
> seems like a good idea.
> 
> Signed-off-by: Rob Clark <robdclark at gmail.com>
> ---
>  lib/efi_loader/efi_memory.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c
> index 9e079f1fa3..2ba8d8b42b 100644
> --- a/lib/efi_loader/efi_memory.c
> +++ b/lib/efi_loader/efi_memory.c
> @@ -43,7 +43,7 @@ void *efi_bounce_buffer;
>   */
>  struct efi_pool_allocation {
>  	u64 num_pages;
> -	char data[];
> +	char data[] __attribute__((aligned(ARCH_DMA_MINALIGN)));
>  };
>  
>  /*
> @@ -356,7 +356,8 @@ efi_status_t efi_allocate_pool(int pool_type, unsigned long size,
>  {
>  	efi_status_t r;
>  	efi_physical_addr_t t;
> -	u64 num_pages = (size + sizeof(u64) + EFI_PAGE_MASK) >> EFI_PAGE_SHIFT;
> +	u64 num_pages = DIV_ROUND_UP(size + sizeof(struct efi_pool_allocation),
> +				     EFI_PAGE_SIZE);
>  
>  	if (size == 0) {
>  		*buffer = NULL;
> 

All other divisions by EFI_PAGE_SIZE are consistently handled in the
same way:

lib/efi_loader/efi_runtime.c:328:u64 pages = (len + EFI_PAGE_SIZE - 1)
>> EFI_PAGE_SHIFT;
lib/efi_loader/efi_memory.c:123:
     >> EFI_PAGE_SHIFT;
lib/efi_loader/efi_memory.c:126:                return (carve_end -
carve_start) >> EFI_PAGE_SHIFT;
lib/efi_loader/efi_memory.c:140:        newmap->desc.num_pages =
(map_end - carve_start) >> EFI_PAGE_SHIFT;
lib/efi_loader/efi_memory.c:145:        map_desc->num_pages =
(carve_start - map_start) >> EFI_PAGE_SHIFT;
lib/efi_loader/efi_memory.c:331:        uint64_t pages = (len +
EFI_PAGE_MASK) >> EFI_PAGE_SHIFT;
lib/efi_loader/efi_memory.c:359:        u64 num_pages = (size +
sizeof(u64) + EFI_PAGE_MASK) >> EFI_PAGE_SHIFT;
lib/efi_loader/efi_memory.c:448:                u64 pages = (ram_size +
EFI_PAGE_MASK) >> EFI_PAGE_SHIFT;
lib/efi_loader/efi_memory.c:465:        uboot_pages = (gd->ram_top -
uboot_start) >> EFI_PAGE_SHIFT;
lib/efi_loader/efi_memory.c:472:        runtime_pages = (runtime_end -
runtime_start) >> EFI_PAGE_SHIFT;
lib/efi_loader/efi_memory.c:481:                               (64 *
1024 * 1024) >> EFI_PAGE_SHIFT,
lib/efi_loader/efi_image_loader.c:34:                   int type =
*relocs >> EFI_PAGE_SHIFT;
lib/efi_loader/efi_image_loader.c:170:
(virt_size + EFI_PAGE_MASK) >> EFI_PAGE_SHIFT);
arch/arm/cpu/armv8/fsl-layerscape/cpu.c:814:            pages =
(ram_size + EFI_PAGE_MASK) >> EFI_PAGE_SHIFT;
arch/arm/cpu/armv8/fsl-layerscape/fdt.c:112:
ALIGN(*boot_code_size, EFI_PAGE_SIZE) >> EFI_PAGE_SHIFT,
cmd/bootefi.c:162:      fdt_pages = fdt_size >> EFI_PAGE_SHIFT;
cmd/bootefi.c:243:              fdt_pages = fdt_size >> EFI_PAGE_SHIFT;

With you patch we are even inconsistent within the same .c-file.

Regards

Heinrich


More information about the U-Boot mailing list