Implement buffer return logic for general lookaside lists
All checks were successful
Builds / ExectOS (amd64, release) (push) Successful in 40s
Builds / ExectOS (i686, release) (push) Successful in 38s
Builds / ExectOS (i686, debug) (push) Successful in 45s
Builds / ExectOS (amd64, debug) (push) Successful in 49s

This commit is contained in:
2026-07-04 14:08:05 +02:00
parent 042bf8520c
commit a0e707d35f
2 changed files with 73 additions and 1 deletions

View File

@@ -79,7 +79,6 @@ EX::LookasideList::AllocateFromLookasideList(IN PPAGED_LOOKASIDE_LIST LookasideL
return Buffer; return Buffer;
} }
/** /**
* Allocates a memory block from the specified per-processor lookaside list. * Allocates a memory block from the specified per-processor lookaside list.
* *
@@ -138,6 +137,75 @@ EX::LookasideList::AllocateFromPerProcessorList(IN NONPAGED_LOOKASIDE_NUMBER Num
return Entry; return Entry;
} }
/**
* Returns a previously allocated memory block to the specified non-paged lookaside list.
*
* @param LookasideList
* Supplies a pointer to the non-paged lookaside list.
*
* @param Entry
* Supplies a pointer to the memory block being freed.
*
* @return This routine does not return any value.
*
* @since XT 1.0
*/
XTAPI
VOID
EX::LookasideList::FreeToLookasideList(IN PNONPAGED_LOOKASIDE_LIST LookasideList,
IN PVOID Entry)
{
/* Increment the tracking metric */
LookasideList->Global.TotalFrees++;
/* Verify if the lookaside list has reached its maximum capacity threshold */
if(RTL::SinglyList::QueryListDepth(&LookasideList->Global.ListHead) >= LookasideList->Global.Depth)
{
/* The list is full, record a capacity miss */
LookasideList->Global.FreeMisses++;
(LookasideList->Global.Free)(Entry);
}
else
{
/* Push the block onto the lookaside list */
RTL::Atomic::PushEntrySingleList(&LookasideList->Global.ListHead, (PSINGLE_LIST_ENTRY)Entry);
}
}
/**
* Returns a previously allocated memory block to the specified paged lookaside list.
*
* @param LookasideList
* Supplies a pointer to the paged lookaside list.
*
* @param Entry
* Supplies a pointer to the memory block being freed.
*
* @return This routine does not return any value.
*
* @since XT 1.0
*/
XTAPI
VOID
EX::LookasideList::FreeToLookasideList(IN PPAGED_LOOKASIDE_LIST LookasideList,
IN PVOID Entry)
{
/* Increment the tracking metric */
LookasideList->Global.TotalFrees++;
/* Verify if the lookaside list has reached its maximum capacity threshold */
if(RTL::SinglyList::QueryListDepth(&LookasideList->Global.ListHead) >= LookasideList->Global.Depth)
{
/* The list is full, record a capacity miss */
LookasideList->Global.FreeMisses++;
(LookasideList->Global.Free)(Entry);
}
else
{
/* Push the block onto the lookaside list */
RTL::Atomic::PushEntrySingleList(&LookasideList->Global.ListHead, (PSINGLE_LIST_ENTRY)Entry);
}
}
/** /**
* Frees a memory block back to the specified per-processor lookaside list. * Frees a memory block back to the specified per-processor lookaside list.

View File

@@ -31,6 +31,10 @@ namespace EX
STATIC XTAPI PVOID AllocateFromLookasideList(IN PNONPAGED_LOOKASIDE_LIST LookasideList); STATIC XTAPI PVOID AllocateFromLookasideList(IN PNONPAGED_LOOKASIDE_LIST LookasideList);
STATIC XTAPI PVOID AllocateFromLookasideList(IN PPAGED_LOOKASIDE_LIST LookasideList); STATIC XTAPI PVOID AllocateFromLookasideList(IN PPAGED_LOOKASIDE_LIST LookasideList);
STATIC XTAPI PVOID AllocateFromPerProcessorList(IN NONPAGED_LOOKASIDE_NUMBER Number); STATIC XTAPI PVOID AllocateFromPerProcessorList(IN NONPAGED_LOOKASIDE_NUMBER Number);
STATIC XTAPI VOID FreeToLookasideList(IN PNONPAGED_LOOKASIDE_LIST LookasideList,
IN PVOID Entry);
STATIC XTAPI VOID FreeToLookasideList(IN PPAGED_LOOKASIDE_LIST LookasideList,
IN PVOID Entry);
STATIC XTAPI VOID FreeToPerProcessorList(IN NONPAGED_LOOKASIDE_NUMBER Number, STATIC XTAPI VOID FreeToPerProcessorList(IN NONPAGED_LOOKASIDE_NUMBER Number,
IN PVOID Entry); IN PVOID Entry);
STATIC XTAPI VOID InitializeLookasideList(IN OUT PGENERAL_LOOKASIDE LookasideList, STATIC XTAPI VOID InitializeLookasideList(IN OUT PGENERAL_LOOKASIDE LookasideList,