[RFC PATCH 00/31] Make U-Boot memory reservations coherent

Simon Glass sjg at chromium.org
Tue Jun 11 20:52:15 CEST 2024


Hi Sughosh,

On Fri, 7 Jun 2024 at 12:53, Sughosh Ganu <sughosh.ganu at linaro.org> wrote:
>
>
> The aim of this patch series is to fix the current state of
> incoherence between modules when it comes to memory usage. The primary
> issue that this series is trying to fix is that the EFI memory module
> which is responsible for allocating and freeing memory, does not have
> any visibility of the memory that is being used by the LMB
> module. This is further complicated by the fact that the LMB
> allocations are caller specific -- the LMB memory map is not global
> nor persistent. This means that the memory "allocated" by the LMB
> module might be relevant only for a given function. Hence one of the
> requirements for making the memory usage visible across modules is to
> make LMB allocations persistent and global, and then have means to
> communicate the use of memory across modules.
>
> The first set of patches in this series work on making the LMB memory
> map persistent and global.

For the purposes of testing at least, it should be possible to create
a new LMB. You could have a global_data pointer to the current
(global) one, like we do with driver model.

> This is being done keeping in mind the
> usage of LMB memory by platforms where the same memory region can be
> used to load multiple different images. What is not allowed is to
> overwrite memory that has been allocated by the other module,
> currently the EFI memory module. This is being achieved by introducing
> a new flag, LMB_NOOVERWRITE, which represents memory which cannot be
> re-requested once allocated.
>
> The second set of patches are then introducing a notification
> mechanism to indicate any changes to a respective module's memory
> map. This way, any memory allocation/reservation by a module gets
> notified to any interested listners, who then update their memory map
> accordingly, thus keeping memory usage coherent.

What is the need for this listener?

>
> Todo's
> ------
> I have run these patches through CI, but the LMB unit tests need an
> overhaul. I have currently marked these tests for manual run, as
> running these would obviously tamper the LMB memory map, thus
> affecting subsequent tests. The current set of LMB tests are written
> with the assumption of local LMB memory maps. This needs to be
> reworked.

See above

>
> Secondly, there needs to be a test written for testing the various
> scenarios of memory being allocated and freed by different modules,
> namely LMB and EFI. I have written a couple of commands for testing
> the changes that I have made -- I have also included these temporary
> commands to assist anyone who might want to test these changes. But I
> will be working on adding a more comprehensive test.
>
> Lastly, as the series touches common code, there is obviously an
> increase in the size of the image, moreover since the LMB memory is
> now persistent, and the variables do not reside on the stack. I want
> to check if there can be ways of decreasing the size impact of the
> changes.

Perhaps some part of the feature set could be made optional?

Regards,
Simon


