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

Reply via email to