[edk2-devel] [PATCH v3 resend 00/11] ArmVirtPkg/ArmVirtQemu: Performance streamlining

Ard Biesheuvel posted 11 patches 1 year, 6 months ago
Failed in applying to current master (apply log)
ArmVirtPkg/ArmVirt.dsc.inc                                                                                   |   7 +-
ArmVirtPkg/ArmVirtCloudHv.fdf                                                                                |   5 -
ArmVirtPkg/ArmVirtPkg.dec                                                                                    |   1 +
ArmVirtPkg/ArmVirtQemu.dsc                                                                                   |  53 ++++++---
ArmVirtPkg/ArmVirtQemu.fdf                                                                                   |   5 +-
ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc                                                                         |   5 -
ArmVirtPkg/ArmVirtQemuKernel.dsc                                                                             |   1 -
ArmVirtPkg/ArmVirtXen.fdf                                                                                    |   5 -
ArmVirtPkg/Library/ArmPlatformLibQemu/AArch64/ArmPlatformHelper.S                                            | 115 ++++++++++++++++++++
ArmVirtPkg/Library/ArmPlatformLibQemu/ArmPlatformLibQemu.c                                                   |  64 +++++++++++
ArmVirtPkg/Library/ArmPlatformLibQemu/ArmPlatformLibQemu.inf                                                 |  40 +++++++
ArmVirtPkg/Library/ArmPlatformLibQemu/IdMap.S                                                                |  57 ++++++++++
ArmVirtPkg/Library/ArmVirtMemoryInitPeiLib/ArmVirtMemoryInitPeiLib.c                                         |  14 ++-
ArmVirtPkg/Library/ArmVirtMemoryInitPeiLib/ArmVirtMemoryInitPeiLib.inf                                       |   1 +
ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoLib.c                                                   |  35 +++++-
ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoLib.inf                                                 |   5 +-
ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoPeiLib.inf                                              |   8 +-
ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoPeiLibConstructor.c                                     |  30 +++--
ArmVirtPkg/MemoryInitPei/MemoryInitPeim.c                                                                    | 104 ++++++++++++++++++
ArmVirtPkg/{Library/ArmVirtMemoryInitPeiLib/ArmVirtMemoryInitPeiLib.inf => MemoryInitPei/MemoryInitPeim.inf} |  36 +++---
20 files changed, 510 insertions(+), 81 deletions(-)
create mode 100644 ArmVirtPkg/Library/ArmPlatformLibQemu/AArch64/ArmPlatformHelper.S
create mode 100644 ArmVirtPkg/Library/ArmPlatformLibQemu/ArmPlatformLibQemu.c
create mode 100644 ArmVirtPkg/Library/ArmPlatformLibQemu/ArmPlatformLibQemu.inf
create mode 100644 ArmVirtPkg/Library/ArmPlatformLibQemu/IdMap.S
create mode 100644 ArmVirtPkg/MemoryInitPei/MemoryInitPeim.c
copy ArmVirtPkg/{Library/ArmVirtMemoryInitPeiLib/ArmVirtMemoryInitPeiLib.inf => MemoryInitPei/MemoryInitPeim.inf} (64%)
[edk2-devel] [PATCH v3 resend 00/11] ArmVirtPkg/ArmVirtQemu: Performance streamlining
Posted by Ard Biesheuvel 1 year, 6 months ago
We currently do a substantial amount of processing before enabling the
MMU and caches, which is bad for performance, but also fragile, as it
requires cache coherency to be managed in software.

It also means that when running under virtualization, the hypervisor
must do a non-trivial amount of work to ensure that the host's cached
view of memory is consistent with the guest's uncached view.

Now that the AArch64 version of ArmMmuLib has been updated to allow it
to be invoked with the MMU already enabled, and to no longer disable the
MMU temporarily to make modifications to the page tables that require
break before make (BBM) [e.g., to split block mappings into table
mappings], we can remove all remaining manipulations of main memory that
occur with the MMU and caches disabled, by using a compile time
generated ID map that covers the first bank of NOR flash, the first MMIO
region (for the UART), and the first 128 MiB of DRAM, and switching to
it straight out of reset.

The resulting build no longer performs any non-coherent memory accesses
via the data side, and only relies on instruction fetches before the MMU
is enabled. It also avoids any cache maintenance to the PoC.

Changes since v3:
- drop ArmMmuLib changes that have since been merged

Changes since v2:
- drop shadow page table approach - it only works at EL1, and is a bit
  more intrusive than needed; instead, do a proper break-before-make
  (BBM) unless the break unmaps the page table itself or the code that
  is modifying it;
- add a couple of only tangentially related performance streamlining
  changes, to avoid dispatching and shadowing drivers that we don't need

Changes since v1:
- coding style tweaks to placate our CI overlord
- drop -mstrict-align which is no longer needed now that all C code runs
  with the MMU and caches on

Cc: Leif Lindholm <quic_llindhol@quicinc.com>
Cc: Alexander Graf <agraf@csgraf.de>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Sami Mujawar <Sami.Mujawar@arm.com>

Ard Biesheuvel (11):
  ArmVirtPkg: remove EbcDxe from all platforms
  ArmVirtPkg: do not enable iSCSI driver by default
  ArmVirtPkg: make EFI_LOADER_DATA non-executable
  ArmVirtPkg/ArmVirtQemu: wire up timeout PCD to Timeout variable
  ArmVirtPkg/ArmVirtQemu: implement ArmPlatformLib with static ID map
  ArmVirtPkg/ArmVirtQemu: use first 128 MiB as permanent PEI memory
  ArmVirtPkg/ArmVirtQemu: enable initial ID map at early boot
  ArmVirtPkg/ArmVirtQemu: Drop unused variable PEIM
  ArmVirtPkg/ArmVirtQemu: avoid shadowing PEIMs unless necessary
  ArmVirtPkg/QemuVirtMemInfoLib: use HOB not PCD to record the memory
    size
  ArmVirtPkg/ArmVirtQemu: omit PCD PEIM unless TPM support is enabled

 ArmVirtPkg/ArmVirt.dsc.inc                                                                                   |   7 +-
 ArmVirtPkg/ArmVirtCloudHv.fdf                                                                                |   5 -
 ArmVirtPkg/ArmVirtPkg.dec                                                                                    |   1 +
 ArmVirtPkg/ArmVirtQemu.dsc                                                                                   |  53 ++++++---
 ArmVirtPkg/ArmVirtQemu.fdf                                                                                   |   5 +-
 ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc                                                                         |   5 -
 ArmVirtPkg/ArmVirtQemuKernel.dsc                                                                             |   1 -
 ArmVirtPkg/ArmVirtXen.fdf                                                                                    |   5 -
 ArmVirtPkg/Library/ArmPlatformLibQemu/AArch64/ArmPlatformHelper.S                                            | 115 ++++++++++++++++++++
 ArmVirtPkg/Library/ArmPlatformLibQemu/ArmPlatformLibQemu.c                                                   |  64 +++++++++++
 ArmVirtPkg/Library/ArmPlatformLibQemu/ArmPlatformLibQemu.inf                                                 |  40 +++++++
 ArmVirtPkg/Library/ArmPlatformLibQemu/IdMap.S                                                                |  57 ++++++++++
 ArmVirtPkg/Library/ArmVirtMemoryInitPeiLib/ArmVirtMemoryInitPeiLib.c                                         |  14 ++-
 ArmVirtPkg/Library/ArmVirtMemoryInitPeiLib/ArmVirtMemoryInitPeiLib.inf                                       |   1 +
 ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoLib.c                                                   |  35 +++++-
 ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoLib.inf                                                 |   5 +-
 ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoPeiLib.inf                                              |   8 +-
 ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoPeiLibConstructor.c                                     |  30 +++--
 ArmVirtPkg/MemoryInitPei/MemoryInitPeim.c                                                                    | 104 ++++++++++++++++++
 ArmVirtPkg/{Library/ArmVirtMemoryInitPeiLib/ArmVirtMemoryInitPeiLib.inf => MemoryInitPei/MemoryInitPeim.inf} |  36 +++---
 20 files changed, 510 insertions(+), 81 deletions(-)
 create mode 100644 ArmVirtPkg/Library/ArmPlatformLibQemu/AArch64/ArmPlatformHelper.S
 create mode 100644 ArmVirtPkg/Library/ArmPlatformLibQemu/ArmPlatformLibQemu.c
 create mode 100644 ArmVirtPkg/Library/ArmPlatformLibQemu/ArmPlatformLibQemu.inf
 create mode 100644 ArmVirtPkg/Library/ArmPlatformLibQemu/IdMap.S
 create mode 100644 ArmVirtPkg/MemoryInitPei/MemoryInitPeim.c
 copy ArmVirtPkg/{Library/ArmVirtMemoryInitPeiLib/ArmVirtMemoryInitPeiLib.inf => MemoryInitPei/MemoryInitPeim.inf} (64%)

-- 
2.35.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#95368): https://edk2.groups.io/g/devel/message/95368
Mute This Topic: https://groups.io/mt/94427010/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-