54 lines
2.2 KiB
Diff
54 lines
2.2 KiB
Diff
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: Zhang Boyang <zhangboyang.id@gmail.com>
|
||
|
Date: Sun, 29 Jan 2023 19:49:32 +0800
|
||
|
Subject: [PATCH] mm: Preallocate some space when adding new regions
|
||
|
|
||
|
When grub_memalign() encounters out-of-memory, it will try
|
||
|
grub_mm_add_region_fn() to request more memory from system firmware.
|
||
|
However, it doesn't preallocate memory space for future allocation
|
||
|
requests. In extreme cases, it requires one call to
|
||
|
grub_mm_add_region_fn() for each memory allocation request. This can
|
||
|
be very slow.
|
||
|
|
||
|
This patch introduces GRUB_MM_HEAP_GROW_EXTRA, the minimal heap growth
|
||
|
granularity. The new region size is now set to the bigger one of its
|
||
|
original value and GRUB_MM_HEAP_GROW_EXTRA. Thus, it will result in some
|
||
|
memory space preallocated if current allocations request is small.
|
||
|
|
||
|
The value of GRUB_MM_HEAP_GROW_EXTRA is set to 1MB. If this value is
|
||
|
smaller, the cost of small memory allocations will be higher. If this
|
||
|
value is larger, more memory will be wasted and it might cause
|
||
|
out-of-memory on machines with small amount of RAM.
|
||
|
|
||
|
Signed-off-by: Zhang Boyang <zhangboyang.id@gmail.com>
|
||
|
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||
|
(cherry picked from commit 21869baec15239b6d99122b32b14a778af4c754f)
|
||
|
---
|
||
|
grub-core/kern/mm.c | 6 ++++++
|
||
|
1 file changed, 6 insertions(+)
|
||
|
|
||
|
diff --git a/grub-core/kern/mm.c b/grub-core/kern/mm.c
|
||
|
index f29a3e5cbd..cc8a4703bc 100644
|
||
|
--- a/grub-core/kern/mm.c
|
||
|
+++ b/grub-core/kern/mm.c
|
||
|
@@ -123,6 +123,9 @@
|
||
|
/* The size passed to grub_mm_add_region_fn() is aligned up by this value. */
|
||
|
#define GRUB_MM_HEAP_GROW_ALIGN 4096
|
||
|
|
||
|
+/* Minimal heap growth granularity when existing heap space is exhausted. */
|
||
|
+#define GRUB_MM_HEAP_GROW_EXTRA 0x100000
|
||
|
+
|
||
|
grub_mm_region_t grub_mm_base;
|
||
|
grub_mm_add_region_func_t grub_mm_add_region_fn;
|
||
|
|
||
|
@@ -471,6 +474,9 @@ grub_memalign (grub_size_t align, grub_size_t size)
|
||
|
if (grub_add (size + align, GRUB_MM_MGMT_OVERHEAD, &grow))
|
||
|
goto fail;
|
||
|
|
||
|
+ /* Preallocate some extra space if heap growth is small. */
|
||
|
+ grow = grub_max (grow, GRUB_MM_HEAP_GROW_EXTRA);
|
||
|
+
|
||
|
/* Align up heap growth to make it friendly to CPU/MMU. */
|
||
|
if (grow > ~(grub_size_t) (GRUB_MM_HEAP_GROW_ALIGN - 1))
|
||
|
goto fail;
|