On 11/24/16 02:18, Fan, Jeff wrote: > Laszlo, > > Please use existing PcdCpuMaxLogicalProcessorNumber firstly.
Okay, I will submit a new version of the series with this change. > So, for the platforms do not support CPU hot-plug. It could benefit the boot > performance. > For the platforms supporting CPU hot-plug. It will have no any impact. > > Introducing new PCD is good idea to benefit boot performance on S3 path, but > it is some complex. > For example, if DXE phase disables some CPU and do reboot. Real platform may > need another policy to set this PCD used by PEI phase. > > Could you file one bugzilla for this new PCD requirement? I filed <https://bugzilla.tianocore.org/show_bug.cgi?id=251> and assigned it to you; I hope that's alright. Feel free to edit the BZ title; I might not have captured the use case exactly. Thanks! Laszlo > Thanks! > Jeff > > -----Original Message----- > From: Laszlo Ersek [mailto:[email protected]] > Sent: Thursday, November 24, 2016 12:05 AM > To: Fan, Jeff; edk2-devel-01 > Cc: Igor Mammedov > Subject: Re: [PATCH 3/4] UefiCpuPkg/MpInitLib: allow platforms to provide a > known CPU count upfront > > On 11/23/16 06:36, Fan, Jeff wrote: >> Laszlo, >> >> I ever submitted one bugzilla for such request at >> https://bugzilla.tianocore.org/show_bug.cgi?id=116 > > Huh, I didn't know about that. :) > >> My point is not to add new PCD and just to use existing PCD >> PcdCpuMaxLogicalProcessorNumber that supports dynamic type. >> >> Platform Peim could update it is platform pei module before memory ready. >> >> MpInitLib just exits from wait loop once the discovered processors >> number reaches the PcdCpuMaxLogicalProcessorNumber. >> >> Does it meet your requirement? > > This was the first idea I had as well, yes. However, I considered the > following case: > > - QEMU is started (and the guest is booted) with N online processors and M > > N *possible* processors. > > - During OS runtime, the user hotplugs one or more additional processors, so > that the number of currently online processors is now larger than N. > > - The user suspends and resumes (S3) the virtual machine. > > - During S3 resume, QEMU will report the increased number of boot processors. > (At S3 resume, QEMU specifically refreshes the fw_cfg item that returns this > value to the firmware, from the increased number of > VCPUs.) > > - During S3 resume, we cannot modify PcdCpuMaxLogicalProcessorNumber any > longer, because the UefiCpuPkg modules that consume the PCD have already > allocated their data structures using the first (lower) value. Those > allocations cannot be resized / extended during S3 resume. > > So the idea is, set PcdCpuMaxLogicalProcessorNumber statically to the number > of the expected maximum VCPU count, which will ensure the proper allocations > during first boot. Then allow PcdCpuKnownLogicalProcessorNumber to change -- > hot-unplug is also possible -- from normal boot to S3 resume. > > (The concept of "expected maximum" is not specific to VCPU hotplug in QEMU, > it applies to memory (DIMM) hotplug and memory ballooning as well.) > > Of course, I don't know (or expect) that the UefiCpuPkg modules fully support > this use case right now; it's just that I didn't want to > *prevent* this use case. So I figured I'd preserve the original role of > PcdCpuMaxLogicalProcessorNumber, and introduce a more dynamic value for the > "current boot VCPU count". > > Do you agree that it makes sense to keep these quantities separate? > > If you think we should just set PcdCpuMaxLogicalProcessorNumber dynamically > at this point, and introduce no new PCD for now, I can do that too. I just > wanted to make sure that we discuss VCPU hot-plug / hot-unplug and S3 resume > first. > > Thanks! > Laszlo > >> >> Thanks! >> Jeff >> >> -----Original Message----- >> From: Laszlo Ersek [mailto:[email protected]] >> Sent: Wednesday, November 23, 2016 4:26 AM >> To: edk2-devel-01 >> Cc: Igor Mammedov; Fan, Jeff >> Subject: [PATCH 3/4] UefiCpuPkg/MpInitLib: allow platforms to provide >> a known CPU count upfront >> >> 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 <[email protected]> >> Cc: Jeff Fan <[email protected]> >> Contributed-under: TianoCore Contribution Agreement 1.0 >> Signed-off-by: Laszlo Ersek <[email protected]> >> --- >> 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|0x600000 >> 11 >> >> + ## 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 >> + |0 >> + x60000012 >> + >> [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 >> >> > _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

