From: Daniel Axtens <dja@axtens.net>
To: grub-devel@gnu.org
Cc: leif@nuviainc.com, stefanb@linux.ibm.com, ps@pks.im,
dkiper@net-space.pl, Daniel Kiper <daniel.kiper@oracle.com>
Subject: Re: [PATCH v3 06/15] mm: Allow dynamically requesting additional memory regions
Date: Thu, 21 Apr 2022 16:50:34 +1000 [thread overview]
Message-ID: <87ee1rdj5x.fsf@dja-thinkpad.axtens.net> (raw)
In-Reply-To: <20220421052427.1389987-7-dja@axtens.net>
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 @@
> \f
>
> 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
next prev parent reply other threads:[~2022-04-21 6:50 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-04-21 5:24 [PATCH v3 00/15] Dynamic allocation of memory regions and IBM vTPM v2 Daniel Axtens
2022-04-21 5:24 ` [PATCH v3 01/15] grub-shell: only pass SeaBIOS fw_opt in for x86 BIOS platforms Daniel Axtens
2022-04-21 5:24 ` [PATCH v3 02/15] mm: assert that we preserve header vs region alignment Daniel Axtens
2022-04-21 5:24 ` [PATCH v3 03/15] mm: when adding a region, merge with region after as well as before Daniel Axtens
2022-04-21 5:24 ` [PATCH v3 04/15] mm: debug support for region operations Daniel Axtens
2022-04-21 5:24 ` [PATCH v3 05/15] mm: Drop unused unloading of modules on OOM Daniel Axtens
2022-04-21 5:24 ` [PATCH v3 06/15] mm: Allow dynamically requesting additional memory regions Daniel Axtens
2022-04-21 6:50 ` Daniel Axtens [this message]
2022-04-21 13:32 ` Daniel Kiper
2022-04-21 5:24 ` [PATCH v3 07/15] efi: mm: Always request a fixed number of pages on init Daniel Axtens
2022-04-21 5:24 ` [PATCH v3 08/15] efi: mm: Extract function to add memory regions Daniel Axtens
2022-04-21 5:24 ` [PATCH v3 09/15] efi: mm: Pass up errors from `add_memory_regions ()` Daniel Axtens
2022-04-21 5:24 ` [PATCH v3 10/15] efi: mm: Implement runtime addition of pages Daniel Axtens
2022-04-21 5:24 ` [PATCH v3 11/15] ieee1275: request memory with ibm, client-architecture-support Daniel Axtens
2022-07-19 20:49 ` Stefan Berger
2022-07-20 13:34 ` Daniel Kiper
2022-04-21 5:24 ` [PATCH v3 12/15] ieee1275: drop len -= 1 quirk in heap_init Daniel Axtens
2022-04-21 5:24 ` [PATCH v3 13/15] ieee1275: support runtime memory claiming Daniel Axtens
2022-04-21 5:24 ` [PATCH v3 14/15] [RFC] Add memtool module with memory allocation stress-test Daniel Axtens
2022-04-21 5:24 ` [PATCH v3 15/15] ibmvtpm: Add support for trusted boot using a vTPM 2.0 Daniel Axtens
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87ee1rdj5x.fsf@dja-thinkpad.axtens.net \
--to=dja@axtens.net \
--cc=daniel.kiper@oracle.com \
--cc=dkiper@net-space.pl \
--cc=grub-devel@gnu.org \
--cc=leif@nuviainc.com \
--cc=ps@pks.im \
--cc=stefanb@linux.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.