grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2 2/4] efi: mm: Extract function to add memory regions


From: Daniel Kiper
Subject: Re: [PATCH v2 2/4] efi: mm: Extract function to add memory regions
Date: Mon, 9 Aug 2021 18:02:04 +0200
User-agent: NeoMutt/20170113 (1.7.2)

On Sun, Aug 08, 2021 at 03:31:45PM +0200, Patrick Steinhardt wrote:
> In preparation of support for runtime-allocating additional memory
> region, this patch extracts the function to retrieve the EFI memory map
> and add a subset of it to GRUB's own memory regions.
>
> Note that this commit also changes how many bytes we request by default.
> Previously, we would've tried to allocate a quarter of available system
> memory, bounded by a minimum/maximum value. As we're about to implement
> runtime allocation of memory, we now instead always request the minimum
> amount of bytes and let the memory allocator call out to our callback.

This change should go to separate patch.

> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
>  grub-core/kern/efi/mm.c | 57 ++++++++++++++---------------------------
>  1 file changed, 19 insertions(+), 38 deletions(-)
>
> diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c
> index 9838fb2f5..ec64c08c0 100644
> --- a/grub-core/kern/efi/mm.c
> +++ b/grub-core/kern/efi/mm.c
> @@ -38,9 +38,8 @@
>     a multiplier of 4KB.  */
>  #define MEMORY_MAP_SIZE      0x3000
>
> -/* The minimum and maximum heap size for GRUB itself.  */
> -#define MIN_HEAP_SIZE        0x100000
> -#define MAX_HEAP_SIZE        (1600 * 0x100000)
> +/* The default heap size for GRUB itself in bytes.  */
> +#define DEFAULT_HEAP_SIZE    0x100000
>
>  static void *finish_mmap_buf = 0;
>  static grub_efi_uintn_t finish_mmap_size = 0;
> @@ -478,23 +477,6 @@ filter_memory_map (grub_efi_memory_descriptor_t 
> *memory_map,
>    return filtered_desc;
>  }
>
> -/* Return the total number of pages.  */
> -static grub_efi_uint64_t
> -get_total_pages (grub_efi_memory_descriptor_t *memory_map,
> -              grub_efi_uintn_t desc_size,
> -              grub_efi_memory_descriptor_t *memory_map_end)
> -{
> -  grub_efi_memory_descriptor_t *desc;
> -  grub_efi_uint64_t total = 0;
> -
> -  for (desc = memory_map;
> -       desc < memory_map_end;
> -       desc = NEXT_MEMORY_DESCRIPTOR (desc, desc_size))
> -    total += desc->num_pages;
> -
> -  return total;
> -}
> -
>  /* Add memory regions.  */
>  static void
>  add_memory_regions (grub_efi_memory_descriptor_t *memory_map,
> @@ -522,7 +504,7 @@ add_memory_regions (grub_efi_memory_descriptor_t 
> *memory_map,
>
>        addr = grub_efi_allocate_pages_real (start, pages,
>                                          GRUB_EFI_ALLOCATE_ADDRESS,
> -                                        GRUB_EFI_LOADER_CODE);
> +                                        GRUB_EFI_LOADER_CODE);
>        if (! addr)
>       grub_fatal ("cannot allocate conventional memory %p with %u pages",
>                   (void *) ((grub_addr_t) start),
> @@ -574,8 +556,8 @@ print_memory_map (grub_efi_memory_descriptor_t 
> *memory_map,
>  }
>  #endif
>
> -void
> -grub_efi_mm_init (void)
> +static grub_err_t
> +grub_efi_mm_add_regions (grub_efi_uint64_t required_bytes)
>  {
>    grub_efi_memory_descriptor_t *memory_map;
>    grub_efi_memory_descriptor_t *memory_map_end;
> @@ -583,14 +565,12 @@ grub_efi_mm_init (void)
>    grub_efi_memory_descriptor_t *filtered_memory_map_end;
>    grub_efi_uintn_t map_size;
>    grub_efi_uintn_t desc_size;
> -  grub_efi_uint64_t total_pages;
> -  grub_efi_uint64_t required_pages;
>    int mm_status;
>
>    /* Prepare a memory region to store two memory maps.  */
>    memory_map = grub_efi_allocate_any_pages (2 * BYTES_TO_PAGES 
> (MEMORY_MAP_SIZE));
>    if (! memory_map)
> -    grub_fatal ("cannot allocate memory");
> +    return grub_error (GRUB_ERR_OUT_OF_MEMORY, "cannot allocate memory");
>
>    /* Obtain descriptors for available memory.  */
>    map_size = MEMORY_MAP_SIZE;
> @@ -608,14 +588,14 @@ grub_efi_mm_init (void)
>
>        memory_map = grub_efi_allocate_any_pages (2 * BYTES_TO_PAGES 
> (map_size));
>        if (! memory_map)
> -     grub_fatal ("cannot allocate memory");
> +     return grub_error (GRUB_ERR_OUT_OF_MEMORY, "cannot allocate memory");
>
>        mm_status = grub_efi_get_memory_map (&map_size, memory_map, 0,
>                                          &desc_size, 0);
>      }
>
>    if (mm_status < 0)
> -    grub_fatal ("cannot get memory map");
> +    return grub_error (GRUB_ERR_OUT_OF_MEMORY, "cannot get memory map");
>
>    memory_map_end = NEXT_MEMORY_DESCRIPTOR (memory_map, map_size);
>
> @@ -624,22 +604,14 @@ grub_efi_mm_init (void)
>    filtered_memory_map_end = filter_memory_map (memory_map, 
> filtered_memory_map,
>                                              desc_size, memory_map_end);
>
> -  /* By default, request a quarter of the available memory.  */
> -  total_pages = get_total_pages (filtered_memory_map, desc_size,
> -                              filtered_memory_map_end);
> -  required_pages = (total_pages >> 2);
> -  if (required_pages < BYTES_TO_PAGES (MIN_HEAP_SIZE))
> -    required_pages = BYTES_TO_PAGES (MIN_HEAP_SIZE);
> -  else if (required_pages > BYTES_TO_PAGES (MAX_HEAP_SIZE))
> -    required_pages = BYTES_TO_PAGES (MAX_HEAP_SIZE);
> -
>    /* Sort the filtered descriptors, so that GRUB can allocate pages
>       from smaller regions.  */
>    sort_memory_map (filtered_memory_map, desc_size, filtered_memory_map_end);
>
>    /* Allocate memory regions for GRUB's memory management.  */
>    add_memory_regions (filtered_memory_map, desc_size,
> -                   filtered_memory_map_end, required_pages);
> +                   filtered_memory_map_end,
> +                   BYTES_TO_PAGES (required_bytes));
>
>  #if 0
>    /* For debug.  */
> @@ -657,6 +629,15 @@ grub_efi_mm_init (void)
>    /* Release the memory maps.  */
>    grub_efi_free_pages ((grub_addr_t) memory_map,
>                      2 * BYTES_TO_PAGES (MEMORY_MAP_SIZE));
> +
> +  return GRUB_ERR_NONE;
> +}
> +
> +void
> +grub_efi_mm_init (void)
> +{
> +  if (grub_efi_mm_add_regions (DEFAULT_HEAP_SIZE) != GRUB_ERR_NONE)
> +    grub_fatal (grub_errmsg);

grub_fatal ("%s", grub_errmsg);

Daniel



reply via email to

[Prev in Thread] Current Thread [Next in Thread]