From: "Wu, Jiaxin" <jiaxin.wu@intel.com>
To: Laszlo Ersek <lersek@redhat.com>,
"devel@edk2.groups.io" <devel@edk2.groups.io>,
"Xie, Yuanhao" <yuanhao.xie@intel.com>
Cc: "Li, Zhihao" <zhihao.li@intel.com>, "Ni, Ray" <ray.ni@intel.com>,
"Kumar, Rahul R" <rahul.r.kumar@intel.com>,
Gerd Hoffmann <kraxel@redhat.com>
Subject: Re: [edk2-devel] [Patch V2] UefiCpuPkg/PiSmmCpuDxeSmm: SmmCpuRendezvous ensure all Aps in Present.
Date: Wed, 13 Dec 2023 09:19:37 +0000 [thread overview]
Message-ID: <MN0PR11MB6158C8D9FAFA647667B9340DFE8DA@MN0PR11MB6158.namprd11.prod.outlook.com> (raw)
In-Reply-To: <0bf2e6d2-a2df-7be5-ca14-6aab2c65a71b@redhat.com>
> > 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/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
prev parent reply other threads:[~2023-12-13 9:19 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-13 5:47 [edk2-devel] [Patch V2] UefiCpuPkg/PiSmmCpuDxeSmm: SmmCpuRendezvous ensure all Aps in Present Yuanhao Xie
2023-11-13 17:18 ` Laszlo Ersek
2023-12-06 3:35 ` Wu, Jiaxin
2023-12-12 0:29 ` Laszlo Ersek
2023-12-13 9:19 ` Wu, Jiaxin [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=MN0PR11MB6158C8D9FAFA647667B9340DFE8DA@MN0PR11MB6158.namprd11.prod.outlook.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox