On 07/08/16 10:59, Fan, Jeff wrote: > Laszlo, > > Thanks your feedback and provided the history on MTRRs sync code. > > DEBUG () running on Aps is a common issue to be avoided. > For MtrrLib, DEBUG() is using DEBUG_CACHE for debug purpose only. > Usually, MTRRs setting should be same between BSP/Aps. Dump MTRRs are > enough for BSP. Maybe, we could enhance MtrrLib to avoid DEBUG () > running on Aps.
That's a good idea! Maybe we can sneak in some context so that MtrrDebugPrintAllMtrrsWorker() knows it is running on an AP, and omits debug logging. > For the case 2) in StartupAllAPs() call in InitializeMpSupport(), it > will be handled in our refactor on MP support between CpuMpPei and > CpuDxe driver as Mike mentioned. I wish we could sent out MP Initial > Lib support in a couple of weeks. Sounds great! Thanks! Laszlo > > Thanks! > Jeff > > > -----Original Message----- > From: Laszlo Ersek [mailto:[email protected]] > Sent: Friday, July 08, 2016 4:38 PM > To: Fan, Jeff; [email protected] > Cc: Kinney, Michael D; Tian, Feng > Subject: Re: [Patch] UefiCpuPkg/CpuDxe: StartupAllAPs in parallel mode > > Jeff, > > On 07/08/16 09:45, Jeff Fan wrote: >> SetMemoryAttributes() will sync BSP's MTRRs settings to all APs by >> StartupAllAPs service in serial mode. It may caused much performance >> impact if there are too much processors in system. This update is to >> invoke StartupAllAps in parallel mode. IA32 SDM does suggest to program >> MTRRs in parallel mode. >> >> Cc: Michael Kinney <[email protected]> >> Cc: Feng Tian <[email protected]> >> Cc: Laszlo Ersek <[email protected]> >> Contributed-under: TianoCore Contribution Agreement 1.0 >> Signed-off-by: Jeff Fan <[email protected]> >> Reviewed-by: Feng Tian <[email protected]> >> --- >> UefiCpuPkg/CpuDxe/CpuDxe.c | 4 ++-- >> 1 file changed, 2 insertions(+), 2 deletions(-) >> >> diff --git a/UefiCpuPkg/CpuDxe/CpuDxe.c b/UefiCpuPkg/CpuDxe/CpuDxe.c >> index daf97bd..78b2c88 100644 >> --- a/UefiCpuPkg/CpuDxe/CpuDxe.c >> +++ b/UefiCpuPkg/CpuDxe/CpuDxe.c >> @@ -1,7 +1,7 @@ >> /** @file >> CPU DXE Module. >> >> - Copyright (c) 2008 - 2013, Intel Corporation. All rights >> reserved.<BR> >> + Copyright (c) 2008 - 2016, Intel Corporation. All rights >> + reserved.<BR> >> This program and the accompanying materials >> are licensed and made available under the terms and conditions of the BSD >> License >> which accompanies this distribution. The full text of the license >> may be found at @@ -422,7 +422,7 @@ CpuSetMemoryAttributes ( >> MpStatus = MpService->StartupAllAPs ( >> MpService, // This >> SetMtrrsFromBuffer, // Procedure >> - TRUE, // SingleThread >> + FALSE, // SingleThread >> NULL, // WaitEvent >> 0, // TimeoutInMicrosecsond >> &MtrrSettings, // ProcedureArgument >> > > (1) This change looks "obvious" on the surface, and to be honest, when > looking at your patch now, I couldn't tell for a minute what I was thinking > when I set SingleThread=TRUE, in commit 94941c8853448. > > Digging down a bit, I believe I remember now. The APs execute the following > call chain: > > SetMtrrsFromBuffer() [UefiCpuPkg/CpuDxe/CpuMp.c] > MtrrSetAllMtrrs() [UefiCpuPkg/Library/MtrrLib/MtrrLib.c] > MtrrDebugPrintAllMtrrs() [UefiCpuPkg/Library/MtrrLib/MtrrLib.c] > MtrrDebugPrintAllMtrrsWorker() [UefiCpuPkg/Library/MtrrLib/MtrrLib.c] > > I believe my reason for SingleThread=TRUE may have been that > MtrrDebugPrintAllMtrrsWorker() is not safe for parallel execution (with the > many DEBUG()s in it). > > I agree this would be a nice improvement, both for performance and for > compliance with the SDM -- if only we could make SetMtrrsFromBuffer() > thread-safe, top to bottom. > > (In my other patchset that you just reviewed (thanks for that BTW!), I also > verified that the WriteFeatureControl() AP procedure would be safe for > parallel execution. It is: it calls only AsmWriteMsr64(), which compiles to a > single WRMSR instruction. But here, SetMtrrsFromBuffer() is much more > complex, top to bottom.) > > (2) If we end up modifying SingleThread to FALSE, then this is not the only > location that should be updated -- there's another StartupAllAPs() call in > InitializeMpSupport(). (See again commit 94941c8853448.) > > Thanks! > Laszlo > _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

