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
This commit is contained in:
Ard Biesheuvel 2015-03-06 02:55:35 +00:00 committed by lgao4
parent f2c7daf675
commit 7e8e22056b
1 changed files with 9 additions and 21 deletions

View File

@ -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);
}
//