From: "Marvin Häuser" <mhaeuser@posteo.de>
To: devel@edk2.groups.io, ray.ni@intel.com,
gaoliming <gaoliming@byosoft.com.cn>,
"Chan, Amy" <amy.chan@intel.com>, 'Andrew Fish' <afish@apple.com>
Cc: "Kinney, Michael D" <michael.d.kinney@intel.com>,
"'Gao, Liming'" <liming.gao@intel.com>,
"Liu, Zhiguang" <zhiguang.liu@intel.com>,
"Wang, Jian J" <jian.j.wang@intel.com>,
"Gao, Zhichao" <zhichao.gao@intel.com>
Subject: Re: [edk2-devel] RFC: Add BaseLib/QuickSort in MdePkg
Date: Sun, 26 Sep 2021 11:20:45 +0000 [thread overview]
Message-ID: <bb81e9d6-e3bc-bf07-7ca6-3ba91dd5494f@posteo.de> (raw)
In-Reply-To: <CY4PR1101MB2072206581E14970D2AFBFCF8CA69@CY4PR1101MB2072.namprd11.prod.outlook.com>
Hey Ray,
In my opinion that spec is too complicated. For some cases it is
obvious, but I think the last anyone wants to see is a (STATIC_)ASSERT
before most QuickSort calls to ensure the element size *really* is <=
256 Bytes. In my opinion, there are two roads:
1) Make the parameter required (I think this is what Liming suggested).
The caller would always need to provide said buffer, and it can do as it
sees fit - on the stack, in a pool, in a page, who knows.
2) Remove the parameter entirely. The library would depend on
MemoryAllocationLib again, but also would have an optimisation by
choosing stack vs pool based on ElementSize.
Usually I would prefer 2), as it is less prone to caller errors, but
considering the low-level nature of edk2, I can totally see the point to
allow the caller to control whether there are dynamic memory allocations
made or not as possible with 1). 2) could technically also be a wrapper
for 1) if you want granular control and convenience/safety (why not
actually?).
Both approaches have the advantage that it is crystal-clear what the
caller's job is - to always or to never allocate the buffer.
Best regards,
Marvin
On 26/09/2021 04:24, Ni, Ray wrote:
>
> Liming,
>
> The purpose of the optional BufferOneElement is to ease consumer’s
> life assuming most of the time the element size should be smaller than
> 256.
>
> Are you saying that it’s a bit hard to calculate the actual value of
> sizeof (Element) when writing code?
>
> I recommend consumer always allocates memory if it’s hard to judge
> sizeof (Element) < 256.
>
> Searching edk2 code, I can find below code using PerformQuickSort():
>
> 1. ShellPkg/UefiShellCommandLib: It’s sorting array of
> (EFI_DEVICE_PATH_PROTOCOL *).
> 2. UefiCpuPkg/CpuCacheInfoLib: It’s sorting array of CPU_CACHE_INFO.
> 3. MinPlatformPkg/AcpiTables: It’s sorting array of EFI_CPU_ID_ORDER_MAP.
> 4. MdeModulePkg/UefiBootManagerLib: It’s sorting array of
> EFI_BOOT_MANAGER_LOAD_OPTION.
> 5. MdeModulePkg/CapsuleApp: It’s sorting array of (EFI_FILE_INFO *)
> 6. CryptoPkg/CrtWrapper: It’s sorting array of (unknown type).
> 7. RedfishPkg/RedfishCrtLib: It’s sorting array of (unknown type).
>
> For 1~5, it’s easy to know that the size of the element is smaller
> than 256. The AllocatePool() can be skipped.
>
> Thanks,
>
> Ray
>
> *From:*gaoliming <gaoliming@byosoft.com.cn>
> *Sent:* Sunday, September 26, 2021 10:01 AM
> *To:* Ni, Ray <ray.ni@intel.com>; devel@edk2.groups.io; Chan, Amy
> <amy.chan@intel.com>; 'Andrew Fish' <afish@apple.com>
> *Cc:* Kinney, Michael D <michael.d.kinney@intel.com>; 'Gao, Liming'
> <liming.gao@intel.com>; Liu, Zhiguang <zhiguang.liu@intel.com>; Wang,
> Jian J <jian.j.wang@intel.com>; Gao, Zhichao <zhichao.gao@intel.com>
> *Subject:* 回复: [edk2-devel] RFC: Add BaseLib/QuickSort in MdePkg
>
> Ray:
>
> I may suggest to always require BufferOneElement. The consumer code
> may not know ElementSize. To avoid the error, the consumer must
> allocate buffer for BufferOneElement. If so, BufferOneElement is the
> required parameter.
>
> Thanks
>
> Liming
>
> *发件人**:*Ni, Ray <ray.ni@intel.com <mailto:ray.ni@intel.com>>
> *发送时间:* 2021年9月24日 11:53
> *收件人:* devel@edk2.groups.io <mailto:devel@edk2.groups.io>; Ni, Ray
> <ray.ni@intel.com <mailto:ray.ni@intel.com>>; Chan, Amy
> <amy.chan@intel.com <mailto:amy.chan@intel.com>>; gaoliming
> <gaoliming@byosoft.com.cn <mailto:gaoliming@byosoft.com.cn>>; 'Andrew
> Fish' <afish@apple.com <mailto:afish@apple.com>>
> *抄送:* Kinney, Michael D <michael.d.kinney@intel.com
> <mailto:michael.d.kinney@intel.com>>; 'Gao, Liming'
> <liming.gao@intel.com <mailto:liming.gao@intel.com>>; Liu, Zhiguang
> <zhiguang.liu@intel.com <mailto:zhiguang.liu@intel.com>>; Wang, Jian J
> <jian.j.wang@intel.com <mailto:jian.j.wang@intel.com>>; Gao, Zhichao
> <zhichao.gao@intel.com <mailto:zhichao.gao@intel.com>>
> *主题:* RE: [edk2-devel] RFC: Add BaseLib/QuickSort in MdePkg
>
> More details on new QuickSort() API:
>
> The new API needs to carry additional parameter “BufferOneElement”.
>
> This parameter gives QuickSort() the temporary buffer for swapping in
> sorting.
>
> It’s to avoid BaseLib depends on MemoryAllocationLib.
>
> …
>
> @param [in] BufferOneElement When ElementSize > 256, caller needs to
> provide a buffer whose size
> equals to ElementSize. It’s used by
> QuickSort() for swapping in sorting.
>
> When ElementSize <= 256, QuickSort() uses a local stack 256-byte buffer.
>
> @retval EFI_INVALID_PARAMETER When (ElementSize > 256) and
> (BufferOneElement == NULL).
>
> …
>
> VOID
>
> EFIAPI
>
> QuickSort (
>
> IN OUT VOID *BufferToSort,
>
> IN CONST UINTN ElementCount,
>
> IN CONST UINTN ElementSize,
>
> IN SORT_COMPARE CompareFunction,
>
> IN VOID *BufferOneElement OPTIONAL
>
> );
>
> Any comments?
>
> *From:*devel@edk2.groups.io <mailto:devel@edk2.groups.io>
> <devel@edk2.groups.io <mailto:devel@edk2.groups.io>> *On Behalf Of
> *Ni, Ray
> *Sent:* Wednesday, September 22, 2021 2:04 PM
> *To:* Chan, Amy <amy.chan@intel.com <mailto:amy.chan@intel.com>>;
> gaoliming <gaoliming@byosoft.com.cn
> <mailto:gaoliming@byosoft.com.cn>>; 'Andrew Fish' <afish@apple.com
> <mailto:afish@apple.com>>; 'edk2-devel-groups-io'
> <devel@edk2.groups.io <mailto:devel@edk2.groups.io>>
> *Cc:* Kinney, Michael D <michael.d.kinney@intel.com
> <mailto:michael.d.kinney@intel.com>>; 'Gao, Liming'
> <liming.gao@intel.com <mailto:liming.gao@intel.com>>; Liu, Zhiguang
> <zhiguang.liu@intel.com <mailto:zhiguang.liu@intel.com>>; Wang, Jian J
> <jian.j.wang@intel.com <mailto:jian.j.wang@intel.com>>; Gao, Zhichao
> <zhichao.gao@intel.com <mailto:zhichao.gao@intel.com>>
> *Subject:* Re: [edk2-devel] RFC: Add BaseLib/QuickSort in MdePkg
>
> I don’t see objection so far.
>
> So, the final solution is:
>
> 1. Add QuickSort() API to BaseLib in MdePkg.
> 2. Update existing MdeModulePkg/SortLib to use QuickSort() in the
> implementation (proposed by Andrew Fish and Liming Gao)
> 3. Update UefiCpuPkg to use QuickSortLib to remove improper
> dependency on MdeModulePkg
>
> Thanks,
>
> Ray
>
> *From:*Ni, Ray
> *Sent:* Thursday, September 16, 2021 10:48 AM
> *To:* Chan, Amy <amy.chan@intel.com <mailto:amy.chan@intel.com>>;
> gaoliming <gaoliming@byosoft.com.cn
> <mailto:gaoliming@byosoft.com.cn>>; 'Andrew Fish' <afish@apple.com
> <mailto:afish@apple.com>>; 'edk2-devel-groups-io'
> <devel@edk2.groups.io <mailto:devel@edk2.groups.io>>
> *Cc:* Kinney, Michael D <michael.d.kinney@intel.com
> <mailto:michael.d.kinney@intel.com>>; 'Gao, Liming'
> <liming.gao@intel.com <mailto:liming.gao@intel.com>>; Liu, Zhiguang
> <Zhiguang.Liu@intel.com <mailto:Zhiguang.Liu@intel.com>>; Wang, Jian J
> <jian.j.wang@intel.com <mailto:jian.j.wang@intel.com>>; Gao, Zhichao
> <zhichao.gao@intel.com <mailto:zhichao.gao@intel.com>>
> *Subject:* RE: [edk2-devel] RFC: Add BaseLib/QuickSort in MdePkg
>
> Amy,
>
> No. We only Add QuickSort() function API into BaseLib.h.
>
> *From:*Chan, Amy <amy.chan@intel.com <mailto:amy.chan@intel.com>>
> *Sent:* Thursday, September 16, 2021 10:46 AM
> *To:* gaoliming <gaoliming@byosoft.com.cn
> <mailto:gaoliming@byosoft.com.cn>>; 'Andrew Fish' <afish@apple.com
> <mailto:afish@apple.com>>; 'edk2-devel-groups-io'
> <devel@edk2.groups.io <mailto:devel@edk2.groups.io>>
> *Cc:* Ni, Ray <ray.ni@intel.com <mailto:ray.ni@intel.com>>; Kinney,
> Michael D <michael.d.kinney@intel.com
> <mailto:michael.d.kinney@intel.com>>; 'Gao, Liming'
> <liming.gao@intel.com <mailto:liming.gao@intel.com>>; Liu, Zhiguang
> <zhiguang.liu@intel.com <mailto:zhiguang.liu@intel.com>>; Wang, Jian J
> <jian.j.wang@intel.com <mailto:jian.j.wang@intel.com>>; Gao, Zhichao
> <zhichao.gao@intel.com <mailto:zhichao.gao@intel.com>>
> *Subject:* RE: [edk2-devel] RFC: Add BaseLib/QuickSort in MdePkg
>
> Just to double confirm, will we have the null instance of QuickSort in
> MdePkg?
>
> Regards,
>
> Amy
>
> *From:*gaoliming <gaoliming@byosoft.com.cn
> <mailto:gaoliming@byosoft.com.cn>>
> *Sent:* Thursday, September 16, 2021 10:23 AM
> *To:* 'Andrew Fish' <afish@apple.com <mailto:afish@apple.com>>;
> 'edk2-devel-groups-io' <devel@edk2.groups.io
> <mailto:devel@edk2.groups.io>>
> *Cc:* Ni, Ray <ray.ni@intel.com <mailto:ray.ni@intel.com>>; Kinney,
> Michael D <michael.d.kinney@intel.com
> <mailto:michael.d.kinney@intel.com>>; 'Gao, Liming'
> <liming.gao@intel.com <mailto:liming.gao@intel.com>>; Liu, Zhiguang
> <zhiguang.liu@intel.com <mailto:zhiguang.liu@intel.com>>; Wang, Jian J
> <jian.j.wang@intel.com <mailto:jian.j.wang@intel.com>>; Gao, Zhichao
> <zhichao.gao@intel.com <mailto:zhichao.gao@intel.com>>; Chan, Amy
> <amy.chan@intel.com <mailto:amy.chan@intel.com>>
> *Subject:* 回复: [edk2-devel] RFC: Add BaseLib/QuickSort in MdePkg
>
> Andrew:
>
> Thanks for your suggestion. I think your idea is better. We add new
> QuickSort() API to BaseLib, and update SortLib library instance to
> consume BaseLib QuickSort() API. This way has no change in current
> SortLib library class. It is the compatible solution.
>
> Thanks
>
> Liming
>
> *发件人**:*Andrew Fish <afish@apple.com <mailto:afish@apple.com>>
> *发送时间:* 2021年9月16日 10:13
> *收件人:* edk2-devel-groups-io <devel@edk2.groups.io
> <mailto:devel@edk2.groups.io>>; Liming Gao <gaoliming@byosoft.com.cn
> <mailto:gaoliming@byosoft.com.cn>>
> *抄送:* Ni, Ray <ray.ni@intel.com <mailto:ray.ni@intel.com>>; Mike
> Kinney <michael.d.kinney@intel.com
> <mailto:michael.d.kinney@intel.com>>; Gao, Liming
> <liming.gao@intel.com <mailto:liming.gao@intel.com>>; Liu, Zhiguang
> <zhiguang.liu@intel.com <mailto:zhiguang.liu@intel.com>>; Wang, Jian J
> <jian.j.wang@intel.com <mailto:jian.j.wang@intel.com>>; Gao, Zhichao
> <zhichao.gao@intel.com <mailto:zhichao.gao@intel.com>>; Chan, Amy
> <amy.chan@intel.com <mailto:amy.chan@intel.com>>
> *主题:* Re: [edk2-devel] RFC: Add BaseLib/QuickSort in MdePkg
>
> On Sep 15, 2021, at 6:26 PM, gaoliming <gaoliming@byosoft.com.cn
> <mailto:gaoliming@byosoft.com.cn>> wrote:
>
> Ray:
>
> SortLib has been added since 2015. I would suggest to still keep
> this library class. To resolve the package dependency, my proposal
> is to move the library class header file SortLib.h from
> MdeModulePkg to MdePkg, and still keep the library instance in
> MdeModulePkg. This proposal has no impact on the existing platform.
>
> If we add QuickSort() API to the BaseLib can we not just port the
> existing MdeModulePkg/SortLib to use QuickSort() in the
> implementation? Or is there some other way to add the new thing in a
> backward compatible way.
>
> Thanks,
>
> Andrew Fish
>
> Thanks
>
> Liming
>
> *发件人**:*devel@edk2.groups.io
> <mailto:devel@edk2.groups.io><devel@edk2.groups.io
> <mailto:devel@edk2.groups.io>>*代表***Ni, Ray
> *发送时间:*2021年9月14日14:15
> *收件人:*Kinney, Michael D <michael.d.kinney@intel.com
> <mailto:michael.d.kinney@intel.com>>; Gao, Liming
> <liming.gao@intel.com <mailto:liming.gao@intel.com>>; Liu,
> Zhiguang <zhiguang.liu@intel.com <mailto:zhiguang.liu@intel.com>>;
> Wang, Jian J <jian.j.wang@intel.com
> <mailto:jian.j.wang@intel.com>>; Gao, Zhichao
> <zhichao.gao@intel.com <mailto:zhichao.gao@intel.com>>
> *抄送:*devel@edk2.groups.io <mailto:devel@edk2.groups.io>; Chan, Amy
> <amy.chan@intel.com <mailto:amy.chan@intel.com>>
> *主题:*[edk2-devel] RFC: Add BaseLib/QuickSort in MdePkg
>
> Hi package maintainers of MdePkg, MdeModulePkg and ShellPkg,
> community,
>
> A commit (UefiCpuPkg/CpuCacheInfoLib: Sort CpuCacheInfo array
> <https://github.com/tianocore/edk2/commit/4de77ae9890d241271f543e9195ab3516f3abec6>)
> to UefiCpuPkg let
> UefiCpuPkg depend on MdeModulePkg because the SortLib class and
> instances are all in MdeModulePkg.
>
> UefiCpuPkg depending on MdeModulePkg breaks the rule that
> “UefiCpuPkg should ONLY depend on MdePkg”.
>
> To address this issue, there are two approaches:
>
> 1. Duplicate the sort logic in UefiCpuPkg to not depend on
> MdeModulePkg/SortLib
> 2. Add QuickSort() API to BaseLib in MdePkg.
>
> Approach #2 (MdePkg/BaseLib/QuickSort) makes more sense because
> quick sort is a standard algorithm.
>
> We encourage consumers to update their code to use the quick sort
> in MdePkg and gradually deprecate today’s MdeModulePkg/SortLib.
>
> If you don’t have concerns, I plan to:
>
> 1. “Add QuickSort() to BaseLib” and update all existing consumers
> to use this API instead.
>
> VOID
>
> EFIAPI
>
> QuickSort (
>
> IN OUT VOID *BufferToSort,
>
> IN CONST UINTN Count,
>
> IN CONST UINTN ElementSize,
>
> IN SORT_COMPARE CompareFunction
>
> );
>
> 2. “Add new ShellPkg/SortCompareLib”
>
> Background: ShellPkg requires to sort devicepath/string so 3 APIs
> in UefiSortLib (DevicePathCompare, StringNoCaseCompare,
> StringCompare) are provided for Shell usage. we can move the 3
> APIs to the SortCompareLib and update Shell code to use
> BaseLib/QuickSort directly, with the sort compare function from
> SortCompareLib.
>
> Any concerns?
>
> Thanks,
>
> Ray
>
>
next prev parent reply other threads:[~2021-09-26 11:20 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-14 6:15 RFC: Add BaseLib/QuickSort in MdePkg Ni, Ray
2021-09-16 1:26 ` 回复: [edk2-devel] " gaoliming
2021-09-16 2:13 ` Andrew Fish
2021-09-16 2:23 ` 回复: " gaoliming
2021-09-16 2:45 ` Chan, Amy
2021-09-16 2:47 ` Ni, Ray
2021-09-22 6:03 ` Ni, Ray
[not found] ` <16A70FAC1585C7C1.27516@groups.io>
2021-09-24 3:53 ` Ni, Ray
2021-09-26 2:00 ` 回复: " gaoliming
2021-09-26 2:24 ` Ni, Ray
2021-09-26 11:20 ` Marvin Häuser [this message]
2021-09-27 0:45 ` Jeff Fan
2021-09-27 8:14 ` Marvin Häuser
2021-09-27 8:50 ` Jeff Fan
2021-09-27 9:09 ` Marvin Häuser
2021-09-28 1:49 ` Ni, Ray
2021-09-28 22:25 ` Brian J. Johnson
2021-09-29 0:51 ` 回复: " gaoliming
2021-09-29 2:42 ` Ni, Ray
[not found] ` <16A8A1ADDB4E97C4.26412@groups.io>
2021-09-27 9:06 ` Jeff Fan
2021-09-16 2:47 ` Ni, Ray
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=bb81e9d6-e3bc-bf07-7ca6-3ba91dd5494f@posteo.de \
--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