On Thu, Dec 15, 2022 at 07:19:25PM +0800, Zhang Boyang wrote:
> 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
> 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...@gmail.com>
> ---
>  grub-core/kern/mm.c       | 3 ++-
>  include/grub/mm_private.h | 3 +++
>  2 files changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/grub-core/kern/mm.c b/grub-core/kern/mm.c
> index 20bb54dde..f023247bb 100644
> --- a/grub-core/kern/mm.c
> +++ b/grub-core/kern/mm.c
> @@ -449,11 +449,12 @@ grub_memalign (grub_size_t align, grub_size_t size)
>      goto fail;
>
>    /*
> -   * Pre-calculate the size of heap growth (if applicable),
> +   * Pre-calculate the optimal size of heap growth (if applicable),
>     * with region management overhead taken into account.
>     */
>    if (grub_add (bound, GRUB_MM_MGMT_OVERHEAD, &grow))
>      goto fail;
> +  grow = grub_max (grow, GRUB_MM_HEAP_GROW_EXTRA);
>
>    align = (align >> GRUB_MM_ALIGN_LOG2);
>    if (align == 0)
> diff --git a/include/grub/mm_private.h b/include/grub/mm_private.h
> index 96c2d816b..6e4256555 100644
> --- a/include/grub/mm_private.h
> +++ b/include/grub/mm_private.h
> @@ -95,6 +95,9 @@ typedef struct grub_mm_region
>  }
>  *grub_mm_region_t;
>
> +/* Minimal heap growth granularity when existing heap space is exhausted. */
> +#define GRUB_MM_HEAP_GROW_EXTRA 0x100000

Please move this constant to the beginning of the grub-core/kern/mm.c file.

Otherwise LGTM...

Daniel

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to