ed1787d
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
ed1787d
From: Patrick Steinhardt <ps@pks.im>
ed1787d
Date: Thu, 21 Apr 2022 15:24:19 +1000
ed1787d
Subject: [PATCH] kern/efi/mm: Always request a fixed number of pages on init
ed1787d
ed1787d
When initializing the EFI memory subsystem, we will by default request
ed1787d
a quarter of the available memory, bounded by a minimum/maximum value.
ed1787d
Given that we're about to extend the EFI memory system to dynamically
ed1787d
request additional pages from the firmware as required, this scaling of
ed1787d
requested memory based on available memory will not make a lot of sense
ed1787d
anymore.
ed1787d
ed1787d
Remove this logic as a preparatory patch such that we'll instead defer
ed1787d
to the runtime memory allocator. Note that ideally, we'd want to change
ed1787d
this after dynamic requesting of pages has been implemented for the EFI
ed1787d
platform. But because we'll need to split up initialization of the
ed1787d
memory subsystem and the request of pages from the firmware, we'd have
ed1787d
to duplicate quite some logic at first only to remove it afterwards
ed1787d
again. This seems quite pointless, so we instead have patches slightly
ed1787d
out of order.
ed1787d
ed1787d
Signed-off-by: Patrick Steinhardt <ps@pks.im>
ed1787d
Signed-off-by: Daniel Axtens <dja@axtens.net>
ed1787d
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
ed1787d
Tested-by: Patrick Steinhardt <ps@pks.im>
ed1787d
(cherry picked from commit 938c3760b8c0fca759140be48307179b50107ff6)
ed1787d
---
ed1787d
 grub-core/kern/efi/mm.c | 35 +++--------------------------------
ed1787d
 1 file changed, 3 insertions(+), 32 deletions(-)
ed1787d
ed1787d
diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c
ed1787d
index e460b072e6..782a1365a1 100644
ed1787d
--- a/grub-core/kern/efi/mm.c
ed1787d
+++ b/grub-core/kern/efi/mm.c
ed1787d
@@ -38,9 +38,8 @@
ed1787d
    a multiplier of 4KB.  */
ed1787d
 #define MEMORY_MAP_SIZE	0x3000
ed1787d
 
ed1787d
-/* The minimum and maximum heap size for GRUB itself.  */
ed1787d
-#define MIN_HEAP_SIZE	0x100000
ed1787d
-#define MAX_HEAP_SIZE	(1600 * 0x100000)
ed1787d
+/* The default heap size for GRUB itself in bytes.  */
ed1787d
+#define DEFAULT_HEAP_SIZE	0x100000
ed1787d
 
ed1787d
 static void *finish_mmap_buf = 0;
ed1787d
 static grub_efi_uintn_t finish_mmap_size = 0;
ed1787d
@@ -514,23 +513,6 @@ filter_memory_map (grub_efi_memory_descriptor_t *memory_map,
ed1787d
   return filtered_desc;
ed1787d
 }
ed1787d
 
ed1787d
-/* Return the total number of pages.  */
ed1787d
-static grub_efi_uint64_t
ed1787d
-get_total_pages (grub_efi_memory_descriptor_t *memory_map,
ed1787d
-		 grub_efi_uintn_t desc_size,
ed1787d
-		 grub_efi_memory_descriptor_t *memory_map_end)
ed1787d
-{
ed1787d
-  grub_efi_memory_descriptor_t *desc;
ed1787d
-  grub_efi_uint64_t total = 0;
ed1787d
-
ed1787d
-  for (desc = memory_map;
ed1787d
-       desc < memory_map_end;
ed1787d
-       desc = NEXT_MEMORY_DESCRIPTOR (desc, desc_size))
ed1787d
-    total += desc->num_pages;
ed1787d
-
ed1787d
-  return total;
ed1787d
-}
ed1787d
-
ed1787d
 /* Add memory regions.  */
ed1787d
 static void
ed1787d
 add_memory_regions (grub_efi_memory_descriptor_t *memory_map,
ed1787d
@@ -694,8 +676,6 @@ grub_efi_mm_init (void)
ed1787d
   grub_efi_memory_descriptor_t *filtered_memory_map_end;
ed1787d
   grub_efi_uintn_t map_size;
ed1787d
   grub_efi_uintn_t desc_size;
ed1787d
-  grub_efi_uint64_t total_pages;
ed1787d
-  grub_efi_uint64_t required_pages;
ed1787d
   int mm_status;
ed1787d
 
ed1787d
   grub_nx_init ();
ed1787d
@@ -737,22 +717,13 @@ grub_efi_mm_init (void)
ed1787d
   filtered_memory_map_end = filter_memory_map (memory_map, filtered_memory_map,
ed1787d
 					       desc_size, memory_map_end);
ed1787d
 
ed1787d
-  /* By default, request a quarter of the available memory.  */
ed1787d
-  total_pages = get_total_pages (filtered_memory_map, desc_size,
ed1787d
-				 filtered_memory_map_end);
ed1787d
-  required_pages = (total_pages >> 2);
ed1787d
-  if (required_pages < BYTES_TO_PAGES (MIN_HEAP_SIZE))
ed1787d
-    required_pages = BYTES_TO_PAGES (MIN_HEAP_SIZE);
ed1787d
-  else if (required_pages > BYTES_TO_PAGES (MAX_HEAP_SIZE))
ed1787d
-    required_pages = BYTES_TO_PAGES (MAX_HEAP_SIZE);
ed1787d
-
ed1787d
   /* Sort the filtered descriptors, so that GRUB can allocate pages
ed1787d
      from smaller regions.  */
ed1787d
   sort_memory_map (filtered_memory_map, desc_size, filtered_memory_map_end);
ed1787d
 
ed1787d
   /* Allocate memory regions for GRUB's memory management.  */
ed1787d
   add_memory_regions (filtered_memory_map, desc_size,
ed1787d
-		      filtered_memory_map_end, required_pages);
ed1787d
+		      filtered_memory_map_end, BYTES_TO_PAGES (DEFAULT_HEAP_SIZE));
ed1787d
 
ed1787d
 #if 0
ed1787d
   /* For debug.  */