On 02/28/20 04:05, Dong, Eric wrote:
> Hi Laszlo,
> 
> Thanks for your patch. The change make sense base on the comments in the data 
> structure header file.
> 
> I also checked all the code related to this data structure. The inputs for 
> this data structure are CpuS3DataDxe and RegisterCpuFeaturesLib. Both these 
> two drivers not support CPU hot plug feature, so the real inputs for 
> mAcpiCpuData.NumberOfCpus is the enabled CPU number in this system. So before 
> and after your code change, the CPU values are same. But the data structure 
> comments said it can support CPU hot plug, so I agree your code change.
> 
> Reviewed-by: Eric Dong <eric.d...@intel.com>

Thank you!

Please allow me one additional comment on CpuS3DataDxe however:

According to the comments in UefiCpuPkg/CpuS3DataDxe:

    [...] this module does not support hot plug CPUs.  This module can
    be copied into a CPU specific package and customized if these
    additional features are required [...]

in the last three patches of the series, I clone CpuS3DataDxe for
OvmfPkg, and extend it for CPU hotplug:

  [edk2-devel] [PATCH v2 14/16]
  OvmfPkg: clone CpuS3DataDxe from UefiCpuPkg

  [edk2-devel] [PATCH v2 15/16]
  OvmfPkg/CpuS3DataDxe: superficial cleanups

  [edk2-devel] [PATCH v2 16/16]
  OvmfPkg/CpuS3DataDxe: enable S3 resume after CPU hotplug

(This extension occurs in a QEMU-specific way -- in other words,
OvmfPkg/CpuS3DataDxe is really a platform driver.)

What I'm trying to say is: the PiSmmCpuDxeSmm changes from the present
patch *are* utilized in a CPU hotplug situation too.

In other words, PiSmmCpuDxeSmm is really exposed to a situation where
the following expression is TRUE:

  (FeaturePcdGet (PcdCpuHotPlugSupport) &&
   mNumberOfCpus < mAcpiCpuData.NumberOfCpus)

It is testable with OVMF, after this series is applied.

Thanks
Laszlo

