]> git.proxmox.com Git - mirror_edk2.git/commit
UefiCpuPkg/MpInitLib: Don't increase CpuCount in ApWakeupFunction
authorRay Ni <ray.ni@intel.com>
Thu, 28 Jan 2021 05:03:54 +0000 (13:03 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Fri, 29 Jan 2021 03:09:35 +0000 (03:09 +0000)
commitc6be6dab9c4bdf135bc02b61ecc304d5511c3588
tree9a94d2194d0a5d52481eba6d54cbd3a4b8dc828f
parent2d6fc9d36fd5ff15972bedab919f37bb4ee951d0
UefiCpuPkg/MpInitLib: Don't increase CpuCount in ApWakeupFunction

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3179

When BSP first time wakes all APs, each AP atomically increases
CpuMpData->CpuCount and CpuMpData->FinishedCount.

Each AP atomically increases CpuMpData->NumApsExecuting
in early assembly code and decreases it before it enters to HLT or
MWAIT state.

Putting them together, the 3 variables are changed in the following order:
1. NumApsExecuting++ // in assembly
2. CpuCpunt++
4. FinishedCount++
3. NumApsExecuting-- // in C

BSP waits for a certain timeout and then polls NumApsExecuting
until it drops to zero. It assumes all APs are waken up concurrently
and NumApsExecuting only drops to zero when all APs have checked in.

Then it additionally waits for FinishedCount == CpuCount - 1. (FinishedCount doesn't include BSP while CpuCount includes BSP.)

There is no need to additionally wait for
FinishedCount == CpuCount - 1 because when NumApsExecuting == 0,
the number of increament of FinishedCount and CpuCount should equal.

This patch simplifies the code to remove "CpuCount++" in
ApWakeupFunction() and
assigns FinishedCount + 1 to CpuCount after WakeUpAP().

Signed-off-by: Ray Ni <ray.ni@intel.com>
Reviewed-by: Eric Dong <eric.dong@intel.com>
Acked-by: Laszlo Ersek <lersek@redhat.com>
UefiCpuPkg/Library/MpInitLib/MpLib.c