In preparation of making the pool code capable of serving allocations from higher-up bins, update the free path to traverse a candidate page by following the index of POOL_FREE header instead of duplicating the carving logic that was used at page allocation time. This allows chunks to be split into smaller ones, where one can be returned to serve the allocation, and the other stored in a smaller bin for later use.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel <ard.biesheu...@linaro.org> --- MdeModulePkg/Core/Dxe/Mem/Pool.c | 30 +++++++++--------------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/Mem/Pool.c b/MdeModulePkg/Core/Dxe/Mem/Pool.c index c7998e80cce6..0c5cf3d28451 100644 --- a/MdeModulePkg/Core/Dxe/Mem/Pool.c +++ b/MdeModulePkg/Core/Dxe/Mem/Pool.c @@ -495,7 +495,6 @@ CoreFreePoolI ( UINTN NoPages; UINTN Size; CHAR8 *NewPage; - UINTN FSize; UINTN Offset; BOOLEAN AllFree; UINTN Granularity; @@ -589,22 +588,16 @@ CoreFreePoolI ( if (Free->Signature == POOL_FREE_SIGNATURE) { - Index = Free->Index; - AllFree = TRUE; Offset = 0; while ((Offset < Granularity) && (AllFree)) { - FSize = LIST_TO_SIZE(Index); - while (Offset + FSize <= Granularity) { - Free = (POOL_FREE *) &NewPage[Offset]; - ASSERT(Free != NULL); - if (Free->Signature != POOL_FREE_SIGNATURE) { - AllFree = FALSE; - } - Offset += FSize; + Free = (POOL_FREE *) &NewPage[Offset]; + ASSERT(Free != NULL); + if (Free->Signature != POOL_FREE_SIGNATURE) { + AllFree = FALSE; } - Index -= 1; + Offset += LIST_TO_SIZE(Free->Index); } if (AllFree) { @@ -616,18 +609,13 @@ CoreFreePoolI ( // Free = (POOL_FREE *) &NewPage[0]; ASSERT(Free != NULL); - Index = Free->Index; Offset = 0; while (Offset < Granularity) { - FSize = LIST_TO_SIZE(Index); - while (Offset + FSize <= Granularity) { - Free = (POOL_FREE *) &NewPage[Offset]; - ASSERT(Free != NULL); - RemoveEntryList (&Free->Link); - Offset += FSize; - } - Index -= 1; + Free = (POOL_FREE *) &NewPage[Offset]; + ASSERT(Free != NULL); + RemoveEntryList (&Free->Link); + Offset += LIST_TO_SIZE(Free->Index); } // -- 1.8.3.2 ------------------------------------------------------------------------------ Dive into the World of Parallel Programming. The Go Parallel Website, sponsored by Intel and developed in partnership with Slashdot Media, is your hub for all things parallel software development, from weekly thought leadership blogs to news, videos, case studies, tutorials and more. Take a look and join the conversation now. http://goparallel.sourceforge.net/ _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel