On 11/23/17 15:53, Ni, Ruiyu wrote: > Comments below. > >> -----Original Message----- >> From: Laszlo Ersek [mailto:ler...@redhat.com] >> Sent: Thursday, November 23, 2017 10:03 PM >> To: Ni, Ruiyu <ruiyu...@intel.com>; edk2-devel-01 <edk2-devel@lists.01.org> >> Cc: Ard Biesheuvel <ard.biesheu...@linaro.org>; Justen, Jordan L >> <jordan.l.jus...@intel.com>; Dong, Eric <eric.d...@intel.com>; Zeng, Star >> <star.z...@intel.com>; Doran, Mark <mark.do...@intel.com> >> Subject: Re: [PATCH 3/5] MdeModulePkg/UefiBootManagerLib: report >> EDKII_OS_LOADER_DETAIL status code >> >> Hello Ray, >> >> (CC Mark Doran for the last part of my email) >> >> On 11/23/17 06:21, Ni, Ruiyu wrote: >>> Laszlo, >>> When booting a boot option, UefiBootManagerBoot() sets a Boot#### >>> variable and saves #### to BootCurrent variable. >>> So all the details (except the EDKII_OS_LOADER_DETAIL.Status) can be >>> retrieved from reading Boot#### variable. >> >> I have two counter-arguments: >> >> (1) I would like to minimize the number of accesses to non-volatile UEFI >> variables. Dependent on the virtualization platform and the (virtual) flash >> chip >> structure (for example, flash block size), flash access can be very slow. >> >> I'm not 100% sure whether this performance problem affects flash *reads* as >> well, or if it affects flash writes only. (It definitely affects flash >> writes.) > > NV *read* should have no performance impact since EDKII variable driver's > implementation caches the flash in memory. I am not sure about that > in OVMF.
Yeah it should work the same. Thanks! > But I think a good implementation of variable driver should > consider such *read* optimization. > Performance needs to be considered, but simpler/easy-maintain > code takes higher priority. > >> >> >> (2) The delivery of status codes to registered handlers is asynchronous, not >> synchronous. Handlers are registered at various task priority levels, and if >> the >> reporting occurs at the same or higher TPL, then the delivery will be >> delayed. >> (According to the PI spec, it is even possible to report several status codes >> before the first will be delivered -- basically the codes are queued until >> the TPL is >> reduced sufficiently.) This is why all data has to be embedded in the status >> code >> structure itself. >> >> Like in any other notify function's case, it is prudent to register status >> code >> handlers at the least strict TPL that can work for the actual processing. >> (The >> internals of the handler function can even put an upper limit on the TPL; for >> example using Simple Text Output prevents us from going higher than >> TPL_NOTIFY.) For this reason I chose TPL_CALLBACK for the OVMF status code >> handler. >> >> Now, if we can *guarantee* that these status codes are only reported at the >> TPL_APPLICATION level, then a TPL_CALLBACK status code handler will be >> synchronous in effect, and then the status code structure can carry >> references >> to other (external) things in the system too, such as UEFI variables. >> >> Can we guarantee that EfiBootManagerBoot() is never invoked above >> TPL_APPLICATION? > Yes. It should be. Because gBS->LoadImage()/StartImage() per UEFI spec TPL > restriction rule, should be run at TPL_APPLICATION. > And if there is no special reason (handler runs too slow), the status handler > is registered at TPL_HIGH so that the handler is called synchronously. OK, the TPL_APPLICATION promise will work for me. I missed the LoadImage / StartImage implications; good point! (I can't register the handler at TPL_HIGH, because the handler calls AsciiPrint, which internally uses gST->ConOut, and that (i.e., SimpleTextOut) cannot be used above TPL_NOTIFY. But the TPL_CALLBACK handler will work fine with the TPL_APPLICATION report.) > >> >>> >>> 4 more comments below. >> >> [snip] >> >>>> + BmReportOsLoaderDetail ( >>>> + OsLoaderDetail, >>>> + OsLoaderDetailSize, >>>> + EDKII_OS_LOADER_DETAIL_TYPE_LOAD, >>>> + 0 // DetailStatus -- unused here >>>> + ); >>>> + >>> >>> 1. With the BootCurrent, this change is not necessary because others >>> can hook PcdProgressCodeOsLoaderLoad to get the current loading boot >>> option. >> >> As long as we can clear my points (1) and (2) above, I'd be fine with this >> approach. >> >>> >>>> Status = gBS->LoadImage ( >>>> TRUE, >>>> gImageHandle, >>>> FilePath, >>>> FileBuffer, >>>> FileSize, >>>> &ImageHandle >>>> ); >>>> } >>>> if (FileBuffer != NULL) { >>>> FreePool (FileBuffer); >>>> } >>>> if (FilePath != NULL) { >>>> FreePool (FilePath); >>>> } >>>> >>>> if (EFI_ERROR (Status)) { >>>> // >>>> // Report Status Code to indicate that the failure to load boot >>>> option >>>> // >>>> REPORT_STATUS_CODE ( >>>> EFI_ERROR_CODE | EFI_ERROR_MINOR, >>>> (EFI_SOFTWARE_DXE_BS_DRIVER | >>>> EFI_SW_DXE_BS_EC_BOOT_OPTION_LOAD_ERROR) >>>> ); >>>> + BmReportOsLoaderDetail ( >>>> + OsLoaderDetail, >>>> + OsLoaderDetailSize, >>>> + EDKII_OS_LOADER_DETAIL_TYPE_LOAD_ERROR, >>>> + Status >>>> + ); >>>> + >>> >>> 2. I think firstly, the OsLoaderDetail is not needed. >>> Secondly, I prefer to submit a PI spec change to include extended data >>> for EFI_SW_DXE_BS_EC_BOOT_OPTION_LOAD_ERROR status code. >>> Instead of inventing a new status code. >> >> I understand your point, and in theory I agree with it, but in practice, I >> cannot. > > If there is no similar status code for a certain purpose, I agree to invent a > new status > code. And when the new status code is proven by time to be mature enough, it > can go > to PI spec. > But for this case, since PI spec already has such status code, I prefer to at > least try > to change the spec. If PIWG doesn't agree, we can go on using the new status > code. Oh I'm not worried about PIWG disagreement. Getting strong disagreement *quickly* is actually a very good outcome, because it tells us how to proceed. What I'm worried about is a drawn-out process that takes forever (and requires me to spend a disproportionate amount of time on the phone, and at bad times). Unless there is some kind of promise that I can work with the PIWG in a timely manner *without* the phone, it doesn't make sense for me to start the process. I'll ask on the PIWG list first. Thanks, Laszlo > >> >> My experience with Mantis tickets is not good: >> >> (a) First, I would have to write up the proposal. That's fine, I can do >> that; have >> done it before. >> >> >> (b) Second, I'd have to *call* the meetings. Please locate the email titled >> >> a reminder about MANTIS usage >> >> from Mark, (date: 6 Sep 2017), cross-posted to the PIWG/USWG/ASWG lists. >> >> I'm not allowed to quote the email verbatim -- all of these lists are >> confidential - >> -, but if you look up the paragraph starting with "Best practice", Mark >> basically >> implied, "file the the Mantis ticket, then dial in to the next meeting and >> sell your >> proposal to the WG *verbally*". >> >> I *cannot* do that. The WG meetings always take place early afternoon in >> Pacific (US West Coast) timezone, which is around *midnight* in my timezone. >> >> In addition, I don't even have time to attend the confcalls that I'm invited >> to >> within Red Hat! >> >> I don't understand why a carefully written Mantis ticket is not sufficient >> for >> discussion, but apparently it isn't. :/ >> >> >> (c) Case in point, please see Mantis ticket #1736, titled >> >> lacking specification of EFI_BOOT_SCRIPT_WIDTH in PI 1.5 / Vol 5 / >> 8.7.1 Save State Write >> >> which I had originally filed in December 2016. >> >> In February 2017, I was asked for more details. I said, "fair enough", and I >> spent >> half a day writing up the requested change in *full* detail. >> I gave editing instructions of the form >> >> change this to that >> >> and >> >> add/delete the following >> >> as recommended in Mark's email (b). >> >> You can see my write-up in note 0005044. After that note, there have been >> *zero* updates to the ticket; since February 2017. >> >> >> So the fact is, unless you have time to call the WG meetings every week, and >> push *live* for the change that you want, you have no chance at getting stuff >> into the specs. >> >> >> I mean, in his email (b), Mark suggests asking a "proxy" for representing the >> change request, to anyone that cannot dial in. Well, can *you* be my proxy on >> the PIWG meeting, if I write up the change request? You certainly understand >> the problem space, and you maintain the corresponding reference code in edk2. >> I just doubt you have time for conference calls, same as I. >> >> UefiBootManagerLib already reports an extended status code, with >> EDKII_SET_VARIABLE_STATUS payload. Introducing another edk2-specific status >> code requires no slow negotiation, and it can be adopted by others, in >> practice, >> if they like it. Once it is wide-spread practice, it can be more easily >> codified in >> the spec. The specifics for the first implementation can be -- should be -- >> discussed on this open list; we had better not standardize something that has >> zero implementations just yet. >> >> Anyway, I'm willing to go through the standardization process, but only if it >> doesn't require me to pick up the phone every week (esp. at midnight). >> >> Thanks >> Laszlo _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel