During LoadImage, there 6-7 of the same call to CoreLocateDevicePath and can be cached during a particular call to LoadImage. For implementations with significant numbers of calls to LoadImage (>250), this change will improve the boot time by >10ms.
Signed-off-by: Nolan Hergert <nolan.herg...@intel.com> --- MdeModulePkg/Core/Dxe/Hand/Locate.c | 21 ++++++++++++++++----- MdeModulePkg/Core/Dxe/Image/Image.c | 15 +++++++++++++-- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/Hand/Locate.c b/MdeModulePkg/Core/Dxe/Hand/Locate.c index a29010a54565..52b7b7a7cd8c 100644 --- a/MdeModulePkg/Core/Dxe/Hand/Locate.c +++ b/MdeModulePkg/Core/Dxe/Hand/Locate.c @@ -14,6 +14,10 @@ SPDX-License-Identifier: BSD-2-Clause-Patent // UINTN mEfiLocateHandleRequest = 0; +extern EFI_DEVICE_PATH_PROTOCOL *gFilePathCache; +extern EFI_HANDLE gDeviceHandleCache; +extern EFI_DEVICE_PATH_PROTOCOL *gOutgoingDevicePathCache; + // // Internal prototypes // @@ -467,10 +471,21 @@ CoreLocateDevicePath ( return EFI_INVALID_PARAMETER; } - if ((DevicePath == NULL) || (*DevicePath == NULL)) { + if ((DevicePath == NULL) || (*DevicePath == NULL) || (Device == NULL)) { return EFI_INVALID_PARAMETER; } + if (gFilePathCache != NULL) { + Size = GetDevicePathSize (gFilePathCache) - sizeof (EFI_DEVICE_PATH_PROTOCOL); + SourceSize = GetDevicePathSize (*DevicePath) - sizeof (EFI_DEVICE_PATH_PROTOCOL); + + if ((Size == SourceSize) && (CompareMem (gFilePathCache, *DevicePath, (UINTN)Size) == 0)) { + *Device = gDeviceHandleCache; + *DevicePath = gOutgoingDevicePathCache; + return EFI_SUCCESS; + } + } + Handles = NULL; BestDevice = NULL; SourcePath = *DevicePath; @@ -541,10 +556,6 @@ CoreLocateDevicePath ( return EFI_NOT_FOUND; } - if (Device == NULL) { - return EFI_INVALID_PARAMETER; - } - *Device = BestDevice; // diff --git a/MdeModulePkg/Core/Dxe/Image/Image.c b/MdeModulePkg/Core/Dxe/Image/Image.c index 9dbfb2a1fad2..e76f788a4d89 100644 --- a/MdeModulePkg/Core/Dxe/Image/Image.c +++ b/MdeModulePkg/Core/Dxe/Image/Image.c @@ -12,7 +12,10 @@ SPDX-License-Identifier: BSD-2-Clause-Patent // // Module Globals // -LOADED_IMAGE_PRIVATE_DATA *mCurrentImage = NULL; +LOADED_IMAGE_PRIVATE_DATA *mCurrentImage = NULL; +EFI_DEVICE_PATH_PROTOCOL *gFilePathCache = NULL; +EFI_DEVICE_PATH_PROTOCOL *gOutgoingDevicePathCache = NULL; +EFI_HANDLE gDeviceHandleCache = NULL; typedef struct { LIST_ENTRY Link; @@ -1219,7 +1222,10 @@ CoreLoadImageCommon ( Node = NULL; Status = CoreLocateDevicePath (&gEfiFirmwareVolume2ProtocolGuid, &HandleFilePath, &DeviceHandle); if (!EFI_ERROR (Status)) { - ImageIsFromFv = TRUE; + ImageIsFromFv = TRUE; + gFilePathCache = FilePath; + gOutgoingDevicePathCache = HandleFilePath; + gDeviceHandleCache = DeviceHandle; } else { HandleFilePath = FilePath; Status = CoreLocateDevicePath (&gEfiSimpleFileSystemProtocolGuid, &HandleFilePath, &DeviceHandle); @@ -1497,6 +1503,11 @@ Done: Image->LoadImageStatus = Status; } + // Clear cache + gFilePathCache = NULL; + gOutgoingDevicePathCache = NULL; + gDeviceHandleCache = NULL; + return Status; } -- 2.38.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#105279): https://edk2.groups.io/g/devel/message/105279 Mute This Topic: https://groups.io/mt/99111895/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-