Implement buffer return logic for general lookaside lists
This commit is contained in:
@@ -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.
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user