From: Laszlo Ersek <lersek@redhat.com>
To: Eric Dong <eric.dong@intel.com>, edk2-devel@lists.01.org
Cc: Ruiyu Ni <ruiyu.ni@intel.com>
Subject: Re: [Patch v2 1/2] UefiCpuPkg/RegisterCpuFeaturesLib: Avoid AP calls PeiService.
Date: Wed, 26 Dec 2018 23:16:05 +0100 [thread overview]
Message-ID: <b7e3ed96-547c-1199-edcd-ea8b0b82d58e@redhat.com> (raw)
In-Reply-To: <20181224021236.12976-2-eric.dong@intel.com>
On 12/24/18 03:12, Eric Dong wrote:
> GetProcessorIndex function calls GetMpPpi to get the MP Ppi.
> Ap will calls GetProcessorIndex function which final let AP
> calls PeiService.
>
> This patch avoid GetProcessorIndex call PeiService.
>
> BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1411
>
> Cc: Ruiyu Ni <ruiyu.ni@intel.com>
> Cc: Laszlo Ersek <lersek@redhat.com>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Eric Dong <eric.dong@intel.com>
> ---
> .../RegisterCpuFeaturesLib/CpuFeaturesInitialize.c | 2 +-
> .../DxeRegisterCpuFeaturesLib.c | 6 ++++--
> .../PeiRegisterCpuFeaturesLib.c | 21 ++++++++++++++++-----
> .../RegisterCpuFeaturesLib/RegisterCpuFeatures.h | 6 +++++-
> 4 files changed, 26 insertions(+), 9 deletions(-)
There are a number of things I dislike about this patch:
>
> diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
> index 624ddee055..6dcc73765b 100644
> --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
> +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
> @@ -409,7 +409,7 @@ CollectProcessorData (
> CPU_FEATURES_DATA *CpuFeaturesData;
>
> CpuFeaturesData = (CPU_FEATURES_DATA *)Buffer;
> - ProcessorNumber = GetProcessorIndex ();
> + ProcessorNumber = GetProcessorIndex (CpuFeaturesData);
> CpuInfo = &CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo;
> //
> // collect processor information
> diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/DxeRegisterCpuFeaturesLib.c b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/DxeRegisterCpuFeaturesLib.c
> index 926698dc95..6f3e5bd2a8 100644
> --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/DxeRegisterCpuFeaturesLib.c
> +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/DxeRegisterCpuFeaturesLib.c
> @@ -66,11 +66,13 @@ GetMpProtocol (
> /**
> Worker function to return processor index.
>
> + @param CpuFeaturesData Cpu Feature Data structure.
> +
> @return The processor index.
> **/
> UINTN
> GetProcessorIndex (
> - VOID
> + IN CPU_FEATURES_DATA *CpuFeaturesData
> )
> {
> EFI_STATUS Status;
> @@ -225,7 +227,7 @@ CpuFeaturesInitialize (
>
> CpuFeaturesData = GetCpuFeaturesData ();
>
> - OldBspNumber = GetProcessorIndex();
> + OldBspNumber = GetProcessorIndex(CpuFeaturesData);
> CpuFeaturesData->BspNumber = OldBspNumber;
>
> Status = gBS->CreateEvent (
(1) In other parts of the patch, we use the opportunity to correct the
non-idiomatic parenthesizing style (that is, missing space). We miss
that here.
> diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.c b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.c
> index 0bb3dee8b6..0bbcb50181 100644
> --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.c
> +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.c
> @@ -96,20 +96,26 @@ GetMpPpi (
> /**
> Worker function to return processor index.
>
> + @param CpuFeaturesData Cpu Feature Data structure.
> +
> @return The processor index.
> **/
> UINTN
> GetProcessorIndex (
> - VOID
> + IN CPU_FEATURES_DATA *CpuFeaturesData
> )
> {
> EFI_STATUS Status;
> - EFI_PEI_MP_SERVICES_PPI *CpuMpPpi;
> UINTN ProcessorIndex;
> + EFI_PEI_MP_SERVICES_PPI *CpuMpPpi;
(2) This change looks unnecessary; it just grows the patch.
>
> - CpuMpPpi = GetMpPpi ();
> + ASSERT (CpuFeaturesData->CpuMpPpi != NULL);
> + if (CpuFeaturesData->CpuMpPpi == NULL) {
> + return (UINTN) (-1);
> + }
> + CpuMpPpi = (EFI_PEI_MP_SERVICES_PPI *)CpuFeaturesData->CpuMpPpi;
>
> - Status = CpuMpPpi->WhoAmI(GetPeiServicesTablePointer (), CpuMpPpi, &ProcessorIndex);
> + Status = CpuMpPpi->WhoAmI(NULL, CpuMpPpi, &ProcessorIndex);
(3) This exploits internal knowledge about the PPI WhoAmI member
implementation in CpuMpPei, namely that PeiWhoAmI() ignores "PeiServices".
I think this minimally deserves a comment.
> ASSERT_EFI_ERROR (Status);
> return ProcessorIndex;
> }
> @@ -286,6 +292,9 @@ GetNumberOfProcessor (
> {
> EFI_STATUS Status;
> EFI_PEI_MP_SERVICES_PPI *CpuMpPpi;
> + CPU_FEATURES_DATA *CpuFeaturesData;
> +
> + CpuFeaturesData = GetCpuFeaturesData();
>
> //
> // Get MP Services Protocol
> @@ -298,6 +307,8 @@ GetNumberOfProcessor (
> );
> ASSERT_EFI_ERROR (Status);
>
> + CpuFeaturesData->CpuMpPpi = CpuMpPpi;
> +
> //
> // Get the number of CPUs
> //
(4) I think it's pretty ugly to cache CpuMpPpi in the
GetNumberOfProcessor() function of the PEI instance of the library.
The function is called from CpuFeaturesDetect()
[RegisterCpuFeaturesLib.c] and GetAcpiCpuData() [CpuFeaturesInitialize.c].
Thus, caching CpuMpPpi right here doesn't make much sense to me, beyond
"it happens early enough, and doing it multiple times doesn't hurt".
I guess we can live with such a hack, but then a comment should be added.
Anyway, OVMF does not use this library class, so I'm neutral on this
patch, I just didn't want to ignore it altogether. I don't feel
comfortable acking the patch, given the hacks in it, but I also don't
intend to prevent it from going in. Please proceed with Ray's review.
I'll probably skip reviewing v3 if there's going to be one.
Thanks,
Laszlo
> @@ -329,7 +340,7 @@ CpuFeaturesInitialize (
>
> CpuFeaturesData = GetCpuFeaturesData ();
>
> - OldBspNumber = GetProcessorIndex();
> + OldBspNumber = GetProcessorIndex (CpuFeaturesData);
> CpuFeaturesData->BspNumber = OldBspNumber;
>
> //
> diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h
> index cf3da84837..19c3420511 100644
> --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h
> +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h
> @@ -85,6 +85,8 @@ typedef struct {
> UINTN BspNumber;
>
> PROGRAM_CPU_REGISTER_FLAGS CpuFlags;
> +
> + VOID *CpuMpPpi;
> } CPU_FEATURES_DATA;
>
> #define CPU_FEATURE_ENTRY_FROM_LINK(a) \
> @@ -108,11 +110,13 @@ GetCpuFeaturesData (
> /**
> Worker function to return processor index.
>
> + @param CpuFeaturesData Cpu Feature Data structure.
> +
> @return The processor index.
> **/
> UINTN
> GetProcessorIndex (
> - VOID
> + IN CPU_FEATURES_DATA *CpuFeaturesData
> );
>
> /**
>
next prev parent reply other threads:[~2018-12-26 22:16 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-24 2:12 [Patch v2 0/2] Avoid AP calls PeiService Eric Dong
2018-12-24 2:12 ` [Patch v2 1/2] UefiCpuPkg/RegisterCpuFeaturesLib: " Eric Dong
2018-12-26 22:16 ` Laszlo Ersek [this message]
2018-12-24 2:12 ` [Patch v2 2/2] UefiCpuPkg/RegisterCpuFeaturesLib: Remove useless function Eric Dong
2018-12-26 22:03 ` 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=b7e3ed96-547c-1199-edcd-ea8b0b82d58e@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