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