Blame SOURCES/0321-mm-Preallocate-some-space-when-adding-new-regions.patch

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;