audk/UefiCpuPkg/Library
Ray Ni 62f2cf5784 UefiCpuPkg/MpInitLib: Use XADD to avoid lock acquire/release
When AP firstly wakes up, MpFuncs.nasm contains below logic to assign
an unique ApIndex to each AP according to who comes first:
---ASM---
TestLock:
    xchg       [edi], eax
    cmp        eax, NotVacantFlag
    jz         TestLock

    mov        ecx, esi
    add        ecx, ApIndexLocation
    inc        dword [ecx]
    mov        ebx, [ecx]

Releaselock:
    mov        eax, VacantFlag
    xchg       [edi], eax
---ASM END---

"lock inc" cannot be used to increase ApIndex because not only the
global ApIndex should be increased, but also the result should be
stored to a local general purpose register EBX.

This patch learns from the NASM implementation of
InternalSyncIncrement() to use "XADD" instruction which can increase
the global ApIndex and store the original ApIndex to EBX in one
instruction.

With this patch, OVMF when running in a 255 threads QEMU spends about
one second to wakeup all APs. Original implementation needs more than
10 seconds.

Signed-off-by: Ray Ni <ray.ni@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Rahul Kumar <rahul1.kumar@intel.com>
Reviewed-by: Michael D Kinney <michael.d.kinney@intel.com>
Acked-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Eric Dong <eric.dong@intel.com>
2021-02-26 11:51:37 +00:00
..
BaseUefiCpuLib UefiCpuPkg: Move StandardSignatureIsAuthenticAMD to BaseUefiCpuLib 2020-07-07 23:25:16 +00:00
BaseXApicLib UefiCpuPkg: Move StandardSignatureIsAuthenticAMD to BaseUefiCpuLib 2020-07-07 23:25:16 +00:00
BaseXApicX2ApicLib UefiCpuPkg: Move StandardSignatureIsAuthenticAMD to BaseUefiCpuLib 2020-07-07 23:25:16 +00:00
CpuCacheInfoLib UefiCpuPkg/CpuCacheInfoLib: Support no enabled AP case in DxeLib 2021-02-03 07:41:46 +00:00
CpuCommonFeaturesLib UefiCpuPkg/CpuCommonFeaturesLib: Fix spelling mistake 2020-08-03 16:31:36 +00:00
CpuExceptionHandlerLib UefiCpuPkg: SmmCpuExceptionHandlerLib: Added StandaloneMm module support 2021-02-01 10:07:13 -08:00
CpuTimerLib UefiCpuPkg: Adding a new TSC library by using CPUID(0x15) TSC leaf 2019-08-21 21:36:56 +08:00
MpInitLib UefiCpuPkg/MpInitLib: Use XADD to avoid lock acquire/release 2021-02-26 11:51:37 +00:00
MpInitLibUp UefiCpuPkg/MpInitLibUp: Add MpInitLibStartupAllCPUs API. 2019-07-29 09:25:20 +08:00
MtrrLib UefiCpuPkg/MtrrLibUnitTest: Change to use static array for CI test 2020-08-12 11:38:37 +00:00
PlatformSecLibNull UefiCpuPkg: Replace BSD License with BSD+Patent License 2019-04-09 10:58:28 -07:00
RegisterCpuFeaturesLib UefiCpuPkg RegisterCpuFeaturesLib: NumberOfCpus may be uninitialized 2021-01-21 14:30:06 +00:00
SecPeiDxeTimerLibUefiCpu UefiCpuPkg: Replace BSD License with BSD+Patent License 2019-04-09 10:58:28 -07:00
SmmCpuFeaturesLib UefiCpuPkg/SmmCpuFeaturesLib: Add Tiger Lake support 2020-12-08 23:07:22 +00:00
SmmCpuPlatformHookLibNull UefiCpuPkg: Replace BSD License with BSD+Patent License 2019-04-09 10:58:28 -07:00
VmgExitLibNull UefiCpuPkg, OvmfPkg: Disable interrupts when using the GHCB 2020-11-10 19:07:55 +00:00