(Finally figured out how to git send-email on this patch properly.) As reported earlier, when booted in UEFI mode, Grub would fail to load a ramdisk of size larger than "(total_pages >> 2)" with
"error: out of memory" (https://git.savannah.gnu.org/cgit/grub.git/tree/grub-core/kern/efi/mm.c#n616) Further investigation into the EFI memory map indicates the current limit of MAX_HEAP_MEMORY and the use of a quarter of the total_pages returned from EFI available memory (type 7) as the default seems arbitrary and unnecessary. Therefore this proposed patch removes the aribrary limit, and lets Grub make full use of the EFI available memory reported by the BIOS. The patch has been successfully tested to load large ramdisk with size that would otherwise fail. Regards, Hanson Signed-off-by: Hanson Char <hc...@amazon.com> --- grub-core/kern/efi/mm.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c index 457772d57..9cf6a4d34 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. */ +/* The minimum heap size for GRUB itself. */ #define MIN_HEAP_SIZE 0x100000 -#define MAX_HEAP_SIZE (1600 * 0x100000) static void *finish_mmap_buf = 0; static grub_efi_uintn_t finish_mmap_size = 0; @@ -569,7 +568,6 @@ 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; @@ -610,14 +608,10 @@ 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); + required_pages = get_total_pages (filtered_memory_map, desc_size, + filtered_memory_map_end); 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. */ -- 2.30.0 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel