> >   WaitForAllAPs() has two purpose:
> >    1. Make sure all Aps have set the Present.
> >    2. Get ready for programming MTRRs to make sure cpus in the same start
> line.
> >
> > if so, that will be better as existing logic, it can also save some time 
> > for the
> Present flag check in SmmWaitForApArrival
> 
> OK, this argument makes sense to me.
> 
> I didn't realize that WaitForAllAPs() -- called by BSPHandler() after
> calling SmmWaitForApArrival() -- already *effectively* ensured that the
> APs had their Present flag set!
> 
> That happens because:
> 
> (a) WaitForAllAPs() pends the "Run" semaphore of each AP.
> 
> (b) The APHandler() function sets the Present flag *first*.
> 
> (c) If
> 
>   (SyncMode == SmmCpuSyncModeTradition) ||
>   SmmCpuFeaturesNeedConfigureMtrrs ()
> 
> is true, then APHandler() posts the "Run" semaphore, *second*.
> 
> Therefore, once WaitForAllAPs() has acquired all AP "Run" semaphores,
> all AP Present flags must be set.
> 

Yes, correct!


> This is not obvious at all, but it looks correct.
> 
> Therefore I agree that your patch does not introduce asymmetry between
> SmmCpuRendezvous() and BSPHandler(). Instead, your patch eliminates
> asymmetry, because now SmmCpuRendezvous() will wait for the Present
> flags of the APs (if the above-quoted condition is false), similarly to
> how BSPHandler already does (if the condition is true).
> 
> 
> Now, I have not had the time yet to re-review your patch set
> 
>   [PATCH v3 0/6] Refine SMM CPU Sync flow and abstract SmmCpuSyncLib
> 
> As far as I remember (from v1), that patch set reorganizes exactly these
> "Run" semaphore release/acquire patterns.
> 
> (3) Can you confirm that your v3 patch set will not invalidate this
> discussion? I.e., can you confirm that WaitForAllAPs() will *still*
> ensure, via the Run semaphores, that the Present flags will have been set?
> 

Yes, the series patch sent by me won't impact the behavior above, smm cpu 
driver will still make sure the present flag set.   


> (4) Please add the following to the commit message:
> 
> -------
> BSPHandler -> { SmmWaitForApArrival, WaitForAllAPs } already awaits that
> the Present flag is set for all APs, namely via the AP Run semaphores.
> Therefore this patch ensures symmetry between BSPHandler (when [1] is
> true) and SmmCpuRendezvous() (when [1] is false).
> 
> [1] (SyncMode == SmmCpuSyncModeTradition) ||
>     SmmCpuFeaturesNeedConfigureMtrrs ()
> -------
> 
> More comments below:
> 
> >
> >>
> >> (2) I notice that a similar "busy loop", waiting for Present flags, is
> >> in BSPHandler().
> >>
> >> Do you think we could call CpuPause() in all such "busy loops" (just
> >> before the end of the "while" body)? I think that's supposed to improve
> >> the system's throughput, considered as a whole. The function's comment
> >> says,
> >>
> >>   Requests CPU to pause for a short period of time. Typically used in MP
> >>   systems to prevent memory starvation while waiting for a spin lock.
> >>
> >
> > Do you mean the below WaitForAllAPs()? There is already has the CpuPause
> check within WaitForSemaphore().
> >
> >     //
> >     // Wait for all APs to get ready for programming MTRRs
> >     //
> >     WaitForAllAPs (ApCount);
> 
> Yes, that's the pattern we should follow here.
> 
> The call chain
> 
>   BSPHandler -> WaitForAllAPs -> WaitForSemaphore -> CpuPause
> 
> already calls CpuPause() when condition [1] is true. That's the pattern
> we should follow.
> 
> When condition [1] is false, your patch implements the wait for the
> Present flags in SmmCpuRendezvous(), but there we have no CpuPause().
> So, we could / should add it, right at the end of the while (TRUE) loop.
> 
> Summary of my requests:
> 
> - the patch seems good, but please confirm that your v3 sync rework will
> leave the predicate intact that WaitForAllAPs() ensures the Present
> flags via the Run semaphores
> 

sure. 

Thanks,
Jiaxin 


> - please extend the commit message with the paragraph about symmetry
> between BSPHandler and SmmCpuRendezvous
> 
> - please consider adding CpuPause to the end of the "while (TRUE)" loop.
> 
> (BTW, the patch is not really (or usefully) testable with OVMF. OVMF
> sets PcdCpuSmmSyncMode to 1 (= SmmCpuSyncModeRelaxedAp) by default;
> however, OVMF's SmmControl2Dxe driver sets the PCD back to 0 (=
> SmmCpuSyncModeTradition) if QEMU supports "broadcast SMI". Given that
> broadcast SMI is the *only* reliable method with QEMU/KVM + OVMF, and
> given that this feature / method has been available for ages now,
> testing any SMM-related change in edk2 with that feature manually
> disabled in QEMU is arguably useless.)
> 
> Thanks!
> Laszlo



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#112468): https://edk2.groups.io/g/devel/message/112468
Mute This Topic: https://groups.io/mt/102556528/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to