From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by mx.groups.io with SMTP id smtpd.web11.555.1684886915543882489 for ; Tue, 23 May 2023 17:08:35 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=kLqrxKc/; spf=pass (domain: intel.com, ip: 134.134.136.65, mailfrom: nolan.hergert@intel.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1684886915; x=1716422915; h=from:to:subject:date:message-id:mime-version; bh=dZTjVqPbuB/xpJzE1v/r3RsQtk6dUPoAkBOQKwEqOv8=; b=kLqrxKc/eNNuBOhaDbZASofkK0GmznXJtTKq7igygkrReO27QVAXbX2Z OzINtA/4TwS/8Po3TyzuR+qs37PLg4XMceETnu9r73JBBU2ty/yJvo3Nu do2N6TTEdSYigwO4eT/8DOQenuYX28F+dyz1+y7DR0jkWfMy1EC9gY6RF 7ShbGOjPLJFNxjJ73Xg125nBQF9Wgi4gtdpEi7NcQXch4UZqeMiUpKqeu Wo5+IMLbnV5+1k63q3fxzUt7HXcyJ9Z6if3hro9ZtpDpudx4FJxv+UNL8 ENcd8Nw4SrbBeuutBiqNyanP0NNRPmJw2+i8/QG2fRPZQ1uQrIqLCJeTe w==; X-IronPort-AV: E=McAfee;i="6600,9927,10719"; a="356626206" X-IronPort-AV: E=Sophos;i="6.00,187,1681196400"; d="scan'208,217,223";a="356626206" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 May 2023 17:08:35 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10719"; a="769193243" X-IronPort-AV: E=Sophos;i="6.00,187,1681196400"; d="scan'208,217,223";a="769193243" Received: from orsmsx602.amr.corp.intel.com ([10.22.229.15]) by fmsmga008.fm.intel.com with ESMTP; 23 May 2023 17:08:34 -0700 Received: from orsmsx610.amr.corp.intel.com (10.22.229.23) by ORSMSX602.amr.corp.intel.com (10.22.229.15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Tue, 23 May 2023 17:08:34 -0700 Received: from ORSEDG602.ED.cps.intel.com (10.7.248.7) by orsmsx610.amr.corp.intel.com (10.22.229.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23 via Frontend Transport; Tue, 23 May 2023 17:08:34 -0700 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (104.47.57.175) by edgegateway.intel.com (134.134.137.103) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.23; Tue, 23 May 2023 17:08:34 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=bS4oKeg89MVMbXAr9IkW9FWk21cosj18XSaXtmuG7Dw2DW33VEuaevKFcgsiZaoTL/OFrpgWq7/ldqeyQl87QAc8M07U4mBKuPCAKlk2dUxA+7+PgCSBmLMxkPdjyrKUBVKxmvDmZzGOBZ9Dz0ZzP+YMDETaorWLx0pku9IQkQ8h3+FkbEhLNyKHTzF5eXIUcxkfyisIOUK0TflUMcI/l1qhA20TwsLahwNgyVy/uMYyV6qZyx8M9s8vL8zBNvSyvZMzV3YYpC7DGPQg/IohwzEm4QJ7vhgOKxpGy0Ih4Y+d1P8WkTElSQPyOzfNeG5yrG6j+Oa69+OMr+Ady/3U2A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=BaGod1hZ5pxVrFjSSqYlQ1j3yckJGsuCJGiFHs1e2XA=; b=Y/zb5kLgJiJp532YpVgmvq1iJcClobo9xcHugQU8KEi2z1fanTYRZnq+xXTQYPqqDDoD64hp5GnyETL0DYwxt/ktGtpQnj9AGbC4/2QfbxTrQynpHktOxCMPmAS86YYb0yhFaAP8OlaP9X8mdpsGv5bg7JXuzDUXdyRad0ki4WKlcOny/5zW+o8o1+pPq4FoiLtISwCX0XD0kThBGbxzYh5Nl0bNC/jJ6EkP152hzL3yZb7m2WRp0pjvmYmQZi7h6ioVbexsFazsIFQxcK3ltk+5Ck1X3hTd+BpOnGmd6UvD8HvqBvRHfQAO8j40+Z7LghiwFvkEm42hvH0o57lw4g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Received: from SN7PR11MB6728.namprd11.prod.outlook.com (2603:10b6:806:264::9) by SA0PR11MB4687.namprd11.prod.outlook.com (2603:10b6:806:96::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6411.28; Wed, 24 May 2023 00:08:32 +0000 Received: from SN7PR11MB6728.namprd11.prod.outlook.com ([fe80::5c82:6d6e:654e:8e50]) by SN7PR11MB6728.namprd11.prod.outlook.com ([fe80::5c82:6d6e:654e:8e50%7]) with mapi id 15.20.6411.028; Wed, 24 May 2023 00:08:32 +0000 From: "Hergert, Nolan" To: "devel@edk2.groups.io" Subject: [PATCH 1/1] MdeModulePkg: Cache device path during LoadImage calls Thread-Topic: [PATCH 1/1] MdeModulePkg: Cache device path during LoadImage calls Thread-Index: AQHZjdPMj/344X+XUUy2ajclK1+oaQ== Date: Wed, 24 May 2023 00:08:31 +0000 Message-ID: Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SN7PR11MB6728:EE_|SA0PR11MB4687:EE_ x-ms-office365-filtering-correlation-id: af80d380-9c1b-49e8-9420-08db5beb0265 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: nPjCrzygKL50Z7vKjbfBRNDHbAt1QUtG16QeohLbY4jPZt1+/gxc6vBNswtBe/vedMs3by1qUgfw/AYf9kewBPYZgECXhOoHYgu+RWzqrgSbQ473lECbQD8oTZlLEq7LeklXBg4aK3kZQq7kLvH9C+nAKQqgAWwl+8c+9K1XCi+nFyXAlmyY84slceOWYwhiU7g8Xu9J3fXP5Gu4KX5MkxaPbkMbbpTxieJjCm6LCd2Fuap6j/BebNg12UsSea//9Dohi1Sw0U+vZg3Kp1ucKoTa0T4PELQAdmYhDWZZQDByKNKqhlNYweL5lRX2wm/o9yGW5BeOEXFLT2UEzZWXKhsKVlKjvlXOGQtBcJwIhmN/6zFbKl6z3GbVj9kGKEb3ohHQFOYAo7ZWA71Ijx9GUasCpJGPtc6LqY8LrRyup2lwlWi8BJnhFA4yzXKmF8oJWQwX0ueeQx6AYfWgVpmgxeIs01HwVcAI9+uDzxBnC9Z0huTmBkmRnX64YHIS3SzBg8Ct0bN9TSAEBzN+g6RtPex5H3nt97s4hDlIVIhLHfkUU1dHfnNMzuc7Mxts+yoV9bayxC/nF15F+DLAjOMegvVPVflABnmrHONjlVkPRzJMDPj44FthGeG3kAtH5SRG x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SN7PR11MB6728.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230028)(376002)(39860400002)(366004)(136003)(346002)(396003)(451199021)(71200400001)(41300700001)(19627405001)(66446008)(91956017)(64756008)(76116006)(66556008)(66476007)(66946007)(2906002)(52536014)(26005)(186003)(478600001)(316002)(7696005)(6916009)(5660300002)(8936002)(8676002)(53546011)(9686003)(6506007)(55016003)(83380400001)(33656002)(86362001)(38070700005)(122000001)(82960400001)(38100700002);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?hwvzTxB9VkPwTCkuYmqHYhIu4Yxw6tiWifEDJe5egdXUfigY8VxS3PQ7Du?= =?iso-8859-1?Q?wZx4wa4NPNeRiD5M4yXbyLBm8k+TDTtgIv+ZIeuuutHuF1gHi9Vh8hqXGk?= =?iso-8859-1?Q?TUGcodFzY301+HGGaHpTuFW7eRfKwMdVNkeHNFdl+uqCZG+RcTDygbHr/c?= =?iso-8859-1?Q?13aaHcMTbiwLZao4CSbsCNunv4XcVOppXRkVZULiJMqgi64HcRfmLwvFQf?= =?iso-8859-1?Q?hyRwiHruNGYGlD2CaVqspOcm6O0Tq68WeslBW7cGKRMJ2lZp7gyknt98oc?= =?iso-8859-1?Q?mPm0JFt1ryrwuu8UJyLxvCbCcUKjrjmt8MWSobSYOkg4ILq7KvrmaO1w3R?= =?iso-8859-1?Q?LlPeORqZNLdoHuWPznCOZZ5NCxzr66l4pAy17C3WjxmtDM1a7wNbEctqwy?= =?iso-8859-1?Q?8IjzWz+HQsUkghiDxHrQJl5lJa/TE49blFVY+tjiDer9+Ti5FfSyCOD4z8?= =?iso-8859-1?Q?yitgKsUiLOXiI50orE4PZoQrDXhkGahEVjqB5KDZPzkooezCvcOkW6xgwL?= =?iso-8859-1?Q?9xm5aqQ3+TRtJuKeE94WTsgHynB/Tr+d0xamXSYtXDXySHxWacNvWXgYrc?= =?iso-8859-1?Q?XQImOZGwgDf4y8Mb7R8mPoZX0kXAFl8wDPULZioBFkWyaE/c1OlcXBrBVx?= =?iso-8859-1?Q?oXAq3aY7TXwelYmIHV7e1tpRmZvHuMCg60gstqpQ7t8mF80HUcX4AmB4+Z?= =?iso-8859-1?Q?GNQlY5zVToDAWgAOz5CAmwBJHcz74+YyXcTcRBHTS0r2Mk2TNKyYaVs6y+?= =?iso-8859-1?Q?Fj57vFVptMSfZdussV1MU7RqdUVbUBe33ERPT5tRUh1XJWdrJtcKIz1+de?= =?iso-8859-1?Q?1kYsVQPu/OPuDxAuEsTyU1ZrC9oU3j+u9wnUiJvzY/OkpIxcBcloYXy77E?= =?iso-8859-1?Q?GbB97+7aqTjA+Trjxkx2T1PZAofg0Z2vQk6rTxudV8dVbHN85nQOSqGL3Z?= =?iso-8859-1?Q?YSU8T/FL7N/FgkUw8pTyoBluKQwYrtwGhLgPuq6Z+ZGFKrM3PT+gfsLuLR?= =?iso-8859-1?Q?JyfSYoasREFbObIypDwzthpsNhahbjxomdXgB1ceSgKwbdnpVr9MhUfDpD?= =?iso-8859-1?Q?5ZXcWT5IvZ8OdoQEH1BJZ9loT92KBcxwgWReIreVd4uWsGVEnt6FMu7IBR?= =?iso-8859-1?Q?Rn/p32w+GRG6jd7qjf9cW4R5UEdIS475jCT7OqBjREvzWMbkrR/mNBrK7N?= =?iso-8859-1?Q?cbIEu1vb9pPNji8uYEGgRhHR5xMHzTl3RLAY9/keiqrMfjoxMa52KiRN06?= =?iso-8859-1?Q?TOhghI3AWIM6xFsqPtSAfaGb11Sp0u+KSWyfRaUdzElcwRL8hViCSxJIyb?= =?iso-8859-1?Q?kbYo/tBnqx06MJMH8XbZmMn8PQ/DIZ2+JdOGNoFnS+aXDZ1KGFXT2xEzUr?= =?iso-8859-1?Q?7SX/Lp+3Evvm/OP7T4uIEAAw24aP3414OFeP7xlzbvXA/Rqvhh8DM0s8t0?= =?iso-8859-1?Q?ZlVDZBCxKKAuCOP4Fhx0WnifCguFdEqx721uxZkffhJ1Wg/mzrFmtxcMwl?= =?iso-8859-1?Q?3BiOYg2HMPCxUmpx4TabT5eB6+Kg6ps+zHupMBKHdIOzPwoctakjMazqMX?= =?iso-8859-1?Q?vGx0by9sB+N6EK5qzXvxrwNI3sfw5mh3jrqAzwb6FITseiHIrquce/32F8?= =?iso-8859-1?Q?jjtuoHUqF/Vjq1I5cEonjZHeKUnXafDHfq?= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SN7PR11MB6728.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: af80d380-9c1b-49e8-9420-08db5beb0265 X-MS-Exchange-CrossTenant-originalarrivaltime: 24 May 2023 00:08:31.8670 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: ztGAhja/zBzK9/ZQE3r0tUmxFgVsk9wpduzF4IOOqnV2xvYfNoTvOyQmvm2R9p4wIySarHut3usXoN77VwdwDw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA0PR11MB4687 Return-Path: nolan.hergert@intel.com X-OriginatorOrg: intel.com Content-Language: en-US Content-Type: multipart/alternative; boundary="_000_SN7PR11MB67280F200E1EE1718471AEE7F8419SN7PR11MB6728namp_" --_000_SN7PR11MB67280F200E1EE1718471AEE7F8419SN7PR11MB6728namp_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable >>From 4282ca25cde475a4ec2b81c5e878414a5829f88b Mon Sep 17 00:00:00 2001 Message-Id: <4282ca25cde475a4ec2b81c5e878414a5829f88b.1684880087.git.nolan.= hergert@intel.com> In-Reply-To: References: From: Nolan Hergert Date: Fri, 19 May 2023 14:58:00 -0700 Subject: [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. Signed-off-by: Nolan Hergert --- 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/Ha= nd/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 =3D 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 =3D=3D NULL) || (*DevicePath =3D=3D NULL)) { + if ((DevicePath =3D=3D NULL) || (*DevicePath =3D=3D NULL) || (Device =3D= =3D NULL)) { return EFI_INVALID_PARAMETER; } + if (gFilePathCache !=3D NULL) { + Size =3D GetDevicePathSize (gFilePathCache) - sizeof (EFI_DEVICE= _PATH_PROTOCOL); + SourceSize =3D GetDevicePathSize (*DevicePath) - sizeof (EFI_DEVICE_PA= TH_PROTOCOL); + + if ((Size =3D=3D SourceSize) && (CompareMem (gFilePathCache, *DevicePa= th, (UINTN)Size) =3D=3D 0)) { + *Device =3D gDeviceHandleCache; + *DevicePath =3D gOutgoingDevicePathCache; + return EFI_SUCCESS; + } + } + Handles =3D NULL; BestDevice =3D NULL; SourcePath =3D *DevicePath; @@ -541,10 +556,6 @@ CoreLocateDevicePath ( return EFI_NOT_FOUND; } - if (Device =3D=3D NULL) { - return EFI_INVALID_PARAMETER; - } - *Device =3D BestDevice; // diff --git a/MdeModulePkg/Core/Dxe/Image/Image.c b/MdeModulePkg/Core/Dxe/Im= age/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 =3D NULL; +LOADED_IMAGE_PRIVATE_DATA *mCurrentImage =3D NULL; +EFI_DEVICE_PATH_PROTOCOL *gFilePathCache =3D NULL; +EFI_DEVICE_PATH_PROTOCOL *gOutgoingDevicePathCache =3D NULL; +EFI_HANDLE gDeviceHandleCache =3D NULL; typedef struct { LIST_ENTRY Link; @@ -1219,7 +1222,10 @@ CoreLoadImageCommon ( Node =3D NULL; Status =3D CoreLocateDevicePath (&gEfiFirmwareVolume2ProtocolGuid, &Ha= ndleFilePath, &DeviceHandle); if (!EFI_ERROR (Status)) { - ImageIsFromFv =3D TRUE; + ImageIsFromFv =3D TRUE; + gFilePathCache =3D FilePath; + gOutgoingDevicePathCache =3D HandleFilePath; + gDeviceHandleCache =3D DeviceHandle; } else { HandleFilePath =3D FilePath; Status =3D CoreLocateDevicePath (&gEfiSimpleFileSystemProtoc= olGuid, &HandleFilePath, &DeviceHandle); @@ -1497,6 +1503,11 @@ Done: Image->LoadImageStatus =3D Status; } + // Clear cache + gFilePathCache =3D NULL; + gOutgoingDevicePathCache =3D NULL; + gDeviceHandleCache =3D NULL; + return Status; } -- 2.38.1.windows.1 --_000_SN7PR11MB67280F200E1EE1718471AEE7F8419SN7PR11MB6728namp_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
>>From 4282ca25cde475a4ec2b81c5e878414a5829f88b Mon Sep 17 00:00:00 2001
Message-Id: <4282ca25cde475a4ec2b81c5e8784= 14a5829f88b.1684880087.git.nolan.hergert@intel.com>
In-Reply-To: <cover.1684880087.git.nolan.h= ergert@intel.com>
References: <cover.1684880087.git.nolan.he= rgert@intel.com>
From: Nolan Hergert <nolan.hergert@intel.c= om>
Date: Fri, 19 May 2023 14:58:00 -0700
Subject: [PATCH 1/1] MdeModulePkg: Cache devi= ce 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 c= alls to LoadImage (>250),
this change will improve the boot time by >= ;10ms.

Signed-off-by: Nolan Hergert <nolan.herger= t@intel.com>
---
 MdeModulePkg/Core/Dxe/Hand/Locate.c | 2= 1 ++++++++++++++++-----
 MdeModulePkg/Core/Dxe/Image/Image.c | 1= 5 +++++++++++++--
 2 files changed, 29 insertions(+), 7 de= letions(-)

diff --git a/MdeModulePkg/Core/Dxe/Hand/Locat= e.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: B= SD-2-Clause-Patent
 //
 UINTN  mEfiLocateHandleRequest =3D= 0;
 
+extern EFI_DEVICE_PATH_PROTOCOL  *gFile= PathCache;
+extern EFI_HANDLE        = ;        gDeviceHandleCache;
+extern EFI_DEVICE_PATH_PROTOCOL  *gOutg= oingDevicePathCache;
+
 //
 // Internal prototypes
 //
@@ -467,10 +471,21 @@ CoreLocateDevicePath (<= /div>
     return EFI_INVALID_PARAME= TER;
   }
 
-  if ((DevicePath =3D=3D NULL) || (*Dev= icePath =3D=3D NULL)) {
+  if ((DevicePath =3D=3D NULL) || (*Dev= icePath =3D=3D NULL) || (Device =3D=3D NULL)) {
     return EFI_INVALID_PARAME= TER;
   }
 
+  if (gFilePathCache !=3D NULL) {
+    Size       =3D = GetDevicePathSize (gFilePathCache) - sizeof (EFI_DEVICE_PATH_PROTOCOL);
+    SourceSize =3D GetDevicePathSi= ze (*DevicePath) - sizeof (EFI_DEVICE_PATH_PROTOCOL);
+
+    if ((Size =3D=3D SourceSize) &= amp;& (CompareMem (gFilePathCache, *DevicePath, (UINTN)Size) =3D=3D 0))= {
+      *Device     = =3D gDeviceHandleCache;
+      *DevicePath =3D gOutgoi= ngDevicePathCache;
+      return EFI_SUCCESS;
+    }
+  }
+
   Handles       =3D= NULL;
   BestDevice    =3D NULL= ;
   SourcePath    =3D *Dev= icePath;
@@ -541,10 +556,6 @@ CoreLocateDevicePath (
     return EFI_NOT_FOUND;
   }
 
-  if (Device =3D=3D NULL) {
-    return EFI_INVALID_PARAMETER;<= /div>
-  }
-
   *Device =3D BestDevice;
 
   //
diff --git a/MdeModulePkg/Core/Dxe/Image/Imag= e.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: B= SD-2-Clause-Patent
 //
 // Module Globals
 //
-LOADED_IMAGE_PRIVATE_DATA  *mCurrentIma= ge =3D NULL;
+LOADED_IMAGE_PRIVATE_DATA  *mCurrentIma= ge            =3D NULL;
+EFI_DEVICE_PATH_PROTOCOL   *gFilePathCa= che           =3D NULL;
+EFI_DEVICE_PATH_PROTOCOL   *gOutgoingDe= vicePathCache =3D NULL;
+EFI_HANDLE          = ;       gDeviceHandleCache        =3D NU= LL;
 
 typedef struct {
   LIST_ENTRY       =                      = ;  Link;
@@ -1219,7 +1222,10 @@ CoreLoadImageCommon (<= /div>
     Node   =3D NULL;
     Status =3D CoreLocateDevi= cePath (&gEfiFirmwareVolume2ProtocolGuid, &HandleFilePath, &Dev= iceHandle);
     if (!EFI_ERROR (Status)) = {
-      ImageIsFromFv =3D TRUE;=
+      ImageIsFromFv   &n= bsp;        =3D TRUE;
+      gFilePathCache   &= nbsp;       =3D FilePath;
+      gOutgoingDevicePathCach= e =3D HandleFilePath;
+      gDeviceHandleCache &nbs= p;     =3D DeviceHandle;
     } else {
       HandleFilePath =3D= FilePath;
       Status   &nbs= p;     =3D CoreLocateDevicePath (&gEfiSimpleFileSystemProtoco= lGuid, &HandleFilePath, &DeviceHandle);
@@ -1497,6 +1503,11 @@ Done:
     Image->LoadImageStatus= =3D Status;
   }
 
+  // Clear cache
+  gFilePathCache       &= nbsp;   =3D NULL;
+  gOutgoingDevicePathCache =3D NULL;
+  gDeviceHandleCache     &nbs= p; =3D NULL;
+
   return Status;
 }
 
--
2.38.1.windows.1


--_000_SN7PR11MB67280F200E1EE1718471AEE7F8419SN7PR11MB6728namp_--