summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArd Biesheuvel <ard.biesheuvel@linaro.org>2015-03-06 02:56:20 +0000
committerlgao4 <lgao4@Edk2>2015-03-06 02:56:20 +0000
commitf8aabf6e4c199e92498512e1d0cf9a347b62e491 (patch)
tree44b76932a59ba2c42a665727821bf26995b31f76
parent7e8e22056b721203f29b3ee982a64e98b0cbc22a (diff)
MdeModulePkg: carve pool pages into the largest chunks possible
In preparation of the next patch, that serves allocations from higher-up bins if the current bin is depleted, this patch updates the carving up strategy to populate the largest bins first. To ensure that there will always be an allocation of the appropriate size made, the current allocation request is served first from the newly allocated memory region. 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@17014 6f19259b-4bc3-4df7-8a09-765794883524
-rw-r--r--MdeModulePkg/Core/Dxe/Mem/Pool.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/MdeModulePkg/Core/Dxe/Mem/Pool.c b/MdeModulePkg/Core/Dxe/Mem/Pool.c
index 0c5cf3d28..23409d35c 100644
--- a/MdeModulePkg/Core/Dxe/Mem/Pool.c
+++ b/MdeModulePkg/Core/Dxe/Mem/Pool.c
@@ -352,9 +352,15 @@ CoreAllocatePoolI (
}
//
- // Carve up new page into free pool blocks
+ // Serve the allocation request from the head of the allocated block
//
- Offset = 0;
+ Head = (POOL_HEAD *) NewPage;
+ Offset = LIST_TO_SIZE (Index);
+
+ //
+ // Carve up remaining space into free pool blocks
+ //
+ Index = SIZE_TO_LIST (Granularity) - 1;
while (Offset < Granularity) {
ASSERT (Index < MAX_POOL_LIST);
FSize = LIST_TO_SIZE(Index);
@@ -371,7 +377,7 @@ CoreAllocatePoolI (
}
ASSERT (Offset == Granularity);
- Index = SIZE_TO_LIST(Size);
+ goto Done;
}
//