> 
> Thanks,
> Eric
> 
> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Laszlo Ersek
> Sent: Thursday, February 27, 2020 6:12 AM
> To: edk2-devel-groups-io <devel@edk2.groups.io>
> Cc: Ard Biesheuvel <ard.biesheu...@linaro.org>; Dong, Eric 
> <eric.d...@intel.com>; Igor Mammedov <imamm...@redhat.com>; Yao, Jiewen 
> <jiewen....@intel.com>; Justen, Jordan L <jordan.l.jus...@intel.com>; Kinney, 
> Michael D <michael.d.kin...@intel.com>; Philippe Mathieu-Daudé 
> <phi...@redhat.com>; Ni, Ray <ray...@intel.com>
> Subject: [edk2-devel] [PATCH v2 02/16] UefiCpuPkg/PiSmmCpuDxeSmm: fix S3 
> Resume for CPU hotplug
> 
> The "ACPI_CPU_DATA.NumberOfCpus" field is specified as follows, in 
> "UefiCpuPkg/Include/AcpiCpuData.h" (rewrapped for this commit message):
> 
>   //
>   // The number of CPUs.  If a platform does not support hot plug CPUs,
>   // then this is the number of CPUs detected when the platform is booted,
>   // regardless of being enabled or disabled.  If a platform does support
>   // hot plug CPUs, then this is the maximum number of CPUs that the
>   // platform supports.
>   //
> 
> The InitializeCpuBeforeRebase() and InitializeCpuAfterRebase() functions in 
> "UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c" try to restore CPU configuration on the 
> S3 Resume path for *all* CPUs accounted for in "ACPI_CPU_DATA.NumberOfCpus". 
> This is wrong, as with CPU hotplug, not all of the possible CPUs may be 
> present at the time of S3 Suspend / Resume.
> The symptom is an infinite wait.
> 
> Instead, the "mNumberOfCpus" variable should be used, which is properly 
> maintained through the EFI_SMM_CPU_SERVICE_PROTOCOL implementation (see 
> SmmAddProcessor(), SmmRemoveProcessor(), SmmCpuUpdate() in 
> "UefiCpuPkg/PiSmmCpuDxeSmm/CpuService.c").
> 
> When CPU hotplug is disabled, "mNumberOfCpus" is constant, and equals 
> "ACPI_CPU_DATA.NumberOfCpus" at all times.
> 
> Cc: Ard Biesheuvel <ard.biesheu...@linaro.org>
> Cc: Eric Dong <eric.d...@intel.com>
> Cc: Igor Mammedov <imamm...@redhat.com>
> Cc: Jiewen Yao <jiewen....@intel.com>
> Cc: Jordan Justen <jordan.l.jus...@intel.com>
> Cc: Michael Kinney <michael.d.kin...@intel.com>
> Cc: Philippe Mathieu-Daudé <phi...@redhat.com>
> Cc: Ray Ni <ray...@intel.com>
> Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=1512
> Signed-off-by: Laszlo Ersek <ler...@redhat.com>
> Acked-by: Ard Biesheuvel <ard.biesheu...@linaro.org>
> ---
> 
> Notes:
>     v2:
>     
>     - Pick up Ard's Acked-by, which is conditional on approval from Intel
>       reviewers on Cc. (I'd like to save Ard the churn of re-acking
>       unmodified patches.)
> 
>  UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c | 14 ++++++++++++--
>  1 file changed, 12 insertions(+), 2 deletions(-)
> 
> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c 
> b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c
> index ba5cc0194c2d..1e0840119724 100644
> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c
> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c
> @@ -597,75 +597,85 @@ PrepareApStartupVector (  }
>
>  /**
>    The function is invoked before SMBASE relocation in S3 path to restores 
> CPU status.
>
>    The function is invoked before SMBASE relocation in S3 path. It does first 
> time microcode load
>    and restores MTRRs for both BSP and APs.
>
>  **/
>  VOID
>  InitializeCpuBeforeRebase (
>    VOID
>    )
>  {
>    LoadMtrrData (mAcpiCpuData.MtrrTable);
>
>    SetRegister (TRUE);
>
>    ProgramVirtualWireMode ();
>
>    PrepareApStartupVector (mAcpiCpuData.StartupVector);
>
> -  mNumberToFinish = mAcpiCpuData.NumberOfCpus - 1;
> +  if (FeaturePcdGet (PcdCpuHotPlugSupport)) {
> +    ASSERT (mNumberOfCpus <= mAcpiCpuData.NumberOfCpus);  } else {
> +    ASSERT (mNumberOfCpus == mAcpiCpuData.NumberOfCpus);  }
> + mNumberToFinish = mNumberOfCpus - 1;
>    mExchangeInfo->ApFunction  = (VOID *) (UINTN) InitializeAp;
>
>    //
>    // Execute code for before SmmBaseReloc. Note: This flag is maintained 
> across S3 boots.
>    //
>    mInitApsAfterSmmBaseReloc = FALSE;
>
>    //
>    // Send INIT IPI - SIPI to all APs
>    //
>    SendInitSipiSipiAllExcludingSelf ((UINT32)mAcpiCpuData.StartupVector);
>
>    while (mNumberToFinish > 0) {
>      CpuPause ();
>    }
>  }
>
>  /**
>    The function is invoked after SMBASE relocation in S3 path to restores CPU 
> status.
>
>    The function is invoked after SMBASE relocation in S3 path. It restores 
> configuration according to
>    data saved by normal boot path for both BSP and APs.
>
>  **/
>  VOID
>  InitializeCpuAfterRebase (
>    VOID
>    )
>  {
> -  mNumberToFinish = mAcpiCpuData.NumberOfCpus - 1;
> +  if (FeaturePcdGet (PcdCpuHotPlugSupport)) {
> +    ASSERT (mNumberOfCpus <= mAcpiCpuData.NumberOfCpus);  } else {
> +    ASSERT (mNumberOfCpus == mAcpiCpuData.NumberOfCpus);  }
> + mNumberToFinish = mNumberOfCpus - 1;
>
>    //
>    // Signal that SMM base relocation is complete and to continue 
> initialization for all APs.
>    //
>    mInitApsAfterSmmBaseReloc = TRUE;
>
>    //
>    // Must begin set register after all APs have continue their 
> initialization.
>    // This is a requirement to support semaphore mechanism in register table.
>    // Because if semaphore's dependence type is package type, semaphore will 
> wait
>    // for all Aps in one package finishing their tasks before set next 
> register
>    // for all APs. If the Aps not begin its task during BSP doing its task, 
> the
>    // BSP thread will hang because it is waiting for other Aps in the same
>    // package finishing their task.
>    //
>    SetRegister (FALSE);
>
>    while (mNumberToFinish > 0) {
>      CpuPause ();
>    }
>  }
>
> --
> 2.19.1.3.g30247aa5d201
> 
> 
> 
> 
> 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#55080): https://edk2.groups.io/g/devel/message/55080
Mute This Topic: https://groups.io/mt/71575170/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to