Eric,


Current implementation does not call GetApicid() many times,  Please correct 
you commit message. Your fix is to improve the performance against the current 
implementation.



This code part is ok to me.

Reviewed-by: Jeff Fan [email protected]<mailto:[email protected]>



Thanks!

Jeff



发送自 Windows 10 版邮件<https://go.microsoft.com/fwlink/?LinkId=550986>应用



________________________________
发件人: Eric Dong <[email protected]>
发送时间: Wednesday, July 4, 2018 4:37:36 PM
收件人: [email protected]
抄送: Ruiyu Ni; Jeff Fan; Laszlo Ersek
主题: [Patch] UefiCpuPkg/MpInitLib: Optimize get processor number performance.

Current function has low performance because it calls GetApicId
many times.

New logic first try to base on the stack range used by AP to
find the processor number. If this solution failed, then call
GetApicId once and base on this value to search the processor.

Cc: Ruiyu Ni <[email protected]>
Cc: Jeff Fan <[email protected]>
Cc: Laszlo Ersek <[email protected]>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Eric Dong <[email protected]>
---
 UefiCpuPkg/Library/MpInitLib/MpLib.c | 25 ++++++++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c 
b/UefiCpuPkg/Library/MpInitLib/MpLib.c
index eb2765910c..abd65bee1a 100644
--- a/UefiCpuPkg/Library/MpInitLib/MpLib.c
+++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c
@@ -418,7 +418,8 @@ ApInitializeSync (
 }

 /**
-  Find the current Processor number by APIC ID.
+  First try to find the current Processor number by stack address,
+  if it failed, then base on APIC ID.

   @param[in]  CpuMpData         Pointer to PEI CPU MP Data
   @param[out] ProcessorNumber   Return the pocessor number found
@@ -435,16 +436,34 @@ GetProcessorNumber (
   UINTN                   TotalProcessorNumber;
   UINTN                   Index;
   CPU_INFO_IN_HOB         *CpuInfoInHob;
+  UINT32                  CurrentApicId;

+  TotalProcessorNumber = CpuMpData->CpuCount;
   CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;

-  TotalProcessorNumber = CpuMpData->CpuCount;
+  //
+  // First try to base on current stack address to find the AP index.
+  // &TotalProcessorNumber value located in the stack range.
+  //
   for (Index = 0; Index < TotalProcessorNumber; Index ++) {
-    if (CpuInfoInHob[Index].ApicId == GetApicId ()) {
+    if ((CpuInfoInHob[Index].ApTopOfStack > (UINTN) (&TotalProcessorNumber)) &&
+        (CpuInfoInHob[Index].ApTopOfStack - CpuMpData->CpuApStackSize < 
(UINTN) (&TotalProcessorNumber))) {
       *ProcessorNumber = Index;
       return EFI_SUCCESS;
     }
   }
+
+  //
+  // If can't base on stack to find the AP index, use the APIC ID.
+  //
+  CurrentApicId = GetApicId ();
+  for (Index = 0; Index < TotalProcessorNumber; Index ++) {
+    if (CpuInfoInHob[Index].ApicId == CurrentApicId) {
+      *ProcessorNumber = Index;
+      return EFI_SUCCESS;
+    }
+  }
+
   return EFI_NOT_FOUND;
 }

--
2.15.0.windows.1

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to