[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v3 06/15] mm: Allow dynamically requesting additional memory
From: |
Daniel Axtens |
Subject: |
Re: [PATCH v3 06/15] mm: Allow dynamically requesting additional memory regions |
Date: |
Thu, 21 Apr 2022 16:50:34 +1000 |
I genuinely do not know how I missed this, but we do need one more tweak
so as not to break grub-emu builds:
diff --git a/include/grub/mm.h b/include/grub/mm.h
index 5d916809666c..f3bf87fa0f9a 100644
--- a/include/grub/mm.h
+++ b/include/grub/mm.h
@@ -42,7 +42,9 @@ typedef grub_err_t (*grub_mm_add_region_func_t) (grub_size_t,
unsigned int);
* Set this function pointer to enable adding memory-regions at runtime in case
* a memory allocation cannot be satisfied with existing regions.
*/
+#ifndef GRUB_MACHINE_EMU
extern grub_mm_add_region_func_t EXPORT_VAR(grub_mm_add_region_fn);
+#endif
void grub_mm_init_region (void *addr, grub_size_t size);
void *EXPORT_FUNC(grub_calloc) (grub_size_t nmemb, grub_size_t size);
I've updated by GH branches.
Daniel K, are you right to fold this in when you merge this?
Kind regards,
Daniel
Daniel Axtens <dja@axtens.net> writes:
> From: Patrick Steinhardt <ps@pks.im>
>
> Currently, all platforms will set up their heap on initialization of the
> platform code. While this works mostly fine, it poses some limitations
> on memory management on us. Most notably, allocating big chunks of
> memory in the gigabyte range would require us to pre-request this many
> bytes from the firmware and add it to the heap from the beginning on
> some platforms like EFI. As this isn't needed for most configurations,
> it is inefficient and may even negatively impact some usecases when,
> e.g., chainloading. Nonetheless, allocating big chunks of memory is
> required sometimes, where one example is the upcoming support for the
> Argon2 key derival function in LUKS2.
>
> In order to avoid pre-allocating big chunks of memory, this commit
> implements a runtime mechanism to add more pages to the system. When a
> given allocation cannot be currently satisfied, we'll call a given
> callback set up by the platform's own memory management subsystem,
> asking it to add a memory area with at least `n` bytes. If this
> succeeds, we retry searching for a valid memory region, which should now
> succeed.
>
> If this fails, we try asking for `n` bytes, possibly spread across
> multiple regions, in hopes that region merging means that we end up
> with enough memory for things to work out.
>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> [dja: add this to the documentation at the top of mm.c
> v2: fallback to non-contiguous]
> Signed-off-by: Daniel Axtens <dja@axtens.net>
> Tested-by: Stefan Berger <stefanb@linux.ibm.com>
> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
> ---
> grub-core/kern/mm.c | 30 ++++++++++++++++++++++++++++++
> include/grub/mm.h | 16 ++++++++++++++++
> 2 files changed, 46 insertions(+)
>
> diff --git a/grub-core/kern/mm.c b/grub-core/kern/mm.c
> index 41e5ea07dc5a..ed782e8d1f56 100644
> --- a/grub-core/kern/mm.c
> +++ b/grub-core/kern/mm.c
> @@ -28,6 +28,9 @@
> - multiple regions may be used as free space. They may not be
> contiguous.
>
> + - if existing regions are insufficient to satisfy an allocation, a new
> + region can be requested from firmware.
> +
> Regions are managed by a singly linked list, and the meta information is
> stored in the beginning of each region. Space after the meta information
> is used to allocate memory.
> @@ -81,6 +84,7 @@
>
>
> grub_mm_region_t grub_mm_base;
> +grub_mm_add_region_func_t grub_mm_add_region_fn;
>
> /* Get a header from the pointer PTR, and set *P and *R to a pointer
> to the header and a pointer to its region, respectively. PTR must
> @@ -437,6 +441,32 @@ grub_memalign (grub_size_t align, grub_size_t size)
> count++;
> goto again;
>
> + case 1:
> + /* Request additional pages, contiguous */
> + count++;
> +
> + if (grub_mm_add_region_fn != NULL &&
> + grub_mm_add_region_fn (size, GRUB_MM_ADD_REGION_CONSECUTIVE) ==
> GRUB_ERR_NONE)
> + goto again;
> +
> + /* fallthrough */
> +
> + case 2:
> + /* Request additional pages, anything at all */
> + count++;
> +
> + if (grub_mm_add_region_fn != NULL)
> + {
> + /*
> + * Try again even if this fails, in case it was able to partially
> + * satisfy the request
> + */
> + grub_mm_add_region_fn (size, GRUB_MM_ADD_REGION_NONE);
> + goto again;
> + }
> +
> + /* fallthrough */
> +
> default:
> break;
> }
> diff --git a/include/grub/mm.h b/include/grub/mm.h
> index 44fde7cb9033..5d916809666c 100644
> --- a/include/grub/mm.h
> +++ b/include/grub/mm.h
> @@ -20,6 +20,7 @@
> #ifndef GRUB_MM_H
> #define GRUB_MM_H 1
>
> +#include <grub/err.h>
> #include <grub/types.h>
> #include <grub/symbol.h>
> #include <config.h>
> @@ -28,6 +29,21 @@
> # define NULL ((void *) 0)
> #endif
>
> +#define GRUB_MM_ADD_REGION_NONE 0
> +#define GRUB_MM_ADD_REGION_CONSECUTIVE (1 << 0)
> +
> +/*
> + * Function used to request memory regions of `grub_size_t` bytes. The second
> + * parameter is a bitfield of `GRUB_MM_ADD_REGION` flags.
> + */
> +typedef grub_err_t (*grub_mm_add_region_func_t) (grub_size_t, unsigned int);
> +
> +/*
> + * Set this function pointer to enable adding memory-regions at runtime in
> case
> + * a memory allocation cannot be satisfied with existing regions.
> + */
> +extern grub_mm_add_region_func_t EXPORT_VAR(grub_mm_add_region_fn);
> +
> void grub_mm_init_region (void *addr, grub_size_t size);
> void *EXPORT_FUNC(grub_calloc) (grub_size_t nmemb, grub_size_t size);
> void *EXPORT_FUNC(grub_malloc) (grub_size_t size);
> --
> 2.32.0
- [PATCH v3 00/15] Dynamic allocation of memory regions and IBM vTPM v2, Daniel Axtens, 2022/04/21
- [PATCH v3 01/15] grub-shell: only pass SeaBIOS fw_opt in for x86 BIOS platforms, Daniel Axtens, 2022/04/21
- [PATCH v3 02/15] mm: assert that we preserve header vs region alignment, Daniel Axtens, 2022/04/21
- [PATCH v3 03/15] mm: when adding a region, merge with region after as well as before, Daniel Axtens, 2022/04/21
- [PATCH v3 04/15] mm: debug support for region operations, Daniel Axtens, 2022/04/21
- [PATCH v3 05/15] mm: Drop unused unloading of modules on OOM, Daniel Axtens, 2022/04/21
- [PATCH v3 06/15] mm: Allow dynamically requesting additional memory regions, Daniel Axtens, 2022/04/21
- Re: [PATCH v3 06/15] mm: Allow dynamically requesting additional memory regions,
Daniel Axtens <=
- [PATCH v3 07/15] efi: mm: Always request a fixed number of pages on init, Daniel Axtens, 2022/04/21
- [PATCH v3 08/15] efi: mm: Extract function to add memory regions, Daniel Axtens, 2022/04/21
- [PATCH v3 09/15] efi: mm: Pass up errors from `add_memory_regions ()`, Daniel Axtens, 2022/04/21
- [PATCH v3 10/15] efi: mm: Implement runtime addition of pages, Daniel Axtens, 2022/04/21
- [PATCH v3 11/15] ieee1275: request memory with ibm, client-architecture-support, Daniel Axtens, 2022/04/21
- [PATCH v3 12/15] ieee1275: drop len -= 1 quirk in heap_init, Daniel Axtens, 2022/04/21
- [PATCH v3 13/15] ieee1275: support runtime memory claiming, Daniel Axtens, 2022/04/21
- [PATCH v3 15/15] ibmvtpm: Add support for trusted boot using a vTPM 2.0, Daniel Axtens, 2022/04/21
- [PATCH v3 14/15] [RFC] Add memtool module with memory allocation stress-test, Daniel Axtens, 2022/04/21