Laszlo,

Thanks for the feedback.  

1) I have updated the author using --author='Laszlo Ersek <ler...@redhat.com>'
2) I changed the order of the commits so the MP race condition is fixed before 
your patch to sync MTRRs to all APs.

Best regards,

Mike

>-----Original Message-----
>From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of
>Laszlo Ersek
>Sent: Monday, October 19, 2015 6:43 AM
>To: Kinney, Michael D; edk2-de...@ml01.01.org
>Cc: edk2-devel
>Subject: Re: [edk2] [PATCH v4 03/19] UefiCpuPkg: CpuDxe: broadcast MTRR
>changes to APs
>
>On 10/19/15 09:44, Michael Kinney wrote:
>> From: edk2-devel <edk2-devel-boun...@lists.01.org>
>
>With SVN it won't matter much ultimately, but considering git per se, I
>think in your git tree my authorship was lost somehow. (The
>Signed-off-by below is correct though.) This can be fixed by:
>- rebasing the series
>- selecting "edit" for this patch
>- committing it without any changes, but with different authorship:
>  git commit --amend --author='Laszlo Ersek <ler...@redhat.com>'
>
>Not overly important, but I think it's useful to know about git commit
>--author.
>
>Another (not super-important) comment: in cases like this, a patch
>series usually applies the fix for the dormant bug first (i.e., patch v4
>04/19), and then introduces the change that would expose the bug (i.e.,
>this patch). The idea being, since the bug is known, there should be no
>point in history where the bug is exposed -- it could be triggered by an
>unrelated bisection, for example.
>
>Again, not too important, but it's so great that you've been using git
>for this work that I can't hold back some unsolicited git tips. :)
>
>Thanks!
>Laszlo
>
>>
>> The Quark_EDKII_v1.1.0/IA32FamilyCpuBasePkg/CpuArchDxe
>> driver applies any MTRR changes to APs, if the
>> EFI_MP_SERVICES_PROTOCOL is available. We should do the same.
>>
>> Additionally, the broadcast should occur at MP startup as well,
>> not only when MTRR settings are changed. The inspiration is
>> taken from
>>
>>   Quark_EDKII_v1.1.0/IA32FamilyCpuBasePkg/CpuMpDxe/
>>
>> (see the EarlyMpInit() function and its call sites in
>> "ProcessorConfig.c").
>>
>> Contributed-under: TianoCore Contribution Agreement 1.0
>> Signed-off-by: Laszlo Ersek <ler...@redhat.com>
>> Reviewed-by: Jeff Fan <jeff....@intel.com>
>> Reviewed-by: Michael Kinney <michael.d.kin...@intel.com>
>> ---
>>  UefiCpuPkg/CpuDxe/CpuDxe.c | 26 ++++++++++++++++++++++++++
>>  UefiCpuPkg/CpuDxe/CpuMp.c  | 34 +++++++++++++++++++++++++++++++++-
>>  UefiCpuPkg/CpuDxe/CpuMp.h  | 13 +++++++++++++
>>  3 files changed, 72 insertions(+), 1 deletion(-)
>>
>> diff --git a/UefiCpuPkg/CpuDxe/CpuDxe.c b/UefiCpuPkg/CpuDxe/CpuDxe.c
>> index c9df4e1..daf97bd 100644
>> --- a/UefiCpuPkg/CpuDxe/CpuDxe.c
>> +++ b/UefiCpuPkg/CpuDxe/CpuDxe.c
>> @@ -350,6 +350,9 @@ CpuSetMemoryAttributes (
>>  {
>>    RETURN_STATUS             Status;
>>    MTRR_MEMORY_CACHE_TYPE    CacheType;
>> +  EFI_STATUS                MpStatus;
>> +  EFI_MP_SERVICES_PROTOCOL  *MpService;
>> +  MTRR_SETTINGS             MtrrSettings;
>>
>>    if (!IsMtrrSupported ()) {
>>      return EFI_UNSUPPORTED;
>> @@ -405,6 +408,29 @@ CpuSetMemoryAttributes (
>>               CacheType
>>               );
>>
>> +  if (!RETURN_ERROR (Status)) {
>> +    MpStatus = gBS->LocateProtocol (
>> +                      &gEfiMpServiceProtocolGuid,
>> +                      NULL,
>> +                      (VOID **)&MpService
>> +                      );
>> +    //
>> +    // Synchronize the update with all APs
>> +    //
>> +    if (!EFI_ERROR (MpStatus)) {
>> +      MtrrGetAllMtrrs (&MtrrSettings);
>> +      MpStatus = MpService->StartupAllAPs (
>> +                              MpService,          // This
>> +                              SetMtrrsFromBuffer, // Procedure
>> +                              TRUE,               // SingleThread
>> +                              NULL,               // WaitEvent
>> +                              0,                  // TimeoutInMicrosecsond
>> +                              &MtrrSettings,      // ProcedureArgument
>> +                              NULL                // FailedCpuList
>> +                              );
>> +      ASSERT (MpStatus == EFI_SUCCESS || MpStatus == EFI_NOT_STARTED);
>> +    }
>> +  }
>>    return (EFI_STATUS) Status;
>>  }
>>
>> diff --git a/UefiCpuPkg/CpuDxe/CpuMp.c b/UefiCpuPkg/CpuDxe/CpuMp.c
>> index da3686e..fbe43f5 100644
>> --- a/UefiCpuPkg/CpuDxe/CpuMp.c
>> +++ b/UefiCpuPkg/CpuDxe/CpuMp.c
>> @@ -1626,6 +1626,22 @@ ExitBootServicesCallback (
>>  }
>>
>>  /**
>> +  A minimal wrapper function that allows MtrrSetAllMtrrs() to be passed to
>> +  EFI_MP_SERVICES_PROTOCOL.StartupAllAPs() as Procedure.
>> +
>> +  @param[in] Buffer  Pointer to an MTRR_SETTINGS object, to be passed to
>> +                     MtrrSetAllMtrrs().
>> +**/
>> +VOID
>> +EFIAPI
>> +SetMtrrsFromBuffer (
>> +  IN VOID *Buffer
>> +  )
>> +{
>> +  MtrrSetAllMtrrs (Buffer);
>> +}
>> +
>> +/**
>>    Initialize Multi-processor support.
>>
>>  **/
>> @@ -1634,7 +1650,8 @@ InitializeMpSupport (
>>    VOID
>>    )
>>  {
>> -  EFI_STATUS Status;
>> +  EFI_STATUS    Status;
>> +  MTRR_SETTINGS MtrrSettings;
>>
>>    gMaxLogicalProcessorNumber = (UINTN) PcdGet32
>(PcdCpuMaxLogicalProcessorNumber);
>>    if (gMaxLogicalProcessorNumber < 1) {
>> @@ -1690,6 +1707,21 @@ InitializeMpSupport (
>>    //
>>    CollectBistDataFromHob ();
>>
>> +  //
>> +  // Synchronize MTRR settings to APs.
>> +  //
>> +  MtrrGetAllMtrrs (&MtrrSettings);
>> +  Status = mMpServicesTemplate.StartupAllAPs (
>> +                                 &mMpServicesTemplate, // This
>> +                                 SetMtrrsFromBuffer,   // Procedure
>> +                                 TRUE,                 // SingleThread
>> +                                 NULL,                 // WaitEvent
>> +                                 0,                    // 
>> TimeoutInMicrosecsond
>> +                                 &MtrrSettings,        // ProcedureArgument
>> +                                 NULL                  // FailedCpuList
>> +                                 );
>> +  ASSERT (Status == EFI_SUCCESS || Status == EFI_NOT_STARTED);
>> +
>>    Status = gBS->InstallMultipleProtocolInterfaces (
>>                    &mMpServiceHandle,
>>                    &gEfiMpServiceProtocolGuid,  &mMpServicesTemplate,
>> diff --git a/UefiCpuPkg/CpuDxe/CpuMp.h b/UefiCpuPkg/CpuDxe/CpuMp.h
>> index d2866e4..503f3ae 100644
>> --- a/UefiCpuPkg/CpuDxe/CpuMp.h
>> +++ b/UefiCpuPkg/CpuDxe/CpuMp.h
>> @@ -643,5 +643,18 @@ ResetApStackless (
>>    IN UINT32 ProcessorId
>>    );
>>
>> +/**
>> +  A minimal wrapper function that allows MtrrSetAllMtrrs() to be passed to
>> +  EFI_MP_SERVICES_PROTOCOL.StartupAllAPs() as Procedure.
>> +
>> +  @param[in] Buffer  Pointer to an MTRR_SETTINGS object, to be passed to
>> +                     MtrrSetAllMtrrs().
>> +**/
>> +VOID
>> +EFIAPI
>> +SetMtrrsFromBuffer (
>> +  IN VOID *Buffer
>> +  );
>> +
>>  #endif // _CPU_MP_H_
>>
>>
>
>_______________________________________________
>edk2-devel mailing list
>edk2-devel@lists.01.org
>https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to