>
>
> Sughosh Ganu (31):
>   lmb: remove the unused lmb_is_reserved() function
>   lmb: staticize __lmb_alloc_base()
>   lmb: make the lmb reservations persistent
>   lmb: remove local instances of the lmb structure variable
>   lmb: pass a flag to image_setup_libfdt() for lmb reservations
>   lmb: reserve and add common memory regions post relocation
>   lmb: remove lmb_init_and_reserve_range() function
>   lmb: replcace the lmb_init_and_reserve() function
>   lmb: allow for resizing lmb regions
>   event: add events to notify memory map changes
>   lib: Kconfig: add a config symbol for getting memory map updates
>   add a function to check if an address is in RAM memory
>   efi_memory: notify of any changes to the EFI memory map
>   lmb: notify of any changes to the LMB memory map
>   efi_memory: add an event handler to update memory map
>   lmb: add an event handler to update memory map
>   lmb: remove call to efi_lmb_reserve()
>   sandbox: iommu: remove lmb allocation in the driver
>   zynq: lmb: do not add to lmb map before relocation
>   test: cedit: use allocated address for reading file
>   test: event: update the expected event dump output
>   test: lmb: run the LMB tests only on sandbox
>   test: lmb: initialise the lmb structure before tests
>   test: lmb: add a test case for checking overlapping region add
>   test: lmb: adjust the test case to handle overlapping regions
>   test: lmb: run lmb tests only manually
>   test: bdinfo: dump the global LMB memory map
>   cmd: bdinfo: only dump the current LMB memory
>   temp: mx6sabresd: bump up the size limit of the board
>   temp: cmd: efi_mem: add a command to test efi alloc/free
>   temp: cmd: efi: add a command to dump EFI memory map
>
>  arch/arc/lib/cache.c                 |   4 +-
>  arch/arm/lib/stack.c                 |   4 +-
>  arch/arm/mach-apple/board.c          |  17 +-
>  arch/arm/mach-snapdragon/board.c     |  17 +-
>  arch/arm/mach-stm32mp/dram_init.c    |   8 +-
>  arch/arm/mach-stm32mp/stm32mp1/cpu.c |   6 +-
>  arch/m68k/lib/bootm.c                |   7 +-
>  arch/microblaze/lib/bootm.c          |   4 +-
>  arch/mips/lib/bootm.c                |  11 +-
>  arch/nios2/lib/bootm.c               |   4 +-
>  arch/powerpc/cpu/mpc85xx/mp.c        |   4 +-
>  arch/powerpc/include/asm/mp.h        |   4 +-
>  arch/powerpc/lib/bootm.c             |  14 +-
>  arch/riscv/lib/bootm.c               |   4 +-
>  arch/sandbox/cpu/cpu.c               |   5 +
>  arch/sh/lib/bootm.c                  |   4 +-
>  arch/x86/lib/bootm.c                 |   4 +-
>  arch/xtensa/lib/bootm.c              |   4 +-
>  board/xilinx/common/board.c          |  33 --
>  boot/bootm.c                         |  26 +-
>  boot/bootm_os.c                      |   5 +-
>  boot/image-board.c                   |  34 +--
>  boot/image-fdt.c                     |  36 +--
>  cmd/Makefile                         |   2 +
>  cmd/bdinfo.c                         |   5 +-
>  cmd/booti.c                          |   2 +-
>  cmd/bootz.c                          |   2 +-
>  cmd/efi_map_dump.c                   |  28 ++
>  cmd/efi_memory.c                     | 155 ++++++++++
>  cmd/elf.c                            |   2 +-
>  cmd/load.c                           |   7 +-
>  common/board_r.c                     |  20 ++
>  common/event.c                       |   4 +
>  configs/mx6sabresd_defconfig         |   2 +-
>  drivers/iommu/apple_dart.c           |   8 +-
>  drivers/iommu/sandbox_iommu.c        |  17 +-
>  fs/fs.c                              |   7 +-
>  include/efi_loader.h                 |   2 +
>  include/event.h                      |  28 ++
>  include/image.h                      |  27 +-
>  include/lmb.h                        |  96 +++---
>  lib/Kconfig                          |  10 +
>  lib/efi_loader/efi_dt_fixup.c        |   2 +-
>  lib/efi_loader/efi_helper.c          |   2 +-
>  lib/efi_loader/efi_memory.c          | 127 +++++++-
>  lib/lmb.c                            | 442 ++++++++++++++++++---------
>  net/tftp.c                           |   5 +-
>  net/wget.c                           |   5 +-
>  test/boot/cedit.c                    |   5 +-
>  test/cmd/bdinfo.c                    |  22 +-
>  test/lib/Makefile                    |   2 +-
>  test/lib/lmb.c                       | 274 +++++++++--------
>  test/py/tests/test_event_dump.py     |   2 +
>  53 files changed, 1001 insertions(+), 570 deletions(-)
>  create mode 100644 cmd/efi_map_dump.c
>  create mode 100644 cmd/efi_memory.c
>
> --
> 2.34.1
>
>


More information about the U-Boot mailing list