Skip to content

Commit

Permalink
mm: Avoid complex heap growth math in hot path
Browse files Browse the repository at this point in the history
We do a lot of math about heap growth in hot path of grub_memalign().
However, the result is only used if out of memory is encountered, which
is seldom.

This patch moves these calculations away from hot path. These
calculations are now only done if out of memory is encountered. This
change can also help compiler to optimize integer overflow checks away.

Signed-off-by: Zhang Boyang <[email protected]>
Reviewed-by: Daniel Kiper <[email protected]>
(cherry picked from commit 65bc459)
  • Loading branch information
zhangboyang authored and frozencemetery committed Feb 20, 2023
1 parent c9176ae commit 61616e1
Showing 1 changed file with 20 additions and 14 deletions.
34 changes: 20 additions & 14 deletions grub-core/kern/mm.c
Original file line number Diff line number Diff line change
Expand Up @@ -467,20 +467,7 @@ grub_memalign (grub_size_t align, grub_size_t size)
if (size > ~(grub_size_t) align)
goto fail;

/*
* Pre-calculate the necessary size of heap growth (if applicable),
* with region management overhead taken into account.
*/
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;
grow = ALIGN_UP (grow, GRUB_MM_HEAP_GROW_ALIGN);
grow = size + align;

/* We currently assume at least a 32-bit grub_size_t,
so limiting allocations to <adress space size> - 1MiB
Expand Down Expand Up @@ -510,6 +497,25 @@ grub_memalign (grub_size_t align, grub_size_t size)
/* Request additional pages, contiguous */
count++;

/*
* Calculate the necessary size of heap growth (if applicable),
* with region management overhead taken into account.
*/
if (grub_add (grow, 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;
grow = ALIGN_UP (grow, GRUB_MM_HEAP_GROW_ALIGN);

/* Do the same sanity check again. */
if (grow > ~(grub_size_t) 0x100000)
goto fail;

if (grub_mm_add_region_fn != NULL &&
grub_mm_add_region_fn (grow, GRUB_MM_ADD_REGION_CONSECUTIVE) == GRUB_ERR_NONE)
goto again;
Expand Down

0 comments on commit 61616e1

Please sign in to comment.