* Re: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless register tables
2021-01-13 8:12 ` Ni, Ray
@ 2021-01-13 8:40 ` Zeng, Star
2021-01-13 9:16 ` Laszlo Ersek
2021-01-14 1:55 ` Zeng, Star
2 siblings, 0 replies; 20+ messages in thread
From: Zeng, Star @ 2021-01-13 8:40 UTC (permalink / raw)
To: Ni, Ray, Laszlo Ersek, devel@edk2.groups.io
Cc: Dong, Eric, Philippe Mathieu-Daudé, Kumar, Rahul1,
Zeng, Star
It should work.
Thanks,
Star
-----Original Message-----
From: Ni, Ray <ray.ni@intel.com>
Sent: Wednesday, January 13, 2021 4:12 PM
To: Zeng, Star <star.zeng@intel.com>; Laszlo Ersek <lersek@redhat.com>; devel@edk2.groups.io
Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>
Subject: RE: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless register tables
Star,
Thanks for pointing that.
RegisterCpuFeaturesLib assumes [PreSmmInit]RegisterTable array is allocated but CpuS3Data doesn't do that.
Can following change fix the problem?
--- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
+++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
@@ -937,21 +937,19 @@ GetAcpiCpuData (
EFI_PROCESSOR_INFORMATION ProcessorInfoBuffer;
AcpiCpuData = (ACPI_CPU_DATA *) (UINTN) PcdGet64 (PcdCpuS3DataAddress);
- if (AcpiCpuData != NULL) {
- return AcpiCpuData;
- }
-
- AcpiCpuData = AllocatePages (EFI_SIZE_TO_PAGES (sizeof (ACPI_CPU_DATA)));
- ASSERT (AcpiCpuData != NULL);
+ if (AcpiCpuData == NULL) {
+ AcpiCpuData = AllocatePages (EFI_SIZE_TO_PAGES (sizeof (ACPI_CPU_DATA)));
+ ASSERT (AcpiCpuData != NULL);
- //
- // Set PcdCpuS3DataAddress to the base address of the ACPI_CPU_DATA structure
- //
- Status = PcdSet64S (PcdCpuS3DataAddress, (UINT64)(UINTN)AcpiCpuData);
- ASSERT_EFI_ERROR (Status);
+ //
+ // Set PcdCpuS3DataAddress to the base address of the ACPI_CPU_DATA structure
+ //
+ Status = PcdSet64S (PcdCpuS3DataAddress, (UINT64)(UINTN)AcpiCpuData);
+ ASSERT_EFI_ERROR (Status);
- GetNumberOfProcessor (&NumberOfCpus, &NumberOfEnabledProcessors);
- AcpiCpuData->NumberOfCpus = (UINT32)NumberOfCpus;
+ GetNumberOfProcessor (&NumberOfCpus, &NumberOfEnabledProcessors);
+ AcpiCpuData->NumberOfCpus = (UINT32)NumberOfCpus; }
//
// Allocate buffer for empty RegisterTable and PreSmmInitRegisterTable for all CPUs
Thanks,
Ray
> -----Original Message-----
> From: Zeng, Star <star.zeng@intel.com>
> Sent: Wednesday, January 13, 2021 3:17 PM
> To: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>;
> devel@edk2.groups.io
> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
> <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>; Zeng,
> Star <star.zeng@intel.com>
> Subject: RE: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate
> useless register tables
>
> DxeRegisterCpuFeaturesLib still has some execution sequence dependency
> to UefiCpuPkg CpuS3DataDxe.
> There is ASSERT to happen at
> https://github.com/tianocore/edk2/blob/master/UefiCpuPkg/Library/Regis
> terC
> puFeaturesLib/RegisterCpuFeaturesLib.c#L1059 when CpuS3DataDxe with
> this patch runs before DxeRegisterCpuFeaturesLib.
>
> Thanks,
> Star
> -----Original Message-----
> From: Ni, Ray <ray.ni@intel.com>
> Sent: Wednesday, January 13, 2021 2:12 PM
> To: Laszlo Ersek <lersek@redhat.com>; devel@edk2.groups.io
> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
> <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>; Zeng,
> Star <star.zeng@intel.com>
> Subject: RE: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate
> useless register tables
>
> Reviewed-by: Ray Ni <ray.ni@intel.com>
>
> (I guess you don't want to put Redhat copyright in the patch 1&2 so
> the copyright year is not updated.
> Since it's a simple change that make the logic more neat, I am ok with
> that.)
>
> Will you create a pull request to merge all 3 patches together?
>
> > -----Original Message-----
> > From: Laszlo Ersek <lersek@redhat.com>
> > Sent: Wednesday, January 13, 2021 3:20 AM
> > To: devel@edk2.groups.io
> > Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
> > <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>; Ni, Ray
> > <ray.ni@intel.com>; Zeng, Star <star.zeng@intel.com>
> > Subject: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate
> > useless register tables
> >
> > CpuS3DataDxe allocates the "RegisterTable" and "PreSmmInitRegisterTable"
> > arrays in ACPI_CPU_DATA just so every processor in the system can
> > have its own empty register table, matched by APIC ID. This has
> > never been useful in practice.
> >
> > Given commit e992cc3f4859 ("UefiCpuPkg PiSmmCpuDxeSmm: Reduce
> SMRAM
> > consumption in CpuS3.c", 2021-01-11), simply leave both
> > "AcpiCpuData->RegisterTable" and "AcpiCpuData->PreSmmInitRegisterTable"
> > initialized to the zero address. This simplifies the driver, and
> > saves both normal RAM (boot services data type memory) and -- in
> > PiSmmCpuDxeSmm
> > -- SMRAM.
> >
> > Cc: Eric Dong <eric.dong@intel.com>
> > Cc: Philippe Mathieu-Daudé <philmd@redhat.com>
> > Cc: Rahul Kumar <rahul1.kumar@intel.com>
> > Cc: Ray Ni <ray.ni@intel.com>
> > Cc: Star Zeng <star.zeng@intel.com>
> > Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3159
> > Signed-off-by: Laszlo Ersek <lersek@redhat.com>
> > ---
> >
> > Notes:
> > Tested by temporarily replacing OvmfPkgPkg/CpuS3DataDxe in the
> > OVMF
> > IA32
> > and IA32X64 platforms with this driver -- this driver works OK in OVMF
> > as long as no CPUs are hot-plugged.
> >
> > UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c | 32 --------------------
> > 1 file changed, 32 deletions(-)
> >
> > diff --git a/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
> > b/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
> > index 2be335d91903..078af36cfb41 100644
> > --- a/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
> > +++ b/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
> > @@ -165,10 +165,6 @@ CpuS3DataInitialize (
> > UINTN NumberOfCpus;
> > UINTN NumberOfEnabledProcessors;
> > VOID *Stack;
> > - UINTN TableSize;
> > - CPU_REGISTER_TABLE *RegisterTable;
> > - UINTN Index;
> > - EFI_PROCESSOR_INFORMATION ProcessorInfoBuffer;
> > UINTN GdtSize;
> > UINTN IdtSize;
> > VOID *Gdt;
> > @@ -255,34 +251,6 @@ CpuS3DataInitialize (
> > AcpiCpuData->PreSmmInitRegisterTable = OldAcpiCpuData-
> > >PreSmmInitRegisterTable;
> > AcpiCpuData->ApLocation = OldAcpiCpuData->ApLocation;
> > CopyMem (&AcpiCpuData->CpuStatus, &OldAcpiCpuData->CpuStatus,
> > sizeof (CPU_STATUS_INFORMATION));
> > - } else {
> > - //
> > - // Allocate buffer for empty RegisterTable and PreSmmInitRegisterTable
> for
> > all CPUs
> > - //
> > - TableSize = 2 * NumberOfCpus * sizeof (CPU_REGISTER_TABLE);
> > - RegisterTable = (CPU_REGISTER_TABLE *)AllocateZeroPages (TableSize);
> > - ASSERT (RegisterTable != NULL);
> > -
> > - for (Index = 0; Index < NumberOfCpus; Index++) {
> > - Status = MpServices->GetProcessorInfo (
> > - MpServices,
> > - Index,
> > - &ProcessorInfoBuffer
> > - );
> > - ASSERT_EFI_ERROR (Status);
> > -
> > - RegisterTable[Index].InitialApicId =
> > (UINT32)ProcessorInfoBuffer.ProcessorId;
> > - RegisterTable[Index].TableLength = 0;
> > - RegisterTable[Index].AllocatedSize = 0;
> > - RegisterTable[Index].RegisterTableEntry = 0;
> > -
> > - RegisterTable[NumberOfCpus + Index].InitialApicId =
> > (UINT32)ProcessorInfoBuffer.ProcessorId;
> > - RegisterTable[NumberOfCpus + Index].TableLength = 0;
> > - RegisterTable[NumberOfCpus + Index].AllocatedSize = 0;
> > - RegisterTable[NumberOfCpus + Index].RegisterTableEntry = 0;
> > - }
> > - AcpiCpuData->RegisterTable =
> > (EFI_PHYSICAL_ADDRESS)(UINTN)RegisterTable;
> > - AcpiCpuData->PreSmmInitRegisterTable =
> > (EFI_PHYSICAL_ADDRESS)(UINTN)(RegisterTable + NumberOfCpus);
> > }
> >
> > //
> > --
> > 2.19.1.3.g30247aa5d201
> >
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless register tables
2021-01-13 8:12 ` Ni, Ray
2021-01-13 8:40 ` Zeng, Star
@ 2021-01-13 9:16 ` Laszlo Ersek
2021-01-14 1:55 ` Zeng, Star
2 siblings, 0 replies; 20+ messages in thread
From: Laszlo Ersek @ 2021-01-13 9:16 UTC (permalink / raw)
To: Ni, Ray, Zeng, Star, devel@edk2.groups.io
Cc: Dong, Eric, Philippe Mathieu-Daudé, Kumar, Rahul1
On 01/13/21 09:12, Ni, Ray wrote:
> Star,
> Thanks for pointing that.
> RegisterCpuFeaturesLib assumes [PreSmmInit]RegisterTable array is allocated but CpuS3Data
> doesn't do that.
Sorry that I missed this; I did grep the tree for
[PreSmmInit]RegisterTable, but apparently didn't pay enough attention to
RegisterCpuFeaturesLib. OVMF does not use that library.
Ray: can you please post your fix as a standalone patch?
Or else, if it's more convenient, please just push the fix somewhere (as
a standalone patch) where I can fetch it from. It would be great if you
could write a commit message too.
Then, I will post a v2 of this series, including your fix for
RegisterCpuFeaturesLib (as a patch under your authorship).
Star and Eric can then review your patch on the list -- neither I nor
you can review your patch, as you are the author of it, and I'll be
posting it.
Thanks!
Laszlo
>
> Can following change fix the problem?
>
> --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
> +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
> @@ -937,21 +937,19 @@ GetAcpiCpuData (
> EFI_PROCESSOR_INFORMATION ProcessorInfoBuffer;
>
> AcpiCpuData = (ACPI_CPU_DATA *) (UINTN) PcdGet64 (PcdCpuS3DataAddress);
> - if (AcpiCpuData != NULL) {
> - return AcpiCpuData;
> - }
> -
> - AcpiCpuData = AllocatePages (EFI_SIZE_TO_PAGES (sizeof (ACPI_CPU_DATA)));
> - ASSERT (AcpiCpuData != NULL);
> + if (AcpiCpuData == NULL) {
> + AcpiCpuData = AllocatePages (EFI_SIZE_TO_PAGES (sizeof (ACPI_CPU_DATA)));
> + ASSERT (AcpiCpuData != NULL);
>
> - //
> - // Set PcdCpuS3DataAddress to the base address of the ACPI_CPU_DATA structure
> - //
> - Status = PcdSet64S (PcdCpuS3DataAddress, (UINT64)(UINTN)AcpiCpuData);
> - ASSERT_EFI_ERROR (Status);
> + //
> + // Set PcdCpuS3DataAddress to the base address of the ACPI_CPU_DATA structure
> + //
> + Status = PcdSet64S (PcdCpuS3DataAddress, (UINT64)(UINTN)AcpiCpuData);
> + ASSERT_EFI_ERROR (Status);
>
> - GetNumberOfProcessor (&NumberOfCpus, &NumberOfEnabledProcessors);
> - AcpiCpuData->NumberOfCpus = (UINT32)NumberOfCpus;
> + GetNumberOfProcessor (&NumberOfCpus, &NumberOfEnabledProcessors);
> + AcpiCpuData->NumberOfCpus = (UINT32)NumberOfCpus;
> + }
>
> //
> // Allocate buffer for empty RegisterTable and PreSmmInitRegisterTable for all CPUs
>
> Thanks,
> Ray
>
>> -----Original Message-----
>> From: Zeng, Star <star.zeng@intel.com>
>> Sent: Wednesday, January 13, 2021 3:17 PM
>> To: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>;
>> devel@edk2.groups.io
>> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
>> <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>; Zeng, Star
>> <star.zeng@intel.com>
>> Subject: RE: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless
>> register tables
>>
>> DxeRegisterCpuFeaturesLib still has some execution sequence dependency to
>> UefiCpuPkg CpuS3DataDxe.
>> There is ASSERT to happen at
>> https://github.com/tianocore/edk2/blob/master/UefiCpuPkg/Library/RegisterC
>> puFeaturesLib/RegisterCpuFeaturesLib.c#L1059 when CpuS3DataDxe with this
>> patch runs before DxeRegisterCpuFeaturesLib.
>>
>> Thanks,
>> Star
>> -----Original Message-----
>> From: Ni, Ray <ray.ni@intel.com>
>> Sent: Wednesday, January 13, 2021 2:12 PM
>> To: Laszlo Ersek <lersek@redhat.com>; devel@edk2.groups.io
>> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
>> <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>; Zeng, Star
>> <star.zeng@intel.com>
>> Subject: RE: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless
>> register tables
>>
>> Reviewed-by: Ray Ni <ray.ni@intel.com>
>>
>> (I guess you don't want to put Redhat copyright in the patch 1&2 so the
>> copyright year is not updated.
>> Since it's a simple change that make the logic more neat, I am ok with that.)
>>
>> Will you create a pull request to merge all 3 patches together?
>>
>>> -----Original Message-----
>>> From: Laszlo Ersek <lersek@redhat.com>
>>> Sent: Wednesday, January 13, 2021 3:20 AM
>>> To: devel@edk2.groups.io
>>> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
>>> <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>; Ni, Ray
>>> <ray.ni@intel.com>; Zeng, Star <star.zeng@intel.com>
>>> Subject: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless
>>> register tables
>>>
>>> CpuS3DataDxe allocates the "RegisterTable" and "PreSmmInitRegisterTable"
>>> arrays in ACPI_CPU_DATA just so every processor in the system can have
>>> its own empty register table, matched by APIC ID. This has never been
>>> useful in practice.
>>>
>>> Given commit e992cc3f4859 ("UefiCpuPkg PiSmmCpuDxeSmm: Reduce
>> SMRAM
>>> consumption in CpuS3.c", 2021-01-11), simply leave both
>>> "AcpiCpuData->RegisterTable" and "AcpiCpuData->PreSmmInitRegisterTable"
>>> initialized to the zero address. This simplifies the driver, and saves
>>> both normal RAM (boot services data type memory) and -- in
>>> PiSmmCpuDxeSmm
>>> -- SMRAM.
>>>
>>> Cc: Eric Dong <eric.dong@intel.com>
>>> Cc: Philippe Mathieu-Daudé <philmd@redhat.com>
>>> Cc: Rahul Kumar <rahul1.kumar@intel.com>
>>> Cc: Ray Ni <ray.ni@intel.com>
>>> Cc: Star Zeng <star.zeng@intel.com>
>>> Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3159
>>> Signed-off-by: Laszlo Ersek <lersek@redhat.com>
>>> ---
>>>
>>> Notes:
>>> Tested by temporarily replacing OvmfPkgPkg/CpuS3DataDxe in the
>>> OVMF
>>> IA32
>>> and IA32X64 platforms with this driver -- this driver works OK in OVMF
>>> as long as no CPUs are hot-plugged.
>>>
>>> UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c | 32 --------------------
>>> 1 file changed, 32 deletions(-)
>>>
>>> diff --git a/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
>>> b/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
>>> index 2be335d91903..078af36cfb41 100644
>>> --- a/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
>>> +++ b/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
>>> @@ -165,10 +165,6 @@ CpuS3DataInitialize (
>>> UINTN NumberOfCpus;
>>> UINTN NumberOfEnabledProcessors;
>>> VOID *Stack;
>>> - UINTN TableSize;
>>> - CPU_REGISTER_TABLE *RegisterTable;
>>> - UINTN Index;
>>> - EFI_PROCESSOR_INFORMATION ProcessorInfoBuffer;
>>> UINTN GdtSize;
>>> UINTN IdtSize;
>>> VOID *Gdt;
>>> @@ -255,34 +251,6 @@ CpuS3DataInitialize (
>>> AcpiCpuData->PreSmmInitRegisterTable = OldAcpiCpuData-
>>>> PreSmmInitRegisterTable;
>>> AcpiCpuData->ApLocation = OldAcpiCpuData->ApLocation;
>>> CopyMem (&AcpiCpuData->CpuStatus, &OldAcpiCpuData->CpuStatus,
>>> sizeof (CPU_STATUS_INFORMATION));
>>> - } else {
>>> - //
>>> - // Allocate buffer for empty RegisterTable and PreSmmInitRegisterTable
>> for
>>> all CPUs
>>> - //
>>> - TableSize = 2 * NumberOfCpus * sizeof (CPU_REGISTER_TABLE);
>>> - RegisterTable = (CPU_REGISTER_TABLE *)AllocateZeroPages (TableSize);
>>> - ASSERT (RegisterTable != NULL);
>>> -
>>> - for (Index = 0; Index < NumberOfCpus; Index++) {
>>> - Status = MpServices->GetProcessorInfo (
>>> - MpServices,
>>> - Index,
>>> - &ProcessorInfoBuffer
>>> - );
>>> - ASSERT_EFI_ERROR (Status);
>>> -
>>> - RegisterTable[Index].InitialApicId =
>>> (UINT32)ProcessorInfoBuffer.ProcessorId;
>>> - RegisterTable[Index].TableLength = 0;
>>> - RegisterTable[Index].AllocatedSize = 0;
>>> - RegisterTable[Index].RegisterTableEntry = 0;
>>> -
>>> - RegisterTable[NumberOfCpus + Index].InitialApicId =
>>> (UINT32)ProcessorInfoBuffer.ProcessorId;
>>> - RegisterTable[NumberOfCpus + Index].TableLength = 0;
>>> - RegisterTable[NumberOfCpus + Index].AllocatedSize = 0;
>>> - RegisterTable[NumberOfCpus + Index].RegisterTableEntry = 0;
>>> - }
>>> - AcpiCpuData->RegisterTable =
>>> (EFI_PHYSICAL_ADDRESS)(UINTN)RegisterTable;
>>> - AcpiCpuData->PreSmmInitRegisterTable =
>>> (EFI_PHYSICAL_ADDRESS)(UINTN)(RegisterTable + NumberOfCpus);
>>> }
>>>
>>> //
>>> --
>>> 2.19.1.3.g30247aa5d201
>>>
>
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless register tables
2021-01-13 8:12 ` Ni, Ray
2021-01-13 8:40 ` Zeng, Star
2021-01-13 9:16 ` Laszlo Ersek
@ 2021-01-14 1:55 ` Zeng, Star
2021-01-14 17:35 ` Laszlo Ersek
2 siblings, 1 reply; 20+ messages in thread
From: Zeng, Star @ 2021-01-14 1:55 UTC (permalink / raw)
To: Ni, Ray, Laszlo Ersek, devel@edk2.groups.io
Cc: Dong, Eric, Philippe Mathieu-Daudé, Kumar, Rahul1,
Zeng, Star
Just think more, the change below needs a minor enhancement as below, otherwise the table will be overridden by the function's second call.
> -----Original Message-----
> From: Ni, Ray <ray.ni@intel.com>
> Sent: Wednesday, January 13, 2021 4:12 PM
> To: Zeng, Star <star.zeng@intel.com>; Laszlo Ersek <lersek@redhat.com>;
> devel@edk2.groups.io
> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
> <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>
> Subject: RE: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless
> register tables
>
> Star,
> Thanks for pointing that.
> RegisterCpuFeaturesLib assumes [PreSmmInit]RegisterTable array is
> allocated but CpuS3Data
> doesn't do that.
>
> Can following change fix the problem?
>
> --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
> +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
> @@ -937,21 +937,19 @@ GetAcpiCpuData (
> EFI_PROCESSOR_INFORMATION ProcessorInfoBuffer;
>
> AcpiCpuData = (ACPI_CPU_DATA *) (UINTN) PcdGet64
> (PcdCpuS3DataAddress);
> - if (AcpiCpuData != NULL) {
> - return AcpiCpuData;
> - }
> -
> - AcpiCpuData = AllocatePages (EFI_SIZE_TO_PAGES (sizeof
> (ACPI_CPU_DATA)));
> - ASSERT (AcpiCpuData != NULL);
> + if (AcpiCpuData == NULL) {
> + AcpiCpuData = AllocatePages (EFI_SIZE_TO_PAGES (sizeof
> (ACPI_CPU_DATA)));
> + ASSERT (AcpiCpuData != NULL);
>
> - //
> - // Set PcdCpuS3DataAddress to the base address of the ACPI_CPU_DATA
> structure
> - //
> - Status = PcdSet64S (PcdCpuS3DataAddress, (UINT64)(UINTN)AcpiCpuData);
> - ASSERT_EFI_ERROR (Status);
> + //
> + // Set PcdCpuS3DataAddress to the base address of the ACPI_CPU_DATA
> structure
> + //
> + Status = PcdSet64S (PcdCpuS3DataAddress,
> (UINT64)(UINTN)AcpiCpuData);
> + ASSERT_EFI_ERROR (Status);
>
> - GetNumberOfProcessor (&NumberOfCpus, &NumberOfEnabledProcessors);
> - AcpiCpuData->NumberOfCpus = (UINT32)NumberOfCpus;
> + GetNumberOfProcessor (&NumberOfCpus,
> &NumberOfEnabledProcessors);
> + AcpiCpuData->NumberOfCpus = (UINT32)NumberOfCpus;
> + }
>
Add check as below here.
if (AcpiCpuData->RegisterTable == 0) {
> //
> // Allocate buffer for empty RegisterTable and PreSmmInitRegisterTable
> for all CPUs
>
> Thanks,
> Ray
>
> > -----Original Message-----
> > From: Zeng, Star <star.zeng@intel.com>
> > Sent: Wednesday, January 13, 2021 3:17 PM
> > To: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>;
> > devel@edk2.groups.io
> > Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
> > <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>; Zeng,
> Star
> > <star.zeng@intel.com>
> > Subject: RE: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate
> useless
> > register tables
> >
> > DxeRegisterCpuFeaturesLib still has some execution sequence dependency
> to
> > UefiCpuPkg CpuS3DataDxe.
> > There is ASSERT to happen at
> >
> https://github.com/tianocore/edk2/blob/master/UefiCpuPkg/Library/Regist
> erC
> > puFeaturesLib/RegisterCpuFeaturesLib.c#L1059 when CpuS3DataDxe with
> this
> > patch runs before DxeRegisterCpuFeaturesLib.
> >
> > Thanks,
> > Star
> > -----Original Message-----
> > From: Ni, Ray <ray.ni@intel.com>
> > Sent: Wednesday, January 13, 2021 2:12 PM
> > To: Laszlo Ersek <lersek@redhat.com>; devel@edk2.groups.io
> > Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
> > <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>; Zeng,
> Star
> > <star.zeng@intel.com>
> > Subject: RE: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate
> useless
> > register tables
> >
> > Reviewed-by: Ray Ni <ray.ni@intel.com>
> >
> > (I guess you don't want to put Redhat copyright in the patch 1&2 so the
> > copyright year is not updated.
> > Since it's a simple change that make the logic more neat, I am ok with that.)
> >
> > Will you create a pull request to merge all 3 patches together?
> >
> > > -----Original Message-----
> > > From: Laszlo Ersek <lersek@redhat.com>
> > > Sent: Wednesday, January 13, 2021 3:20 AM
> > > To: devel@edk2.groups.io
> > > Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
> > > <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>; Ni,
> Ray
> > > <ray.ni@intel.com>; Zeng, Star <star.zeng@intel.com>
> > > Subject: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless
> > > register tables
> > >
> > > CpuS3DataDxe allocates the "RegisterTable" and
> "PreSmmInitRegisterTable"
> > > arrays in ACPI_CPU_DATA just so every processor in the system can have
> > > its own empty register table, matched by APIC ID. This has never been
> > > useful in practice.
> > >
> > > Given commit e992cc3f4859 ("UefiCpuPkg PiSmmCpuDxeSmm: Reduce
> > SMRAM
> > > consumption in CpuS3.c", 2021-01-11), simply leave both
> > > "AcpiCpuData->RegisterTable" and "AcpiCpuData-
> >PreSmmInitRegisterTable"
> > > initialized to the zero address. This simplifies the driver, and saves
> > > both normal RAM (boot services data type memory) and -- in
> > > PiSmmCpuDxeSmm
> > > -- SMRAM.
> > >
> > > Cc: Eric Dong <eric.dong@intel.com>
> > > Cc: Philippe Mathieu-Daudé <philmd@redhat.com>
> > > Cc: Rahul Kumar <rahul1.kumar@intel.com>
> > > Cc: Ray Ni <ray.ni@intel.com>
> > > Cc: Star Zeng <star.zeng@intel.com>
> > > Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3159
> > > Signed-off-by: Laszlo Ersek <lersek@redhat.com>
> > > ---
> > >
> > > Notes:
> > > Tested by temporarily replacing OvmfPkgPkg/CpuS3DataDxe in the
> > > OVMF
> > > IA32
> > > and IA32X64 platforms with this driver -- this driver works OK in OVMF
> > > as long as no CPUs are hot-plugged.
> > >
> > > UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c | 32 --------------------
> > > 1 file changed, 32 deletions(-)
> > >
> > > diff --git a/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
> > > b/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
> > > index 2be335d91903..078af36cfb41 100644
> > > --- a/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
> > > +++ b/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
> > > @@ -165,10 +165,6 @@ CpuS3DataInitialize (
> > > UINTN NumberOfCpus;
> > > UINTN NumberOfEnabledProcessors;
> > > VOID *Stack;
> > > - UINTN TableSize;
> > > - CPU_REGISTER_TABLE *RegisterTable;
> > > - UINTN Index;
> > > - EFI_PROCESSOR_INFORMATION ProcessorInfoBuffer;
> > > UINTN GdtSize;
> > > UINTN IdtSize;
> > > VOID *Gdt;
> > > @@ -255,34 +251,6 @@ CpuS3DataInitialize (
> > > AcpiCpuData->PreSmmInitRegisterTable = OldAcpiCpuData-
> > > >PreSmmInitRegisterTable;
> > > AcpiCpuData->ApLocation = OldAcpiCpuData->ApLocation;
> > > CopyMem (&AcpiCpuData->CpuStatus, &OldAcpiCpuData->CpuStatus,
> > > sizeof (CPU_STATUS_INFORMATION));
> > > - } else {
> > > - //
> > > - // Allocate buffer for empty RegisterTable and
> PreSmmInitRegisterTable
> > for
> > > all CPUs
> > > - //
> > > - TableSize = 2 * NumberOfCpus * sizeof (CPU_REGISTER_TABLE);
> > > - RegisterTable = (CPU_REGISTER_TABLE *)AllocateZeroPages
> (TableSize);
> > > - ASSERT (RegisterTable != NULL);
> > > -
> > > - for (Index = 0; Index < NumberOfCpus; Index++) {
> > > - Status = MpServices->GetProcessorInfo (
> > > - MpServices,
> > > - Index,
> > > - &ProcessorInfoBuffer
> > > - );
> > > - ASSERT_EFI_ERROR (Status);
> > > -
> > > - RegisterTable[Index].InitialApicId =
> > > (UINT32)ProcessorInfoBuffer.ProcessorId;
> > > - RegisterTable[Index].TableLength = 0;
> > > - RegisterTable[Index].AllocatedSize = 0;
> > > - RegisterTable[Index].RegisterTableEntry = 0;
> > > -
> > > - RegisterTable[NumberOfCpus + Index].InitialApicId =
> > > (UINT32)ProcessorInfoBuffer.ProcessorId;
> > > - RegisterTable[NumberOfCpus + Index].TableLength = 0;
> > > - RegisterTable[NumberOfCpus + Index].AllocatedSize = 0;
> > > - RegisterTable[NumberOfCpus + Index].RegisterTableEntry = 0;
> > > - }
> > > - AcpiCpuData->RegisterTable =
> > > (EFI_PHYSICAL_ADDRESS)(UINTN)RegisterTable;
> > > - AcpiCpuData->PreSmmInitRegisterTable =
> > > (EFI_PHYSICAL_ADDRESS)(UINTN)(RegisterTable + NumberOfCpus);
> > > }
> > >
> > > //
> > > --
> > > 2.19.1.3.g30247aa5d201
> > >
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless register tables
2021-01-14 1:55 ` Zeng, Star
@ 2021-01-14 17:35 ` Laszlo Ersek
2021-01-15 8:33 ` [edk2-devel] " Ni, Ray
0 siblings, 1 reply; 20+ messages in thread
From: Laszlo Ersek @ 2021-01-14 17:35 UTC (permalink / raw)
To: Zeng, Star, Ni, Ray, devel@edk2.groups.io
Cc: Dong, Eric, Philippe Mathieu-Daudé, Kumar, Rahul1
Hi Star,
On 01/14/21 02:55, Zeng, Star wrote:
> Just think more, the change below needs a minor enhancement as below, otherwise the table will be overridden by the function's second call.
thank you for following up here -- could you or Ray please propose an
actual patch for RegisterCpuFeaturesLib, as I requested before?
Posting the patch is not necessary; I only need to fetch it from your
personal repo(s) -- you can even send me the repo / branch reference
off-list. I would include the RegisterCpuFeaturesLib patch in my v2
posting of this series.
Thanks!
Laszlo
>
>> -----Original Message-----
>> From: Ni, Ray <ray.ni@intel.com>
>> Sent: Wednesday, January 13, 2021 4:12 PM
>> To: Zeng, Star <star.zeng@intel.com>; Laszlo Ersek <lersek@redhat.com>;
>> devel@edk2.groups.io
>> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
>> <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>
>> Subject: RE: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless
>> register tables
>>
>> Star,
>> Thanks for pointing that.
>> RegisterCpuFeaturesLib assumes [PreSmmInit]RegisterTable array is
>> allocated but CpuS3Data
>> doesn't do that.
>>
>> Can following change fix the problem?
>>
>> --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
>> +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
>> @@ -937,21 +937,19 @@ GetAcpiCpuData (
>> EFI_PROCESSOR_INFORMATION ProcessorInfoBuffer;
>>
>> AcpiCpuData = (ACPI_CPU_DATA *) (UINTN) PcdGet64
>> (PcdCpuS3DataAddress);
>> - if (AcpiCpuData != NULL) {
>> - return AcpiCpuData;
>> - }
>> -
>> - AcpiCpuData = AllocatePages (EFI_SIZE_TO_PAGES (sizeof
>> (ACPI_CPU_DATA)));
>> - ASSERT (AcpiCpuData != NULL);
>> + if (AcpiCpuData == NULL) {
>> + AcpiCpuData = AllocatePages (EFI_SIZE_TO_PAGES (sizeof
>> (ACPI_CPU_DATA)));
>> + ASSERT (AcpiCpuData != NULL);
>>
>> - //
>> - // Set PcdCpuS3DataAddress to the base address of the ACPI_CPU_DATA
>> structure
>> - //
>> - Status = PcdSet64S (PcdCpuS3DataAddress, (UINT64)(UINTN)AcpiCpuData);
>> - ASSERT_EFI_ERROR (Status);
>> + //
>> + // Set PcdCpuS3DataAddress to the base address of the ACPI_CPU_DATA
>> structure
>> + //
>> + Status = PcdSet64S (PcdCpuS3DataAddress,
>> (UINT64)(UINTN)AcpiCpuData);
>> + ASSERT_EFI_ERROR (Status);
>>
>> - GetNumberOfProcessor (&NumberOfCpus, &NumberOfEnabledProcessors);
>> - AcpiCpuData->NumberOfCpus = (UINT32)NumberOfCpus;
>> + GetNumberOfProcessor (&NumberOfCpus,
>> &NumberOfEnabledProcessors);
>> + AcpiCpuData->NumberOfCpus = (UINT32)NumberOfCpus;
>> + }
>>
>
> Add check as below here.
>
> if (AcpiCpuData->RegisterTable == 0) {
>
>> //
>> // Allocate buffer for empty RegisterTable and PreSmmInitRegisterTable
>> for all CPUs
>>
>> Thanks,
>> Ray
>>
>>> -----Original Message-----
>>> From: Zeng, Star <star.zeng@intel.com>
>>> Sent: Wednesday, January 13, 2021 3:17 PM
>>> To: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>;
>>> devel@edk2.groups.io
>>> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
>>> <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>; Zeng,
>> Star
>>> <star.zeng@intel.com>
>>> Subject: RE: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate
>> useless
>>> register tables
>>>
>>> DxeRegisterCpuFeaturesLib still has some execution sequence dependency
>> to
>>> UefiCpuPkg CpuS3DataDxe.
>>> There is ASSERT to happen at
>>>
>> https://github.com/tianocore/edk2/blob/master/UefiCpuPkg/Library/Regist
>> erC
>>> puFeaturesLib/RegisterCpuFeaturesLib.c#L1059 when CpuS3DataDxe with
>> this
>>> patch runs before DxeRegisterCpuFeaturesLib.
>>>
>>> Thanks,
>>> Star
>>> -----Original Message-----
>>> From: Ni, Ray <ray.ni@intel.com>
>>> Sent: Wednesday, January 13, 2021 2:12 PM
>>> To: Laszlo Ersek <lersek@redhat.com>; devel@edk2.groups.io
>>> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
>>> <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>; Zeng,
>> Star
>>> <star.zeng@intel.com>
>>> Subject: RE: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate
>> useless
>>> register tables
>>>
>>> Reviewed-by: Ray Ni <ray.ni@intel.com>
>>>
>>> (I guess you don't want to put Redhat copyright in the patch 1&2 so the
>>> copyright year is not updated.
>>> Since it's a simple change that make the logic more neat, I am ok with that.)
>>>
>>> Will you create a pull request to merge all 3 patches together?
>>>
>>>> -----Original Message-----
>>>> From: Laszlo Ersek <lersek@redhat.com>
>>>> Sent: Wednesday, January 13, 2021 3:20 AM
>>>> To: devel@edk2.groups.io
>>>> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
>>>> <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>; Ni,
>> Ray
>>>> <ray.ni@intel.com>; Zeng, Star <star.zeng@intel.com>
>>>> Subject: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless
>>>> register tables
>>>>
>>>> CpuS3DataDxe allocates the "RegisterTable" and
>> "PreSmmInitRegisterTable"
>>>> arrays in ACPI_CPU_DATA just so every processor in the system can have
>>>> its own empty register table, matched by APIC ID. This has never been
>>>> useful in practice.
>>>>
>>>> Given commit e992cc3f4859 ("UefiCpuPkg PiSmmCpuDxeSmm: Reduce
>>> SMRAM
>>>> consumption in CpuS3.c", 2021-01-11), simply leave both
>>>> "AcpiCpuData->RegisterTable" and "AcpiCpuData-
>>> PreSmmInitRegisterTable"
>>>> initialized to the zero address. This simplifies the driver, and saves
>>>> both normal RAM (boot services data type memory) and -- in
>>>> PiSmmCpuDxeSmm
>>>> -- SMRAM.
>>>>
>>>> Cc: Eric Dong <eric.dong@intel.com>
>>>> Cc: Philippe Mathieu-Daudé <philmd@redhat.com>
>>>> Cc: Rahul Kumar <rahul1.kumar@intel.com>
>>>> Cc: Ray Ni <ray.ni@intel.com>
>>>> Cc: Star Zeng <star.zeng@intel.com>
>>>> Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3159
>>>> Signed-off-by: Laszlo Ersek <lersek@redhat.com>
>>>> ---
>>>>
>>>> Notes:
>>>> Tested by temporarily replacing OvmfPkgPkg/CpuS3DataDxe in the
>>>> OVMF
>>>> IA32
>>>> and IA32X64 platforms with this driver -- this driver works OK in OVMF
>>>> as long as no CPUs are hot-plugged.
>>>>
>>>> UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c | 32 --------------------
>>>> 1 file changed, 32 deletions(-)
>>>>
>>>> diff --git a/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
>>>> b/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
>>>> index 2be335d91903..078af36cfb41 100644
>>>> --- a/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
>>>> +++ b/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
>>>> @@ -165,10 +165,6 @@ CpuS3DataInitialize (
>>>> UINTN NumberOfCpus;
>>>> UINTN NumberOfEnabledProcessors;
>>>> VOID *Stack;
>>>> - UINTN TableSize;
>>>> - CPU_REGISTER_TABLE *RegisterTable;
>>>> - UINTN Index;
>>>> - EFI_PROCESSOR_INFORMATION ProcessorInfoBuffer;
>>>> UINTN GdtSize;
>>>> UINTN IdtSize;
>>>> VOID *Gdt;
>>>> @@ -255,34 +251,6 @@ CpuS3DataInitialize (
>>>> AcpiCpuData->PreSmmInitRegisterTable = OldAcpiCpuData-
>>>>> PreSmmInitRegisterTable;
>>>> AcpiCpuData->ApLocation = OldAcpiCpuData->ApLocation;
>>>> CopyMem (&AcpiCpuData->CpuStatus, &OldAcpiCpuData->CpuStatus,
>>>> sizeof (CPU_STATUS_INFORMATION));
>>>> - } else {
>>>> - //
>>>> - // Allocate buffer for empty RegisterTable and
>> PreSmmInitRegisterTable
>>> for
>>>> all CPUs
>>>> - //
>>>> - TableSize = 2 * NumberOfCpus * sizeof (CPU_REGISTER_TABLE);
>>>> - RegisterTable = (CPU_REGISTER_TABLE *)AllocateZeroPages
>> (TableSize);
>>>> - ASSERT (RegisterTable != NULL);
>>>> -
>>>> - for (Index = 0; Index < NumberOfCpus; Index++) {
>>>> - Status = MpServices->GetProcessorInfo (
>>>> - MpServices,
>>>> - Index,
>>>> - &ProcessorInfoBuffer
>>>> - );
>>>> - ASSERT_EFI_ERROR (Status);
>>>> -
>>>> - RegisterTable[Index].InitialApicId =
>>>> (UINT32)ProcessorInfoBuffer.ProcessorId;
>>>> - RegisterTable[Index].TableLength = 0;
>>>> - RegisterTable[Index].AllocatedSize = 0;
>>>> - RegisterTable[Index].RegisterTableEntry = 0;
>>>> -
>>>> - RegisterTable[NumberOfCpus + Index].InitialApicId =
>>>> (UINT32)ProcessorInfoBuffer.ProcessorId;
>>>> - RegisterTable[NumberOfCpus + Index].TableLength = 0;
>>>> - RegisterTable[NumberOfCpus + Index].AllocatedSize = 0;
>>>> - RegisterTable[NumberOfCpus + Index].RegisterTableEntry = 0;
>>>> - }
>>>> - AcpiCpuData->RegisterTable =
>>>> (EFI_PHYSICAL_ADDRESS)(UINTN)RegisterTable;
>>>> - AcpiCpuData->PreSmmInitRegisterTable =
>>>> (EFI_PHYSICAL_ADDRESS)(UINTN)(RegisterTable + NumberOfCpus);
>>>> }
>>>>
>>>> //
>>>> --
>>>> 2.19.1.3.g30247aa5d201
>>>>
>
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [edk2-devel] [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless register tables
2021-01-14 17:35 ` Laszlo Ersek
@ 2021-01-15 8:33 ` Ni, Ray
2021-01-15 8:37 ` Laszlo Ersek
0 siblings, 1 reply; 20+ messages in thread
From: Ni, Ray @ 2021-01-15 8:33 UTC (permalink / raw)
To: devel@edk2.groups.io, lersek@redhat.com, Zeng, Star
Cc: Dong, Eric, Philippe Mathieu-Daudé, Kumar, Rahul1
Laszlo,
I will test my patches internally and find a way to give you the patch to be included in your V2.
Thanks,
Ray
> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Laszlo Ersek
> Sent: Friday, January 15, 2021 1:36 AM
> To: Zeng, Star <star.zeng@intel.com>; Ni, Ray <ray.ni@intel.com>; devel@edk2.groups.io
> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé <philmd@redhat.com>; Kumar, Rahul1
> <rahul1.kumar@intel.com>
> Subject: Re: [edk2-devel] [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless register tables
>
> Hi Star,
>
> On 01/14/21 02:55, Zeng, Star wrote:
> > Just think more, the change below needs a minor enhancement as below, otherwise the table will be overridden by the
> function's second call.
>
> thank you for following up here -- could you or Ray please propose an
> actual patch for RegisterCpuFeaturesLib, as I requested before?
>
> Posting the patch is not necessary; I only need to fetch it from your
> personal repo(s) -- you can even send me the repo / branch reference
> off-list. I would include the RegisterCpuFeaturesLib patch in my v2
> posting of this series.
>
> Thanks!
> Laszlo
>
> >
> >> -----Original Message-----
> >> From: Ni, Ray <ray.ni@intel.com>
> >> Sent: Wednesday, January 13, 2021 4:12 PM
> >> To: Zeng, Star <star.zeng@intel.com>; Laszlo Ersek <lersek@redhat.com>;
> >> devel@edk2.groups.io
> >> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
> >> <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>
> >> Subject: RE: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless
> >> register tables
> >>
> >> Star,
> >> Thanks for pointing that.
> >> RegisterCpuFeaturesLib assumes [PreSmmInit]RegisterTable array is
> >> allocated but CpuS3Data
> >> doesn't do that.
> >>
> >> Can following change fix the problem?
> >>
> >> --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
> >> +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
> >> @@ -937,21 +937,19 @@ GetAcpiCpuData (
> >> EFI_PROCESSOR_INFORMATION ProcessorInfoBuffer;
> >>
> >> AcpiCpuData = (ACPI_CPU_DATA *) (UINTN) PcdGet64
> >> (PcdCpuS3DataAddress);
> >> - if (AcpiCpuData != NULL) {
> >> - return AcpiCpuData;
> >> - }
> >> -
> >> - AcpiCpuData = AllocatePages (EFI_SIZE_TO_PAGES (sizeof
> >> (ACPI_CPU_DATA)));
> >> - ASSERT (AcpiCpuData != NULL);
> >> + if (AcpiCpuData == NULL) {
> >> + AcpiCpuData = AllocatePages (EFI_SIZE_TO_PAGES (sizeof
> >> (ACPI_CPU_DATA)));
> >> + ASSERT (AcpiCpuData != NULL);
> >>
> >> - //
> >> - // Set PcdCpuS3DataAddress to the base address of the ACPI_CPU_DATA
> >> structure
> >> - //
> >> - Status = PcdSet64S (PcdCpuS3DataAddress, (UINT64)(UINTN)AcpiCpuData);
> >> - ASSERT_EFI_ERROR (Status);
> >> + //
> >> + // Set PcdCpuS3DataAddress to the base address of the ACPI_CPU_DATA
> >> structure
> >> + //
> >> + Status = PcdSet64S (PcdCpuS3DataAddress,
> >> (UINT64)(UINTN)AcpiCpuData);
> >> + ASSERT_EFI_ERROR (Status);
> >>
> >> - GetNumberOfProcessor (&NumberOfCpus, &NumberOfEnabledProcessors);
> >> - AcpiCpuData->NumberOfCpus = (UINT32)NumberOfCpus;
> >> + GetNumberOfProcessor (&NumberOfCpus,
> >> &NumberOfEnabledProcessors);
> >> + AcpiCpuData->NumberOfCpus = (UINT32)NumberOfCpus;
> >> + }
> >>
> >
> > Add check as below here.
> >
> > if (AcpiCpuData->RegisterTable == 0) {
> >
> >> //
> >> // Allocate buffer for empty RegisterTable and PreSmmInitRegisterTable
> >> for all CPUs
> >>
> >> Thanks,
> >> Ray
> >>
> >>> -----Original Message-----
> >>> From: Zeng, Star <star.zeng@intel.com>
> >>> Sent: Wednesday, January 13, 2021 3:17 PM
> >>> To: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>;
> >>> devel@edk2.groups.io
> >>> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
> >>> <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>; Zeng,
> >> Star
> >>> <star.zeng@intel.com>
> >>> Subject: RE: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate
> >> useless
> >>> register tables
> >>>
> >>> DxeRegisterCpuFeaturesLib still has some execution sequence dependency
> >> to
> >>> UefiCpuPkg CpuS3DataDxe.
> >>> There is ASSERT to happen at
> >>>
> >> https://github.com/tianocore/edk2/blob/master/UefiCpuPkg/Library/Regist
> >> erC
> >>> puFeaturesLib/RegisterCpuFeaturesLib.c#L1059 when CpuS3DataDxe with
> >> this
> >>> patch runs before DxeRegisterCpuFeaturesLib.
> >>>
> >>> Thanks,
> >>> Star
> >>> -----Original Message-----
> >>> From: Ni, Ray <ray.ni@intel.com>
> >>> Sent: Wednesday, January 13, 2021 2:12 PM
> >>> To: Laszlo Ersek <lersek@redhat.com>; devel@edk2.groups.io
> >>> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
> >>> <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>; Zeng,
> >> Star
> >>> <star.zeng@intel.com>
> >>> Subject: RE: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate
> >> useless
> >>> register tables
> >>>
> >>> Reviewed-by: Ray Ni <ray.ni@intel.com>
> >>>
> >>> (I guess you don't want to put Redhat copyright in the patch 1&2 so the
> >>> copyright year is not updated.
> >>> Since it's a simple change that make the logic more neat, I am ok with that.)
> >>>
> >>> Will you create a pull request to merge all 3 patches together?
> >>>
> >>>> -----Original Message-----
> >>>> From: Laszlo Ersek <lersek@redhat.com>
> >>>> Sent: Wednesday, January 13, 2021 3:20 AM
> >>>> To: devel@edk2.groups.io
> >>>> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
> >>>> <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>; Ni,
> >> Ray
> >>>> <ray.ni@intel.com>; Zeng, Star <star.zeng@intel.com>
> >>>> Subject: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless
> >>>> register tables
> >>>>
> >>>> CpuS3DataDxe allocates the "RegisterTable" and
> >> "PreSmmInitRegisterTable"
> >>>> arrays in ACPI_CPU_DATA just so every processor in the system can have
> >>>> its own empty register table, matched by APIC ID. This has never been
> >>>> useful in practice.
> >>>>
> >>>> Given commit e992cc3f4859 ("UefiCpuPkg PiSmmCpuDxeSmm: Reduce
> >>> SMRAM
> >>>> consumption in CpuS3.c", 2021-01-11), simply leave both
> >>>> "AcpiCpuData->RegisterTable" and "AcpiCpuData-
> >>> PreSmmInitRegisterTable"
> >>>> initialized to the zero address. This simplifies the driver, and saves
> >>>> both normal RAM (boot services data type memory) and -- in
> >>>> PiSmmCpuDxeSmm
> >>>> -- SMRAM.
> >>>>
> >>>> Cc: Eric Dong <eric.dong@intel.com>
> >>>> Cc: Philippe Mathieu-Daudé <philmd@redhat.com>
> >>>> Cc: Rahul Kumar <rahul1.kumar@intel.com>
> >>>> Cc: Ray Ni <ray.ni@intel.com>
> >>>> Cc: Star Zeng <star.zeng@intel.com>
> >>>> Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3159
> >>>> Signed-off-by: Laszlo Ersek <lersek@redhat.com>
> >>>> ---
> >>>>
> >>>> Notes:
> >>>> Tested by temporarily replacing OvmfPkgPkg/CpuS3DataDxe in the
> >>>> OVMF
> >>>> IA32
> >>>> and IA32X64 platforms with this driver -- this driver works OK in OVMF
> >>>> as long as no CPUs are hot-plugged.
> >>>>
> >>>> UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c | 32 --------------------
> >>>> 1 file changed, 32 deletions(-)
> >>>>
> >>>> diff --git a/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
> >>>> b/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
> >>>> index 2be335d91903..078af36cfb41 100644
> >>>> --- a/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
> >>>> +++ b/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
> >>>> @@ -165,10 +165,6 @@ CpuS3DataInitialize (
> >>>> UINTN NumberOfCpus;
> >>>> UINTN NumberOfEnabledProcessors;
> >>>> VOID *Stack;
> >>>> - UINTN TableSize;
> >>>> - CPU_REGISTER_TABLE *RegisterTable;
> >>>> - UINTN Index;
> >>>> - EFI_PROCESSOR_INFORMATION ProcessorInfoBuffer;
> >>>> UINTN GdtSize;
> >>>> UINTN IdtSize;
> >>>> VOID *Gdt;
> >>>> @@ -255,34 +251,6 @@ CpuS3DataInitialize (
> >>>> AcpiCpuData->PreSmmInitRegisterTable = OldAcpiCpuData-
> >>>>> PreSmmInitRegisterTable;
> >>>> AcpiCpuData->ApLocation = OldAcpiCpuData->ApLocation;
> >>>> CopyMem (&AcpiCpuData->CpuStatus, &OldAcpiCpuData->CpuStatus,
> >>>> sizeof (CPU_STATUS_INFORMATION));
> >>>> - } else {
> >>>> - //
> >>>> - // Allocate buffer for empty RegisterTable and
> >> PreSmmInitRegisterTable
> >>> for
> >>>> all CPUs
> >>>> - //
> >>>> - TableSize = 2 * NumberOfCpus * sizeof (CPU_REGISTER_TABLE);
> >>>> - RegisterTable = (CPU_REGISTER_TABLE *)AllocateZeroPages
> >> (TableSize);
> >>>> - ASSERT (RegisterTable != NULL);
> >>>> -
> >>>> - for (Index = 0; Index < NumberOfCpus; Index++) {
> >>>> - Status = MpServices->GetProcessorInfo (
> >>>> - MpServices,
> >>>> - Index,
> >>>> - &ProcessorInfoBuffer
> >>>> - );
> >>>> - ASSERT_EFI_ERROR (Status);
> >>>> -
> >>>> - RegisterTable[Index].InitialApicId =
> >>>> (UINT32)ProcessorInfoBuffer.ProcessorId;
> >>>> - RegisterTable[Index].TableLength = 0;
> >>>> - RegisterTable[Index].AllocatedSize = 0;
> >>>> - RegisterTable[Index].RegisterTableEntry = 0;
> >>>> -
> >>>> - RegisterTable[NumberOfCpus + Index].InitialApicId =
> >>>> (UINT32)ProcessorInfoBuffer.ProcessorId;
> >>>> - RegisterTable[NumberOfCpus + Index].TableLength = 0;
> >>>> - RegisterTable[NumberOfCpus + Index].AllocatedSize = 0;
> >>>> - RegisterTable[NumberOfCpus + Index].RegisterTableEntry = 0;
> >>>> - }
> >>>> - AcpiCpuData->RegisterTable =
> >>>> (EFI_PHYSICAL_ADDRESS)(UINTN)RegisterTable;
> >>>> - AcpiCpuData->PreSmmInitRegisterTable =
> >>>> (EFI_PHYSICAL_ADDRESS)(UINTN)(RegisterTable + NumberOfCpus);
> >>>> }
> >>>>
> >>>> //
> >>>> --
> >>>> 2.19.1.3.g30247aa5d201
> >>>>
> >
>
>
>
>
>
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [edk2-devel] [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless register tables
2021-01-15 8:33 ` [edk2-devel] " Ni, Ray
@ 2021-01-15 8:37 ` Laszlo Ersek
2021-01-19 12:52 ` Ni, Ray
0 siblings, 1 reply; 20+ messages in thread
From: Laszlo Ersek @ 2021-01-15 8:37 UTC (permalink / raw)
To: Ni, Ray, devel@edk2.groups.io, Zeng, Star
Cc: Dong, Eric, Philippe Mathieu-Daudé, Kumar, Rahul1
On 01/15/21 09:33, Ni, Ray wrote:
> Laszlo,
> I will test my patches internally and find a way to give you the patch to be included in your V2.
Thank you!
Laszlo
>
> Thanks,
> Ray
>
>> -----Original Message-----
>> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Laszlo Ersek
>> Sent: Friday, January 15, 2021 1:36 AM
>> To: Zeng, Star <star.zeng@intel.com>; Ni, Ray <ray.ni@intel.com>; devel@edk2.groups.io
>> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé <philmd@redhat.com>; Kumar, Rahul1
>> <rahul1.kumar@intel.com>
>> Subject: Re: [edk2-devel] [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless register tables
>>
>> Hi Star,
>>
>> On 01/14/21 02:55, Zeng, Star wrote:
>>> Just think more, the change below needs a minor enhancement as below, otherwise the table will be overridden by the
>> function's second call.
>>
>> thank you for following up here -- could you or Ray please propose an
>> actual patch for RegisterCpuFeaturesLib, as I requested before?
>>
>> Posting the patch is not necessary; I only need to fetch it from your
>> personal repo(s) -- you can even send me the repo / branch reference
>> off-list. I would include the RegisterCpuFeaturesLib patch in my v2
>> posting of this series.
>>
>> Thanks!
>> Laszlo
>>
>>>
>>>> -----Original Message-----
>>>> From: Ni, Ray <ray.ni@intel.com>
>>>> Sent: Wednesday, January 13, 2021 4:12 PM
>>>> To: Zeng, Star <star.zeng@intel.com>; Laszlo Ersek <lersek@redhat.com>;
>>>> devel@edk2.groups.io
>>>> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
>>>> <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>
>>>> Subject: RE: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless
>>>> register tables
>>>>
>>>> Star,
>>>> Thanks for pointing that.
>>>> RegisterCpuFeaturesLib assumes [PreSmmInit]RegisterTable array is
>>>> allocated but CpuS3Data
>>>> doesn't do that.
>>>>
>>>> Can following change fix the problem?
>>>>
>>>> --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
>>>> +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
>>>> @@ -937,21 +937,19 @@ GetAcpiCpuData (
>>>> EFI_PROCESSOR_INFORMATION ProcessorInfoBuffer;
>>>>
>>>> AcpiCpuData = (ACPI_CPU_DATA *) (UINTN) PcdGet64
>>>> (PcdCpuS3DataAddress);
>>>> - if (AcpiCpuData != NULL) {
>>>> - return AcpiCpuData;
>>>> - }
>>>> -
>>>> - AcpiCpuData = AllocatePages (EFI_SIZE_TO_PAGES (sizeof
>>>> (ACPI_CPU_DATA)));
>>>> - ASSERT (AcpiCpuData != NULL);
>>>> + if (AcpiCpuData == NULL) {
>>>> + AcpiCpuData = AllocatePages (EFI_SIZE_TO_PAGES (sizeof
>>>> (ACPI_CPU_DATA)));
>>>> + ASSERT (AcpiCpuData != NULL);
>>>>
>>>> - //
>>>> - // Set PcdCpuS3DataAddress to the base address of the ACPI_CPU_DATA
>>>> structure
>>>> - //
>>>> - Status = PcdSet64S (PcdCpuS3DataAddress, (UINT64)(UINTN)AcpiCpuData);
>>>> - ASSERT_EFI_ERROR (Status);
>>>> + //
>>>> + // Set PcdCpuS3DataAddress to the base address of the ACPI_CPU_DATA
>>>> structure
>>>> + //
>>>> + Status = PcdSet64S (PcdCpuS3DataAddress,
>>>> (UINT64)(UINTN)AcpiCpuData);
>>>> + ASSERT_EFI_ERROR (Status);
>>>>
>>>> - GetNumberOfProcessor (&NumberOfCpus, &NumberOfEnabledProcessors);
>>>> - AcpiCpuData->NumberOfCpus = (UINT32)NumberOfCpus;
>>>> + GetNumberOfProcessor (&NumberOfCpus,
>>>> &NumberOfEnabledProcessors);
>>>> + AcpiCpuData->NumberOfCpus = (UINT32)NumberOfCpus;
>>>> + }
>>>>
>>>
>>> Add check as below here.
>>>
>>> if (AcpiCpuData->RegisterTable == 0) {
>>>
>>>> //
>>>> // Allocate buffer for empty RegisterTable and PreSmmInitRegisterTable
>>>> for all CPUs
>>>>
>>>> Thanks,
>>>> Ray
>>>>
>>>>> -----Original Message-----
>>>>> From: Zeng, Star <star.zeng@intel.com>
>>>>> Sent: Wednesday, January 13, 2021 3:17 PM
>>>>> To: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>;
>>>>> devel@edk2.groups.io
>>>>> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
>>>>> <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>; Zeng,
>>>> Star
>>>>> <star.zeng@intel.com>
>>>>> Subject: RE: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate
>>>> useless
>>>>> register tables
>>>>>
>>>>> DxeRegisterCpuFeaturesLib still has some execution sequence dependency
>>>> to
>>>>> UefiCpuPkg CpuS3DataDxe.
>>>>> There is ASSERT to happen at
>>>>>
>>>> https://github.com/tianocore/edk2/blob/master/UefiCpuPkg/Library/Regist
>>>> erC
>>>>> puFeaturesLib/RegisterCpuFeaturesLib.c#L1059 when CpuS3DataDxe with
>>>> this
>>>>> patch runs before DxeRegisterCpuFeaturesLib.
>>>>>
>>>>> Thanks,
>>>>> Star
>>>>> -----Original Message-----
>>>>> From: Ni, Ray <ray.ni@intel.com>
>>>>> Sent: Wednesday, January 13, 2021 2:12 PM
>>>>> To: Laszlo Ersek <lersek@redhat.com>; devel@edk2.groups.io
>>>>> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
>>>>> <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>; Zeng,
>>>> Star
>>>>> <star.zeng@intel.com>
>>>>> Subject: RE: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate
>>>> useless
>>>>> register tables
>>>>>
>>>>> Reviewed-by: Ray Ni <ray.ni@intel.com>
>>>>>
>>>>> (I guess you don't want to put Redhat copyright in the patch 1&2 so the
>>>>> copyright year is not updated.
>>>>> Since it's a simple change that make the logic more neat, I am ok with that.)
>>>>>
>>>>> Will you create a pull request to merge all 3 patches together?
>>>>>
>>>>>> -----Original Message-----
>>>>>> From: Laszlo Ersek <lersek@redhat.com>
>>>>>> Sent: Wednesday, January 13, 2021 3:20 AM
>>>>>> To: devel@edk2.groups.io
>>>>>> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
>>>>>> <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>; Ni,
>>>> Ray
>>>>>> <ray.ni@intel.com>; Zeng, Star <star.zeng@intel.com>
>>>>>> Subject: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless
>>>>>> register tables
>>>>>>
>>>>>> CpuS3DataDxe allocates the "RegisterTable" and
>>>> "PreSmmInitRegisterTable"
>>>>>> arrays in ACPI_CPU_DATA just so every processor in the system can have
>>>>>> its own empty register table, matched by APIC ID. This has never been
>>>>>> useful in practice.
>>>>>>
>>>>>> Given commit e992cc3f4859 ("UefiCpuPkg PiSmmCpuDxeSmm: Reduce
>>>>> SMRAM
>>>>>> consumption in CpuS3.c", 2021-01-11), simply leave both
>>>>>> "AcpiCpuData->RegisterTable" and "AcpiCpuData-
>>>>> PreSmmInitRegisterTable"
>>>>>> initialized to the zero address. This simplifies the driver, and saves
>>>>>> both normal RAM (boot services data type memory) and -- in
>>>>>> PiSmmCpuDxeSmm
>>>>>> -- SMRAM.
>>>>>>
>>>>>> Cc: Eric Dong <eric.dong@intel.com>
>>>>>> Cc: Philippe Mathieu-Daudé <philmd@redhat.com>
>>>>>> Cc: Rahul Kumar <rahul1.kumar@intel.com>
>>>>>> Cc: Ray Ni <ray.ni@intel.com>
>>>>>> Cc: Star Zeng <star.zeng@intel.com>
>>>>>> Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3159
>>>>>> Signed-off-by: Laszlo Ersek <lersek@redhat.com>
>>>>>> ---
>>>>>>
>>>>>> Notes:
>>>>>> Tested by temporarily replacing OvmfPkgPkg/CpuS3DataDxe in the
>>>>>> OVMF
>>>>>> IA32
>>>>>> and IA32X64 platforms with this driver -- this driver works OK in OVMF
>>>>>> as long as no CPUs are hot-plugged.
>>>>>>
>>>>>> UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c | 32 --------------------
>>>>>> 1 file changed, 32 deletions(-)
>>>>>>
>>>>>> diff --git a/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
>>>>>> b/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
>>>>>> index 2be335d91903..078af36cfb41 100644
>>>>>> --- a/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
>>>>>> +++ b/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
>>>>>> @@ -165,10 +165,6 @@ CpuS3DataInitialize (
>>>>>> UINTN NumberOfCpus;
>>>>>> UINTN NumberOfEnabledProcessors;
>>>>>> VOID *Stack;
>>>>>> - UINTN TableSize;
>>>>>> - CPU_REGISTER_TABLE *RegisterTable;
>>>>>> - UINTN Index;
>>>>>> - EFI_PROCESSOR_INFORMATION ProcessorInfoBuffer;
>>>>>> UINTN GdtSize;
>>>>>> UINTN IdtSize;
>>>>>> VOID *Gdt;
>>>>>> @@ -255,34 +251,6 @@ CpuS3DataInitialize (
>>>>>> AcpiCpuData->PreSmmInitRegisterTable = OldAcpiCpuData-
>>>>>>> PreSmmInitRegisterTable;
>>>>>> AcpiCpuData->ApLocation = OldAcpiCpuData->ApLocation;
>>>>>> CopyMem (&AcpiCpuData->CpuStatus, &OldAcpiCpuData->CpuStatus,
>>>>>> sizeof (CPU_STATUS_INFORMATION));
>>>>>> - } else {
>>>>>> - //
>>>>>> - // Allocate buffer for empty RegisterTable and
>>>> PreSmmInitRegisterTable
>>>>> for
>>>>>> all CPUs
>>>>>> - //
>>>>>> - TableSize = 2 * NumberOfCpus * sizeof (CPU_REGISTER_TABLE);
>>>>>> - RegisterTable = (CPU_REGISTER_TABLE *)AllocateZeroPages
>>>> (TableSize);
>>>>>> - ASSERT (RegisterTable != NULL);
>>>>>> -
>>>>>> - for (Index = 0; Index < NumberOfCpus; Index++) {
>>>>>> - Status = MpServices->GetProcessorInfo (
>>>>>> - MpServices,
>>>>>> - Index,
>>>>>> - &ProcessorInfoBuffer
>>>>>> - );
>>>>>> - ASSERT_EFI_ERROR (Status);
>>>>>> -
>>>>>> - RegisterTable[Index].InitialApicId =
>>>>>> (UINT32)ProcessorInfoBuffer.ProcessorId;
>>>>>> - RegisterTable[Index].TableLength = 0;
>>>>>> - RegisterTable[Index].AllocatedSize = 0;
>>>>>> - RegisterTable[Index].RegisterTableEntry = 0;
>>>>>> -
>>>>>> - RegisterTable[NumberOfCpus + Index].InitialApicId =
>>>>>> (UINT32)ProcessorInfoBuffer.ProcessorId;
>>>>>> - RegisterTable[NumberOfCpus + Index].TableLength = 0;
>>>>>> - RegisterTable[NumberOfCpus + Index].AllocatedSize = 0;
>>>>>> - RegisterTable[NumberOfCpus + Index].RegisterTableEntry = 0;
>>>>>> - }
>>>>>> - AcpiCpuData->RegisterTable =
>>>>>> (EFI_PHYSICAL_ADDRESS)(UINTN)RegisterTable;
>>>>>> - AcpiCpuData->PreSmmInitRegisterTable =
>>>>>> (EFI_PHYSICAL_ADDRESS)(UINTN)(RegisterTable + NumberOfCpus);
>>>>>> }
>>>>>>
>>>>>> //
>>>>>> --
>>>>>> 2.19.1.3.g30247aa5d201
>>>>>>
>>>
>>
>>
>>
>>
>>
>
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [edk2-devel] [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless register tables
2021-01-15 8:37 ` Laszlo Ersek
@ 2021-01-19 12:52 ` Ni, Ray
2021-01-19 13:48 ` Laszlo Ersek
0 siblings, 1 reply; 20+ messages in thread
From: Ni, Ray @ 2021-01-19 12:52 UTC (permalink / raw)
To: devel@edk2.groups.io, lersek@redhat.com, Zeng, Star
Cc: Dong, Eric, Philippe Mathieu-Daudé, Kumar, Rahul1
https://github.com/niruiyu/edk2/commit/7091aa50b9d87240b14e5a74398eab010ffc4d3d
Laszlo, Star,
Please check this code change. I verified S3 boot in an internal platform.
Thanks,
Ray
> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Laszlo Ersek
> Sent: Friday, January 15, 2021 4:37 PM
> To: Ni, Ray <ray.ni@intel.com>; devel@edk2.groups.io; Zeng, Star <star.zeng@intel.com>
> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé <philmd@redhat.com>; Kumar, Rahul1
> <rahul1.kumar@intel.com>
> Subject: Re: [edk2-devel] [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless register tables
>
> On 01/15/21 09:33, Ni, Ray wrote:
> > Laszlo,
> > I will test my patches internally and find a way to give you the patch to be included in your V2.
>
> Thank you!
> Laszlo
>
> >
> > Thanks,
> > Ray
> >
> >> -----Original Message-----
> >> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Laszlo Ersek
> >> Sent: Friday, January 15, 2021 1:36 AM
> >> To: Zeng, Star <star.zeng@intel.com>; Ni, Ray <ray.ni@intel.com>; devel@edk2.groups.io
> >> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé <philmd@redhat.com>; Kumar, Rahul1
> >> <rahul1.kumar@intel.com>
> >> Subject: Re: [edk2-devel] [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless register tables
> >>
> >> Hi Star,
> >>
> >> On 01/14/21 02:55, Zeng, Star wrote:
> >>> Just think more, the change below needs a minor enhancement as below, otherwise the table will be overridden by
> the
> >> function's second call.
> >>
> >> thank you for following up here -- could you or Ray please propose an
> >> actual patch for RegisterCpuFeaturesLib, as I requested before?
> >>
> >> Posting the patch is not necessary; I only need to fetch it from your
> >> personal repo(s) -- you can even send me the repo / branch reference
> >> off-list. I would include the RegisterCpuFeaturesLib patch in my v2
> >> posting of this series.
> >>
> >> Thanks!
> >> Laszlo
> >>
> >>>
> >>>> -----Original Message-----
> >>>> From: Ni, Ray <ray.ni@intel.com>
> >>>> Sent: Wednesday, January 13, 2021 4:12 PM
> >>>> To: Zeng, Star <star.zeng@intel.com>; Laszlo Ersek <lersek@redhat.com>;
> >>>> devel@edk2.groups.io
> >>>> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
> >>>> <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>
> >>>> Subject: RE: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless
> >>>> register tables
> >>>>
> >>>> Star,
> >>>> Thanks for pointing that.
> >>>> RegisterCpuFeaturesLib assumes [PreSmmInit]RegisterTable array is
> >>>> allocated but CpuS3Data
> >>>> doesn't do that.
> >>>>
> >>>> Can following change fix the problem?
> >>>>
> >>>> --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
> >>>> +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
> >>>> @@ -937,21 +937,19 @@ GetAcpiCpuData (
> >>>> EFI_PROCESSOR_INFORMATION ProcessorInfoBuffer;
> >>>>
> >>>> AcpiCpuData = (ACPI_CPU_DATA *) (UINTN) PcdGet64
> >>>> (PcdCpuS3DataAddress);
> >>>> - if (AcpiCpuData != NULL) {
> >>>> - return AcpiCpuData;
> >>>> - }
> >>>> -
> >>>> - AcpiCpuData = AllocatePages (EFI_SIZE_TO_PAGES (sizeof
> >>>> (ACPI_CPU_DATA)));
> >>>> - ASSERT (AcpiCpuData != NULL);
> >>>> + if (AcpiCpuData == NULL) {
> >>>> + AcpiCpuData = AllocatePages (EFI_SIZE_TO_PAGES (sizeof
> >>>> (ACPI_CPU_DATA)));
> >>>> + ASSERT (AcpiCpuData != NULL);
> >>>>
> >>>> - //
> >>>> - // Set PcdCpuS3DataAddress to the base address of the ACPI_CPU_DATA
> >>>> structure
> >>>> - //
> >>>> - Status = PcdSet64S (PcdCpuS3DataAddress, (UINT64)(UINTN)AcpiCpuData);
> >>>> - ASSERT_EFI_ERROR (Status);
> >>>> + //
> >>>> + // Set PcdCpuS3DataAddress to the base address of the ACPI_CPU_DATA
> >>>> structure
> >>>> + //
> >>>> + Status = PcdSet64S (PcdCpuS3DataAddress,
> >>>> (UINT64)(UINTN)AcpiCpuData);
> >>>> + ASSERT_EFI_ERROR (Status);
> >>>>
> >>>> - GetNumberOfProcessor (&NumberOfCpus, &NumberOfEnabledProcessors);
> >>>> - AcpiCpuData->NumberOfCpus = (UINT32)NumberOfCpus;
> >>>> + GetNumberOfProcessor (&NumberOfCpus,
> >>>> &NumberOfEnabledProcessors);
> >>>> + AcpiCpuData->NumberOfCpus = (UINT32)NumberOfCpus;
> >>>> + }
> >>>>
> >>>
> >>> Add check as below here.
> >>>
> >>> if (AcpiCpuData->RegisterTable == 0) {
> >>>
> >>>> //
> >>>> // Allocate buffer for empty RegisterTable and PreSmmInitRegisterTable
> >>>> for all CPUs
> >>>>
> >>>> Thanks,
> >>>> Ray
> >>>>
> >>>>> -----Original Message-----
> >>>>> From: Zeng, Star <star.zeng@intel.com>
> >>>>> Sent: Wednesday, January 13, 2021 3:17 PM
> >>>>> To: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>;
> >>>>> devel@edk2.groups.io
> >>>>> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
> >>>>> <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>; Zeng,
> >>>> Star
> >>>>> <star.zeng@intel.com>
> >>>>> Subject: RE: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate
> >>>> useless
> >>>>> register tables
> >>>>>
> >>>>> DxeRegisterCpuFeaturesLib still has some execution sequence dependency
> >>>> to
> >>>>> UefiCpuPkg CpuS3DataDxe.
> >>>>> There is ASSERT to happen at
> >>>>>
> >>>> https://github.com/tianocore/edk2/blob/master/UefiCpuPkg/Library/Regist
> >>>> erC
> >>>>> puFeaturesLib/RegisterCpuFeaturesLib.c#L1059 when CpuS3DataDxe with
> >>>> this
> >>>>> patch runs before DxeRegisterCpuFeaturesLib.
> >>>>>
> >>>>> Thanks,
> >>>>> Star
> >>>>> -----Original Message-----
> >>>>> From: Ni, Ray <ray.ni@intel.com>
> >>>>> Sent: Wednesday, January 13, 2021 2:12 PM
> >>>>> To: Laszlo Ersek <lersek@redhat.com>; devel@edk2.groups.io
> >>>>> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
> >>>>> <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>; Zeng,
> >>>> Star
> >>>>> <star.zeng@intel.com>
> >>>>> Subject: RE: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate
> >>>> useless
> >>>>> register tables
> >>>>>
> >>>>> Reviewed-by: Ray Ni <ray.ni@intel.com>
> >>>>>
> >>>>> (I guess you don't want to put Redhat copyright in the patch 1&2 so the
> >>>>> copyright year is not updated.
> >>>>> Since it's a simple change that make the logic more neat, I am ok with that.)
> >>>>>
> >>>>> Will you create a pull request to merge all 3 patches together?
> >>>>>
> >>>>>> -----Original Message-----
> >>>>>> From: Laszlo Ersek <lersek@redhat.com>
> >>>>>> Sent: Wednesday, January 13, 2021 3:20 AM
> >>>>>> To: devel@edk2.groups.io
> >>>>>> Cc: Dong, Eric <eric.dong@intel.com>; Philippe Mathieu-Daudé
> >>>>>> <philmd@redhat.com>; Kumar, Rahul1 <rahul1.kumar@intel.com>; Ni,
> >>>> Ray
> >>>>>> <ray.ni@intel.com>; Zeng, Star <star.zeng@intel.com>
> >>>>>> Subject: [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless
> >>>>>> register tables
> >>>>>>
> >>>>>> CpuS3DataDxe allocates the "RegisterTable" and
> >>>> "PreSmmInitRegisterTable"
> >>>>>> arrays in ACPI_CPU_DATA just so every processor in the system can have
> >>>>>> its own empty register table, matched by APIC ID. This has never been
> >>>>>> useful in practice.
> >>>>>>
> >>>>>> Given commit e992cc3f4859 ("UefiCpuPkg PiSmmCpuDxeSmm: Reduce
> >>>>> SMRAM
> >>>>>> consumption in CpuS3.c", 2021-01-11), simply leave both
> >>>>>> "AcpiCpuData->RegisterTable" and "AcpiCpuData-
> >>>>> PreSmmInitRegisterTable"
> >>>>>> initialized to the zero address. This simplifies the driver, and saves
> >>>>>> both normal RAM (boot services data type memory) and -- in
> >>>>>> PiSmmCpuDxeSmm
> >>>>>> -- SMRAM.
> >>>>>>
> >>>>>> Cc: Eric Dong <eric.dong@intel.com>
> >>>>>> Cc: Philippe Mathieu-Daudé <philmd@redhat.com>
> >>>>>> Cc: Rahul Kumar <rahul1.kumar@intel.com>
> >>>>>> Cc: Ray Ni <ray.ni@intel.com>
> >>>>>> Cc: Star Zeng <star.zeng@intel.com>
> >>>>>> Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3159
> >>>>>> Signed-off-by: Laszlo Ersek <lersek@redhat.com>
> >>>>>> ---
> >>>>>>
> >>>>>> Notes:
> >>>>>> Tested by temporarily replacing OvmfPkgPkg/CpuS3DataDxe in the
> >>>>>> OVMF
> >>>>>> IA32
> >>>>>> and IA32X64 platforms with this driver -- this driver works OK in OVMF
> >>>>>> as long as no CPUs are hot-plugged.
> >>>>>>
> >>>>>> UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c | 32 --------------------
> >>>>>> 1 file changed, 32 deletions(-)
> >>>>>>
> >>>>>> diff --git a/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
> >>>>>> b/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
> >>>>>> index 2be335d91903..078af36cfb41 100644
> >>>>>> --- a/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
> >>>>>> +++ b/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c
> >>>>>> @@ -165,10 +165,6 @@ CpuS3DataInitialize (
> >>>>>> UINTN NumberOfCpus;
> >>>>>> UINTN NumberOfEnabledProcessors;
> >>>>>> VOID *Stack;
> >>>>>> - UINTN TableSize;
> >>>>>> - CPU_REGISTER_TABLE *RegisterTable;
> >>>>>> - UINTN Index;
> >>>>>> - EFI_PROCESSOR_INFORMATION ProcessorInfoBuffer;
> >>>>>> UINTN GdtSize;
> >>>>>> UINTN IdtSize;
> >>>>>> VOID *Gdt;
> >>>>>> @@ -255,34 +251,6 @@ CpuS3DataInitialize (
> >>>>>> AcpiCpuData->PreSmmInitRegisterTable = OldAcpiCpuData-
> >>>>>>> PreSmmInitRegisterTable;
> >>>>>> AcpiCpuData->ApLocation = OldAcpiCpuData->ApLocation;
> >>>>>> CopyMem (&AcpiCpuData->CpuStatus, &OldAcpiCpuData->CpuStatus,
> >>>>>> sizeof (CPU_STATUS_INFORMATION));
> >>>>>> - } else {
> >>>>>> - //
> >>>>>> - // Allocate buffer for empty RegisterTable and
> >>>> PreSmmInitRegisterTable
> >>>>> for
> >>>>>> all CPUs
> >>>>>> - //
> >>>>>> - TableSize = 2 * NumberOfCpus * sizeof (CPU_REGISTER_TABLE);
> >>>>>> - RegisterTable = (CPU_REGISTER_TABLE *)AllocateZeroPages
> >>>> (TableSize);
> >>>>>> - ASSERT (RegisterTable != NULL);
> >>>>>> -
> >>>>>> - for (Index = 0; Index < NumberOfCpus; Index++) {
> >>>>>> - Status = MpServices->GetProcessorInfo (
> >>>>>> - MpServices,
> >>>>>> - Index,
> >>>>>> - &ProcessorInfoBuffer
> >>>>>> - );
> >>>>>> - ASSERT_EFI_ERROR (Status);
> >>>>>> -
> >>>>>> - RegisterTable[Index].InitialApicId =
> >>>>>> (UINT32)ProcessorInfoBuffer.ProcessorId;
> >>>>>> - RegisterTable[Index].TableLength = 0;
> >>>>>> - RegisterTable[Index].AllocatedSize = 0;
> >>>>>> - RegisterTable[Index].RegisterTableEntry = 0;
> >>>>>> -
> >>>>>> - RegisterTable[NumberOfCpus + Index].InitialApicId =
> >>>>>> (UINT32)ProcessorInfoBuffer.ProcessorId;
> >>>>>> - RegisterTable[NumberOfCpus + Index].TableLength = 0;
> >>>>>> - RegisterTable[NumberOfCpus + Index].AllocatedSize = 0;
> >>>>>> - RegisterTable[NumberOfCpus + Index].RegisterTableEntry = 0;
> >>>>>> - }
> >>>>>> - AcpiCpuData->RegisterTable =
> >>>>>> (EFI_PHYSICAL_ADDRESS)(UINTN)RegisterTable;
> >>>>>> - AcpiCpuData->PreSmmInitRegisterTable =
> >>>>>> (EFI_PHYSICAL_ADDRESS)(UINTN)(RegisterTable + NumberOfCpus);
> >>>>>> }
> >>>>>>
> >>>>>> //
> >>>>>> --
> >>>>>> 2.19.1.3.g30247aa5d201
> >>>>>>
> >>>
> >>
> >>
> >>
> >>
> >>
> >
>
>
>
>
>
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [edk2-devel] [PATCH 2/3] UefiCpuPkg/CpuS3DataDxe: do not allocate useless register tables
2021-01-19 12:52 ` Ni, Ray
@ 2021-01-19 13:48 ` Laszlo Ersek
0 siblings, 0 replies; 20+ messages in thread
From: Laszlo Ersek @ 2021-01-19 13:48 UTC (permalink / raw)
To: devel, ray.ni, Zeng, Star
Cc: Dong, Eric, Philippe Mathieu-Daudé, Kumar, Rahul1
On 01/19/21 13:52, Ni, Ray wrote:
> https://github.com/niruiyu/edk2/commit/7091aa50b9d87240b14e5a74398eab010ffc4d3d
> Laszlo, Star,
> Please check this code change. I verified S3 boot in an internal platform.
Thanks -- I've picked this commit to my local v2 branch; I'm going to
submit the v2 series soon. I'd like Star to review the new patch on the
list, as part of the v2 series.
Thanks
Laszlo
^ permalink raw reply [flat|nested] 20+ messages in thread