mirror of
https://git.savannah.gnu.org/git/grub.git
synced 2026-10-21 06:49:35 +00:00
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:
1 parent
887f98f0db
commit
938c3760b8
1 file changed
+3
-32
+3
-32
@@ -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. */
|
||||||
|
|||||||
Reference in new issue
Block a user