|
|
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:33 +0800
|
|
|
b35c50 |
Subject: [PATCH] mm: Avoid complex heap growth math in hot path
|
|
|
b35c50 |
|
|
|
b35c50 |
We do a lot of math about heap growth in hot path of grub_memalign().
|
|
|
b35c50 |
However, the result is only used if out of memory is encountered, which
|
|
|
b35c50 |
is seldom.
|
|
|
b35c50 |
|
|
|
b35c50 |
This patch moves these calculations away from hot path. These
|
|
|
b35c50 |
calculations are now only done if out of memory is encountered. This
|
|
|
b35c50 |
change can also help compiler to optimize integer overflow checks away.
|
|
|
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 65bc45963014773e2062ccc63ff34a089d2e352e)
|
|
|
b35c50 |
---
|
|
|
b35c50 |
grub-core/kern/mm.c | 34 ++++++++++++++++++++--------------
|
|
|
b35c50 |
1 file changed, 20 insertions(+), 14 deletions(-)
|
|
|
b35c50 |
|
|
|
b35c50 |
diff --git a/grub-core/kern/mm.c b/grub-core/kern/mm.c
|
|
|
b35c50 |
index cc8a4703bc..630d7be0e2 100644
|
|
|
b35c50 |
--- a/grub-core/kern/mm.c
|
|
|
b35c50 |
+++ b/grub-core/kern/mm.c
|
|
|
b35c50 |
@@ -467,20 +467,7 @@ grub_memalign (grub_size_t align, grub_size_t size)
|
|
|
b35c50 |
if (size > ~(grub_size_t) align)
|
|
|
b35c50 |
goto fail;
|
|
|
b35c50 |
|
|
|
b35c50 |
- /*
|
|
|
b35c50 |
- * Pre-calculate the necessary size of heap growth (if applicable),
|
|
|
b35c50 |
- * with region management overhead taken into account.
|
|
|
b35c50 |
- */
|
|
|
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;
|
|
|
b35c50 |
- grow = ALIGN_UP (grow, GRUB_MM_HEAP_GROW_ALIGN);
|
|
|
b35c50 |
+ grow = size + align;
|
|
|
b35c50 |
|
|
|
b35c50 |
/* We currently assume at least a 32-bit grub_size_t,
|
|
|
b35c50 |
so limiting allocations to <adress space size> - 1MiB
|
|
|
b35c50 |
@@ -510,6 +497,25 @@ grub_memalign (grub_size_t align, grub_size_t size)
|
|
|
b35c50 |
/* Request additional pages, contiguous */
|
|
|
b35c50 |
count++;
|
|
|
b35c50 |
|
|
|
b35c50 |
+ /*
|
|
|
b35c50 |
+ * Calculate the necessary size of heap growth (if applicable),
|
|
|
b35c50 |
+ * with region management overhead taken into account.
|
|
|
b35c50 |
+ */
|
|
|
b35c50 |
+ if (grub_add (grow, 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;
|
|
|
b35c50 |
+ grow = ALIGN_UP (grow, GRUB_MM_HEAP_GROW_ALIGN);
|
|
|
b35c50 |
+
|
|
|
b35c50 |
+ /* Do the same sanity check again. */
|
|
|
b35c50 |
+ if (grow > ~(grub_size_t) 0x100000)
|
|
|
b35c50 |
+ goto fail;
|
|
|
b35c50 |
+
|
|
|
b35c50 |
if (grub_mm_add_region_fn != NULL &&
|
|
|
b35c50 |
grub_mm_add_region_fn (grow, GRUB_MM_ADD_REGION_CONSECUTIVE) == GRUB_ERR_NONE)
|
|
|
b35c50 |
goto again;
|