From e4aaf764281d12cb8bfe605393a5520e00715838 Mon Sep 17 00:00:00 2001 From: Chen Fan Date: Thu, 13 Nov 2014 18:28:48 +0000 Subject: UefiCpuPkg/MpService: avoid next timer getting into CheckAllAPsStatus() Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Chen Fan Reviewed-by: Jeff Fan git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16364 6f19259b-4bc3-4df7-8a09-765794883524 --- UefiCpuPkg/CpuDxe/CpuMp.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) (limited to 'UefiCpuPkg') diff --git a/UefiCpuPkg/CpuDxe/CpuMp.c b/UefiCpuPkg/CpuDxe/CpuMp.c index a37e45aebd..3e30d7417d 100644 --- a/UefiCpuPkg/CpuDxe/CpuMp.c +++ b/UefiCpuPkg/CpuDxe/CpuMp.c @@ -1231,6 +1231,7 @@ CheckAllAPsStatus ( { CPU_DATA_BLOCK *CpuData; UINTN Number; + EFI_STATUS Status; if (mMpSystemData.TimeoutActive) { mMpSystemData.Timeout -= gPollInterval; @@ -1240,6 +1241,16 @@ CheckAllAPsStatus ( return; } + // + // avoid next timer enter. + // + Status = gBS->SetTimer ( + mMpSystemData.CheckAllAPsEvent, + TimerCancel, + 0 + ); + ASSERT_EFI_ERROR (Status); + if (mMpSystemData.WaitEvent != NULL) { CheckAndUpdateAllAPsToIdleState (); // @@ -1254,13 +1265,15 @@ CheckAllAPsStatus ( } if (mMpSystemData.FinishCount != mMpSystemData.StartCount) { - return; + goto EXIT; } mMpSystemData.TimeoutActive = FALSE; gBS->SignalEvent (mMpSystemData.WaitEvent); mMpSystemData.WaitEvent = NULL; mStopCheckAllAPsStatus = TRUE; + + goto EXIT; } // @@ -1286,6 +1299,14 @@ CheckAllAPsStatus ( CheckThisAPStatus (NULL, (VOID *)CpuData); } } + +EXIT: + Status = gBS->SetTimer ( + mMpSystemData.CheckAllAPsEvent, + TimerPeriodic, + EFI_TIMER_PERIOD_MICROSECONDS (100) + ); + ASSERT_EFI_ERROR (Status); } /** -- cgit v1.2.3