kern/efi/mm: Always request a fixed number of pages on init

When initializing the EFI memory subsystem, we will by default request
a quarter of the available memory, bounded by a minimum/maximum value.
Given that we're about to extend the EFI memory system to dynamically
request additional pages from the firmware as required, this scaling of
requested memory based on available memory will not make a lot of sense
anymore.

Remove this logic as a preparatory patch such that we'll instead defer
to the runtime memory allocator. Note that ideally, we'd want to change
this after dynamic requesting of pages has been implemented for the EFI
platform. But because we'll need to split up initialization of the
memory subsystem and the request of pages from the firmware, we'd have
to duplicate quite some logic at first only to remove it afterwards
again. This seems quite pointless, so we instead have patches slightly
out of order.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Daniel Axtens <dja@axtens.net>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
Tested-by: Patrick Steinhardt <ps@pks.im>
This commit is contained in:
Patrick Steinhardt authored and Daniel Kiper committed 2022-07-04 14:25:41 +02:00
1 parent 887f98f0db
commit 938c3760b8
1 file changed
+3 -32
+3 -32
View File
@@ -38,9 +38,8 @@
a multiplier of 4KB. */ a multiplier of 4KB. */
#define MEMORY_MAP_SIZE 0x3000 #define MEMORY_MAP_SIZE 0x3000
/* The minimum and maximum heap size for GRUB itself. */ /* The default heap size for GRUB itself in bytes. */
#define MIN_HEAP_SIZE 0x100000 #define DEFAULT_HEAP_SIZE 0x100000
#define MAX_HEAP_SIZE (1600 * 0x100000)
static void *finish_mmap_buf = 0; static void *finish_mmap_buf = 0;
static grub_efi_uintn_t finish_mmap_size = 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 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. */ /* Add memory regions. */
static void static void
add_memory_regions (grub_efi_memory_descriptor_t *memory_map, add_memory_regions (grub_efi_memory_descriptor_t *memory_map,
@@ -583,8 +565,6 @@ grub_efi_mm_init (void)
grub_efi_memory_descriptor_t *filtered_memory_map_end; grub_efi_memory_descriptor_t *filtered_memory_map_end;
grub_efi_uintn_t map_size; grub_efi_uintn_t map_size;
grub_efi_uintn_t desc_size; grub_efi_uintn_t desc_size;
grub_efi_uint64_t total_pages;
grub_efi_uint64_t required_pages;
int mm_status; int mm_status;
/* Prepare a memory region to store two memory maps. */ /* Prepare a memory region to store two memory maps. */
@@ -624,22 +604,13 @@ grub_efi_mm_init (void)
filtered_memory_map_end = filter_memory_map (memory_map, filtered_memory_map, filtered_memory_map_end = filter_memory_map (memory_map, filtered_memory_map,
desc_size, memory_map_end); 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 /* Sort the filtered descriptors, so that GRUB can allocate pages
from smaller regions. */ from smaller regions. */
sort_memory_map (filtered_memory_map, desc_size, filtered_memory_map_end); sort_memory_map (filtered_memory_map, desc_size, filtered_memory_map_end);
/* Allocate memory regions for GRUB's memory management. */ /* Allocate memory regions for GRUB's memory management. */
add_memory_regions (filtered_memory_map, desc_size, add_memory_regions (filtered_memory_map, desc_size,
filtered_memory_map_end, required_pages); filtered_memory_map_end, BYTES_TO_PAGES (DEFAULT_HEAP_SIZE));
#if 0 #if 0
/* For debug. */ /* For debug. */