summaryrefslogtreecommitdiff
path: root/MdeModulePkg
diff options
context:
space:
mode:
authorArd Biesheuvel <ard.biesheuvel@linaro.org>2015-03-06 02:55:35 +0000
committerlgao4 <lgao4@Edk2>2015-03-06 02:55:35 +0000
commit7e8e22056b721203f29b3ee982a64e98b0cbc22a (patch)
treea25931c438950a714b3b3d4c6c1f83e25adfd591 /MdeModulePkg
parentf2c7daf675d246261bd5e034b78e200017057df6 (diff)
MdeModulePkg: use index to traverse free pool pages
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.biesheuvel@linaro.org> Reviewed-by: Liming Gao <liming.gao@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17013 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'MdeModulePkg')
-rw-r--r--MdeModulePkg/Core/Dxe/Mem/Pool.c30
1 files changed, 9 insertions, 21 deletions
diff --git a/MdeModulePkg/Core/Dxe/Mem/Pool.c b/MdeModulePkg/Core/Dxe/Mem/Pool.c
index c7998e80cc..0c5cf3d284 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);
}
//