mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 17:12:58 +00:00
- Fixed whole page allocations.
svn path=/trunk/; revision=5683
This commit is contained in:
parent
aab0f8f999
commit
0bed5b1747
2 changed files with 44 additions and 18 deletions
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: kmap.c,v 1.26 2003/07/21 21:53:52 royce Exp $
|
/* $Id: kmap.c,v 1.27 2003/08/19 23:52:36 dwelch Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -134,7 +134,7 @@ MiInitKernelMap(VOID)
|
||||||
RtlInitializeBitMap(&AllocMap, (PVOID)&AllocMapBuffer, ALLOC_MAP_SIZE);
|
RtlInitializeBitMap(&AllocMap, (PVOID)&AllocMapBuffer, ALLOC_MAP_SIZE);
|
||||||
RtlClearAllBits(&AllocMap);
|
RtlClearAllBits(&AllocMap);
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
VOID
|
VOID
|
||||||
MiFreeNonPagedPoolRegion(PVOID Addr, ULONG Count, BOOLEAN Free)
|
MiFreeNonPagedPoolRegion(PVOID Addr, ULONG Count, BOOLEAN Free)
|
||||||
{
|
{
|
||||||
|
@ -180,5 +180,5 @@ MiAllocNonPagedPoolRegion(ULONG nr_pages)
|
||||||
DPRINT("returning %x\n",NonPagedPoolBase + Base * PAGE_SIZE);
|
DPRINT("returning %x\n",NonPagedPoolBase + Base * PAGE_SIZE);
|
||||||
return MiKernelMapStart + Base * PAGE_SIZE;
|
return MiKernelMapStart + Base * PAGE_SIZE;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: npool.c,v 1.73 2003/07/29 19:43:13 royce Exp $
|
/* $Id: npool.c,v 1.74 2003/08/19 23:52:36 dwelch Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -35,7 +35,7 @@
|
||||||
* end of the range so any accesses beyond the end of block are to invalid
|
* end of the range so any accesses beyond the end of block are to invalid
|
||||||
* memory locations.
|
* memory locations.
|
||||||
*/
|
*/
|
||||||
//#define WHOLE_PAGE_ALLOCATIONS
|
/*#define WHOLE_PAGE_ALLOCATIONS*/
|
||||||
|
|
||||||
#ifdef ENABLE_VALIDATE_POOL
|
#ifdef ENABLE_VALIDATE_POOL
|
||||||
#define VALIDATE_POOL validate_kernel_pool()
|
#define VALIDATE_POOL validate_kernel_pool()
|
||||||
|
@ -147,6 +147,12 @@ MiFreeNonPagedPoolRegion(PVOID Addr, ULONG Count, BOOLEAN Free);
|
||||||
static LIST_ENTRY tag_hash_table[TAG_HASH_TABLE_SIZE];
|
static LIST_ENTRY tag_hash_table[TAG_HASH_TABLE_SIZE];
|
||||||
#endif /* TAG_STATISTICS_TRACKING */
|
#endif /* TAG_STATISTICS_TRACKING */
|
||||||
|
|
||||||
|
#ifdef WHOLE_PAGE_ALLOCATIONS
|
||||||
|
static UCHAR NonPagedPoolAllocMapBuffer[ROUND_UP(MM_NONPAGED_POOL_SIZE / PAGE_SIZE, 32) / 8];
|
||||||
|
static RTL_BITMAP NonPagedPoolAllocMap;
|
||||||
|
static ULONG NonPagedPoolAllocMapHint;
|
||||||
|
#endif /* WHOLE_PAGE_ALLOCATIONS */
|
||||||
|
|
||||||
/* avl helper functions ****************************************************/
|
/* avl helper functions ****************************************************/
|
||||||
|
|
||||||
void DumpFreeBlockNode(PNODE p)
|
void DumpFreeBlockNode(PNODE p)
|
||||||
|
@ -753,9 +759,14 @@ MiInitializeNonPagedPool(VOID)
|
||||||
InitializeListHead(&UsedBlockListHead);
|
InitializeListHead(&UsedBlockListHead);
|
||||||
InitializeListHead(&AddressListHead);
|
InitializeListHead(&AddressListHead);
|
||||||
FreeBlockListRoot = NULL;
|
FreeBlockListRoot = NULL;
|
||||||
|
#ifdef WHOLE_PAGE_ALLOCATIONS
|
||||||
|
RtlInitializeBitMap(&NonPagedPoolAllocMap, (PVOID)&NonPagedPoolAllocMapBuffer, MM_NONPAGED_POOL_SIZE / PAGE_SIZE);
|
||||||
|
RtlClearAllBits(&NonPagedPoolAllocMap);
|
||||||
|
NonPagedPoolAllocMapHint = 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TAG_STATISTICS_TRACKING
|
#if defined(TAG_STATISTICS_TRACKING) && !defined(WHOLE_PAGE_ALLOCATIONS)
|
||||||
VOID STATIC
|
VOID STATIC
|
||||||
MiDumpTagStats(ULONG CurrentTag, ULONG CurrentNrBlocks, ULONG CurrentSize)
|
MiDumpTagStats(ULONG CurrentTag, ULONG CurrentNrBlocks, ULONG CurrentSize)
|
||||||
{
|
{
|
||||||
|
@ -779,12 +790,12 @@ MiDumpTagStats(ULONG CurrentTag, ULONG CurrentNrBlocks, ULONG CurrentSize)
|
||||||
CurrentSize / CurrentNrBlocks);
|
CurrentSize / CurrentNrBlocks);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* TAG_STATISTICS_TRACKING */
|
#endif /* defined(TAG_STATISTICS_TRACKING) && !defined(WHOLE_PAGE_ALLOCATIONS); */
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly)
|
MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly)
|
||||||
{
|
{
|
||||||
#ifdef TAG_STATISTICS_TRACKING
|
#if defined(TAG_STATISTICS_TRACKING) && !defined(WHOLE_PAGE_ALLOCATIONS)
|
||||||
ULONG i;
|
ULONG i;
|
||||||
BLOCK_HDR* current;
|
BLOCK_HDR* current;
|
||||||
ULONG CurrentTag;
|
ULONG CurrentTag;
|
||||||
|
@ -857,7 +868,7 @@ MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly)
|
||||||
DbgPrint("Freeblocks %d TotalFreeSize %d AverageFreeSize %d\n",
|
DbgPrint("Freeblocks %d TotalFreeSize %d AverageFreeSize %d\n",
|
||||||
EiNrFreeBlocks, EiFreeNonPagedPool, EiNrFreeBlocks ? EiFreeNonPagedPool / EiNrFreeBlocks : 0);
|
EiNrFreeBlocks, EiFreeNonPagedPool, EiNrFreeBlocks ? EiFreeNonPagedPool / EiNrFreeBlocks : 0);
|
||||||
DbgPrint("***************** Dump Complete ***************\n");
|
DbgPrint("***************** Dump Complete ***************\n");
|
||||||
#endif /* TAG_STATISTICS_TRACKING */
|
#endif /* defined(TAG_STATISTICS_TRACKING) && !defined(WHOLE_PAGE_ALLOCATIONS) */
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
@ -1622,18 +1633,22 @@ ExAllocateNonPagedPoolWithTag(ULONG Type, ULONG Size, ULONG Tag, PVOID Caller)
|
||||||
#ifdef WHOLE_PAGE_ALLOCATIONS
|
#ifdef WHOLE_PAGE_ALLOCATIONS
|
||||||
|
|
||||||
PVOID STDCALL
|
PVOID STDCALL
|
||||||
ExAllocateWholePageBlock(ULONG UserSize)
|
ExAllocateWholePageBlock(ULONG Size)
|
||||||
{
|
{
|
||||||
PVOID Address;
|
PVOID Address;
|
||||||
PHYSICAL_ADDRESS Page;
|
PHYSICAL_ADDRESS Page;
|
||||||
ULONG i;
|
ULONG i;
|
||||||
ULONG Size;
|
|
||||||
ULONG NrPages;
|
ULONG NrPages;
|
||||||
|
ULONG Base;
|
||||||
|
|
||||||
Size = sizeof(ULONG) + UserSize;
|
|
||||||
NrPages = ROUND_UP(Size, PAGE_SIZE) / PAGE_SIZE;
|
NrPages = ROUND_UP(Size, PAGE_SIZE) / PAGE_SIZE;
|
||||||
|
|
||||||
Address = MiAllocNonPagedPoolRegion(NrPages + 1);
|
Base = RtlFindClearBitsAndSet(&NonPagedPoolAllocMap, NrPages + 1, NonPagedPoolAllocMapHint);
|
||||||
|
if (NonPagedPoolAllocMapHint == Base)
|
||||||
|
{
|
||||||
|
NonPagedPoolAllocMapHint += (NrPages + 1);
|
||||||
|
}
|
||||||
|
Address = MiNonPagedPoolStart + Base * PAGE_SIZE;
|
||||||
|
|
||||||
for (i = 0; i < NrPages; i++)
|
for (i = 0; i < NrPages; i++)
|
||||||
{
|
{
|
||||||
|
@ -1649,14 +1664,14 @@ ExAllocateWholePageBlock(ULONG UserSize)
|
||||||
TRUE);
|
TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
*((PULONG)((ULONG)Address + (NrPages * PAGE_SIZE) - Size)) = NrPages;
|
MiCurrentNonPagedPoolLength = max(MiCurrentNonPagedPoolLength, (Base + NrPages) * PAGE_SIZE);
|
||||||
return((PVOID)((ULONG)Address + (NrPages * PAGE_SIZE) - UserSize));
|
return((PVOID)((PUCHAR)Address + (NrPages * PAGE_SIZE) - Size));
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID STDCALL
|
VOID STDCALL
|
||||||
ExFreeWholePageBlock(PVOID Addr)
|
ExFreeWholePageBlock(PVOID Addr)
|
||||||
{
|
{
|
||||||
ULONG NrPages;
|
ULONG Base;
|
||||||
|
|
||||||
if (Addr < MiNonPagedPoolStart ||
|
if (Addr < MiNonPagedPoolStart ||
|
||||||
Addr >= (MiNonPagedPoolStart + MiCurrentNonPagedPoolLength))
|
Addr >= (MiNonPagedPoolStart + MiCurrentNonPagedPoolLength))
|
||||||
|
@ -1664,8 +1679,19 @@ ExFreeWholePageBlock(PVOID Addr)
|
||||||
DbgPrint("Block %x found outside pool area\n", Addr);
|
DbgPrint("Block %x found outside pool area\n", Addr);
|
||||||
KEBUGCHECK(0);
|
KEBUGCHECK(0);
|
||||||
}
|
}
|
||||||
NrPages = *(PULONG)((ULONG)Addr - sizeof(ULONG));
|
Base = (Addr - MiNonPagedPoolStart) / PAGE_SIZE;
|
||||||
MiFreeNonPagedPoolRegion((PVOID)PAGE_ROUND_DOWN((ULONG)Addr), NrPages, TRUE);
|
NonPagedPoolAllocMapHint = min(NonPagedPoolAllocMapHint, Base);
|
||||||
|
while (MmIsPagePresent(NULL, Addr))
|
||||||
|
{
|
||||||
|
MmDeleteVirtualMapping(NULL,
|
||||||
|
Addr,
|
||||||
|
TRUE,
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
RtlClearBits(&NonPagedPoolAllocMap, Base, 1);
|
||||||
|
Base++;
|
||||||
|
Addr += PAGE_SIZE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* WHOLE_PAGE_ALLOCATIONS */
|
#endif /* WHOLE_PAGE_ALLOCATIONS */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue