Revision: 16362
http://sourceforge.net/p/edk2/code/16362
Author: jljusten
Date: 2014-11-13 18:28:20 +0000 (Thu, 13 Nov 2014)
Log Message:
-----------
UefiCpuPkg/MpService: move settimer out to InitMpSystemData
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Chen Fan <[email protected]>
Reviewed-by: Jeff Fan <[email protected]>
Modified Paths:
--------------
trunk/edk2/UefiCpuPkg/CpuDxe/CpuMp.c
Modified: trunk/edk2/UefiCpuPkg/CpuDxe/CpuMp.c
===================================================================
--- trunk/edk2/UefiCpuPkg/CpuDxe/CpuMp.c 2014-11-13 18:28:10 UTC (rev
16361)
+++ trunk/edk2/UefiCpuPkg/CpuDxe/CpuMp.c 2014-11-13 18:28:20 UTC (rev
16362)
@@ -25,6 +25,8 @@
VOID *mTopOfApCommonStack = 0;
VOID *mApStackStart = 0;
+volatile BOOLEAN mStopCheckAllAPsStatus = TRUE;
+
EFI_MP_SERVICES_PROTOCOL mMpServicesTemplate = {
GetNumberOfProcessors,
GetProcessorInfo,
@@ -637,6 +639,11 @@
}
}
+ //
+ // temporarily stop checkAllAPsStatus for initialize parameters.
+ //
+ mStopCheckAllAPsStatus = TRUE;
+
mMpSystemData.Procedure = Procedure;
mMpSystemData.ProcedureArgument = ProcedureArgument;
mMpSystemData.WaitEvent = WaitEvent;
@@ -686,13 +693,13 @@
}
}
+ mStopCheckAllAPsStatus = FALSE;
+
if (WaitEvent != NULL) {
- Status = gBS->SetTimer (
- mMpSystemData.CheckAllAPsEvent,
- TimerPeriodic,
- EFI_TIMER_PERIOD_MICROSECONDS (100)
- );
- return Status;
+ //
+ // non blocking
+ //
+ return EFI_SUCCESS;
}
while (TRUE) {
@@ -819,7 +826,6 @@
)
{
CPU_DATA_BLOCK *CpuData;
- EFI_STATUS Status;
CpuData = NULL;
@@ -849,6 +855,11 @@
return EFI_NOT_READY;
}
+ //
+ // temporarily stop checkAllAPsStatus for initialize parameters.
+ //
+ mStopCheckAllAPsStatus = TRUE;
+
SetApState (CpuData, CpuStateReady);
SetApProcedure (CpuData, Procedure, ProcedureArgument);
@@ -858,16 +869,13 @@
CpuData->TimeoutActive = !!(TimeoutInMicroseconds);
CpuData->Finished = Finished;
+ mStopCheckAllAPsStatus = FALSE;
+
if (WaitEvent != NULL) {
//
// Non Blocking
//
- Status = gBS->SetTimer (
- CpuData->CheckThisAPEvent,
- TimerPeriodic,
- EFI_TIMER_PERIOD_MICROSECONDS (100)
- );
- return Status;
+ return EFI_SUCCESS;
}
//
@@ -1194,11 +1202,9 @@
return;
out:
- gBS->SetTimer (CpuData->CheckThisAPEvent, TimerCancel, 0);
- if (CpuData->WaitEvent) {
- gBS->SignalEvent (CpuData->WaitEvent);
- CpuData->WaitEvent = NULL;
- }
+ CpuData->TimeoutActive = FALSE;
+ gBS->SignalEvent (CpuData->WaitEvent);
+ CpuData->WaitEvent = NULL;
}
/**
@@ -1218,37 +1224,63 @@
IN VOID *Context
)
{
+ CPU_DATA_BLOCK *CpuData;
+ UINTN Number;
+
if (mMpSystemData.TimeoutActive) {
mMpSystemData.Timeout -= gPollInterval;
}
- CheckAndUpdateAllAPsToIdleState ();
+ if (mStopCheckAllAPsStatus) {
+ return;
+ }
- //
- // task timeout
- //
- if (mMpSystemData.TimeoutActive && mMpSystemData.Timeout < 0) {
- ResetAllFailedAPs();
+ if (mMpSystemData.WaitEvent != NULL) {
+ CheckAndUpdateAllAPsToIdleState ();
//
- // force exit
+ // task timeout
//
- mMpSystemData.FinishCount = mMpSystemData.StartCount;
- }
+ if (mMpSystemData.TimeoutActive && mMpSystemData.Timeout < 0) {
+ ResetAllFailedAPs();
+ //
+ // force exit
+ //
+ mMpSystemData.FinishCount = mMpSystemData.StartCount;
+ }
- if (mMpSystemData.FinishCount != mMpSystemData.StartCount) {
- return;
- }
+ if (mMpSystemData.FinishCount != mMpSystemData.StartCount) {
+ return;
+ }
- gBS->SetTimer (
- mMpSystemData.CheckAllAPsEvent,
- TimerCancel,
- 0
- );
-
- if (mMpSystemData.WaitEvent) {
+ mMpSystemData.TimeoutActive = FALSE;
gBS->SignalEvent (mMpSystemData.WaitEvent);
mMpSystemData.WaitEvent = NULL;
+ mStopCheckAllAPsStatus = TRUE;
}
+
+ //
+ // check each AP status for StartupThisAP
+ //
+ for (Number = 0; Number < mMpSystemData.NumberOfProcessors; Number++) {
+ CpuData = &mMpSystemData.CpuDatas[Number];
+ if (TestCpuStatusFlag (CpuData, PROCESSOR_AS_BSP_BIT)) {
+ //
+ // Skip BSP
+ //
+ continue;
+ }
+
+ if (!TestCpuStatusFlag (CpuData, PROCESSOR_ENABLED_BIT)) {
+ //
+ // Skip Disabled processors
+ //
+ continue;
+ }
+
+ if (CpuData->WaitEvent) {
+ CheckThisAPStatus (NULL, (VOID *)CpuData);
+ }
+ }
}
/**
@@ -1324,8 +1356,6 @@
VOID
)
{
- UINTN ProcessorNumber;
- CPU_DATA_BLOCK *CpuData;
EFI_STATUS Status;
ZeroMem (&mMpSystemData, sizeof (MP_SYSTEM_DATA));
@@ -1345,17 +1375,15 @@
);
ASSERT_EFI_ERROR (Status);
- for (ProcessorNumber = 0; ProcessorNumber < gMaxLogicalProcessorNumber;
ProcessorNumber++) {
- CpuData = &mMpSystemData.CpuDatas[ProcessorNumber];
- Status = gBS->CreateEvent (
- EVT_TIMER | EVT_NOTIFY_SIGNAL,
- TPL_CALLBACK,
- CheckThisAPStatus,
- (VOID *) CpuData,
- &CpuData->CheckThisAPEvent
- );
- ASSERT_EFI_ERROR (Status);
- }
+ //
+ // Set timer to check all APs status.
+ //
+ Status = gBS->SetTimer (
+ mMpSystemData.CheckAllAPsEvent,
+ TimerPeriodic,
+ EFI_TIMER_PERIOD_MICROSECONDS (100)
+ );
+ ASSERT_EFI_ERROR (Status);
//
// BSP
------------------------------------------------------------------------------
Comprehensive Server Monitoring with Site24x7.
Monitor 10 servers for $9/Month.
Get alerted through email, SMS, voice calls or mobile push notifications.
Take corrective actions from your mobile device.
http://pubads.g.doubleclick.net/gampad/clk?id=154624111&iu=/4140/ostg.clktrk
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits