From: Laszlo Ersek <lersek@redhat.com>
To: edk2-devel-01 <edk2-devel@ml01.01.org>
Cc: Igor Mammedov <imammedo@redhat.com>, Jeff Fan <jeff.fan@intel.com>
Subject: [PATCH 3/4] UefiCpuPkg/MpInitLib: allow platforms to provide a known CPU count upfront
Date: Tue, 22 Nov 2016 21:26:18 +0100 [thread overview]
Message-ID: <20161122202619.12594-4-lersek@redhat.com> (raw)
In-Reply-To: <20161122202619.12594-1-lersek@redhat.com>
On QEMU/KVM, the VCPU topology for a guest is specified dynamically. It
can be a low number or a high number.
Waiting for PcdCpuApInitTimeOutInMicroSeconds during the initial AP
collection is impractical, because in a VM, the time needed for an AP to
wake up can vary widely:
- if the APs report back quickly, then we could be wasting time,
- if the APs report back late (due to scheduling artifacts or VCPU
over-subscription on the virtualization host), then the timeout can
elapse before all APs increment CpuMpData->CpuCount in
ApWakeupFunction().
Trying to set PcdCpuApInitTimeOutInMicroSeconds dynamically is also
impractical, as scheduling artifacts on the KVM host may delay AP threads
arbitrarily.
Instead, allow OVMF (and other platforms) to tell MpInitLib the number of
boot-time CPUs in advance.
Cc: Igor Mammedov <imammedo@redhat.com>
Cc: Jeff Fan <jeff.fan@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
---
UefiCpuPkg/UefiCpuPkg.dec | 11 +++++++++++
UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf | 1 +
UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf | 4 ++--
UefiCpuPkg/Library/MpInitLib/MpLib.c | 16 ++++++++++++----
4 files changed, 26 insertions(+), 6 deletions(-)
diff --git a/UefiCpuPkg/UefiCpuPkg.dec b/UefiCpuPkg/UefiCpuPkg.dec
index ca560398bbef..35903c4386e4 100644
--- a/UefiCpuPkg/UefiCpuPkg.dec
+++ b/UefiCpuPkg/UefiCpuPkg.dec
@@ -225,5 +225,16 @@ [PcdsDynamic, PcdsDynamicEx]
# @ValidList 0x80000001 | 0
gUefiCpuPkgTokenSpaceGuid.PcdCpuHotPlugDataAddress|0x0|UINT64|0x60000011
+ ## On platforms where the number of boot-time CPUs can be dynamically
+ # retrieved from a platform-specific information source, the BSP does not
+ # have to wait for PcdCpuApInitTimeOutInMicroSeconds in order to detect all
+ # APs for the first time. On such platforms, this PCD specifies the number
+ # of CPUs available at boot. If the platform doesn't support this feature,
+ # this PCD should be set to 0. The platform is responsible for ensuring that
+ # this PCD is never set to a value larger than
+ # PcdCpuMaxLogicalProcessorNumber.
+ # @Prompt Known number of CPUs available at boot.
+ gUefiCpuPkgTokenSpaceGuid.PcdCpuKnownLogicalProcessorNumber|0|UINT32|0x60000012
+
[UserExtensions.TianoCore."ExtraFiles"]
UefiCpuPkgExtra.uni
diff --git a/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf b/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf
index 11b230174ec8..dc18eaf6152d 100644
--- a/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf
+++ b/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf
@@ -61,6 +61,7 @@ [Guids]
[Pcd]
gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber ## CONSUMES
+ gUefiCpuPkgTokenSpaceGuid.PcdCpuKnownLogicalProcessorNumber ## SOMETIMES_CONSUMES
gUefiCpuPkgTokenSpaceGuid.PcdCpuApInitTimeOutInMicroSeconds ## SOMETIMES_CONSUMES
gUefiCpuPkgTokenSpaceGuid.PcdCpuApStackSize ## CONSUMES
gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchAddress ## CONSUMES
diff --git a/UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf b/UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf
index 0c6873da79db..2bcfa70ae7e5 100644
--- a/UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf
+++ b/UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf
@@ -61,10 +61,10 @@ [Ppis]
[Pcd]
gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber ## CONSUMES
- gUefiCpuPkgTokenSpaceGuid.PcdCpuApInitTimeOutInMicroSeconds ## CONSUMES
+ gUefiCpuPkgTokenSpaceGuid.PcdCpuKnownLogicalProcessorNumber ## CONSUMES
+ gUefiCpuPkgTokenSpaceGuid.PcdCpuApInitTimeOutInMicroSeconds ## SOMETIMES_CONSUMES
gUefiCpuPkgTokenSpaceGuid.PcdCpuApStackSize ## CONSUMES
gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchAddress ## CONSUMES
gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize ## CONSUMES
gUefiCpuPkgTokenSpaceGuid.PcdCpuApLoopMode ## CONSUMES
gUefiCpuPkgTokenSpaceGuid.PcdCpuApTargetCstate ## SOMETIMES_CONSUMES
-
diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c
index 15dbfa1e7d6c..f7dfbd5bad13 100644
--- a/UefiCpuPkg/Library/MpInitLib/MpLib.c
+++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c
@@ -707,6 +707,7 @@ WakeUpAP (
CPU_AP_DATA *CpuData;
BOOLEAN ResetVectorRequired;
CPU_INFO_IN_HOB *CpuInfoInHob;
+ UINT32 KnownProcessorCount;
CpuMpData->FinishedCount = 0;
ResetVectorRequired = FALSE;
@@ -745,10 +746,17 @@ WakeUpAP (
SendInitSipiSipiAllExcludingSelf ((UINT32) ExchangeInfo->BufferStart);
}
if (CpuMpData->InitFlag == ApInitConfig) {
- //
- // Wait for all potential APs waken up in one specified period
- //
- MicroSecondDelay (PcdGet32(PcdCpuApInitTimeOutInMicroSeconds));
+ KnownProcessorCount = PcdGet32 (PcdCpuKnownLogicalProcessorNumber);
+ if (KnownProcessorCount > 0) {
+ while (CpuMpData->FinishedCount < (KnownProcessorCount - 1)) {
+ CpuPause ();
+ }
+ } else {
+ //
+ // Wait for all potential APs waken up in one specified period
+ //
+ MicroSecondDelay (PcdGet32(PcdCpuApInitTimeOutInMicroSeconds));
+ }
} else {
//
// Wait all APs waken up if this is not the 1st broadcast of SIPI
--
2.9.2
next prev parent reply other threads:[~2016-11-22 20:26 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-22 20:26 [PATCH 0/4] UefiCpuPkg, OvmfPkg: multiprocessing fixes and improvements Laszlo Ersek
2016-11-22 20:26 ` [PATCH 1/4] UefiCpuPkg/LocalApicLib: fix feature test for Extended Topology CPUID leaf Laszlo Ersek
2016-11-23 5:10 ` Fan, Jeff
2016-11-22 20:26 ` [PATCH 2/4] UefiCpuPkg/MpInitLib: " Laszlo Ersek
2016-11-23 5:10 ` Fan, Jeff
2016-11-22 20:26 ` Laszlo Ersek [this message]
2016-11-23 5:36 ` [PATCH 3/4] UefiCpuPkg/MpInitLib: allow platforms to provide a known CPU count upfront Fan, Jeff
2016-11-23 16:04 ` Laszlo Ersek
2016-11-24 1:18 ` Fan, Jeff
2016-11-24 9:36 ` Laszlo Ersek
2016-11-24 13:49 ` Fan, Jeff
2016-11-24 18:32 ` Igor Mammedov
2016-11-24 21:20 ` Laszlo Ersek
2016-11-22 20:26 ` [PATCH 4/4] OvmfPkg/PlatformPei: set PcdCpuKnownLogicalProcessorNumber for MpInitLib Laszlo Ersek
2016-11-23 20:43 ` [PATCH 0/4] UefiCpuPkg, OvmfPkg: multiprocessing fixes and improvements Laszlo Ersek
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=20161122202619.12594-4-lersek@redhat.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