public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Nolan Hergert" <nolan.hergert@intel.com>
To: "devel@edk2.groups.io" <devel@edk2.groups.io>,
	"Hergert, Nolan" <nolan.hergert@intel.com>
Cc: "Bi, Dandan" <dandan.bi@intel.com>,
	"Gao, Liming" <gaoliming@byosoft.com.cn>
Subject: Re: [edk2-devel] [PATCH 1/1] MdeModulePkg: Cache device path during LoadImage calls
Date: Fri, 9 Jun 2023 17:27:48 +0000	[thread overview]
Message-ID: <SN7PR11MB67282DFDBDF59915E41F9A90F851A@SN7PR11MB6728.namprd11.prod.outlook.com> (raw)
In-Reply-To: <17622AC93CEFC20B.29947@groups.io>

Any feedback?
________________________________________
From: devel@edk2.groups.io <devel@edk2.groups.io> on behalf of Nolan Hergert <nolan.hergert@intel.com>
Sent: Wednesday, May 24, 2023 12:07 PM
To: devel@edk2.groups.io <devel@edk2.groups.io>
Cc: Bi, Dandan <dandan.bi@intel.com>; Gao, Liming <gaoliming@byosoft.com.cn>
Subject: [edk2-devel] [PATCH 1/1] MdeModulePkg: Cache device path during LoadImage calls 
 
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.

Cc: Dandan Bi <dandan.bi@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>

Signed-off-by: Nolan Hergert <nolan.hergert@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






           reply	other threads:[~2023-06-09 17:27 UTC|newest]

Thread overview: expand[flat|nested]  mbox.gz  Atom feed
 [parent not found: <17622AC93CEFC20B.29947@groups.io>]

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-list 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=SN7PR11MB67282DFDBDF59915E41F9A90F851A@SN7PR11MB6728.namprd11.prod.outlook.com \
    --to=devel@edk2.groups.io \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox