Zero pages before allocated.

svn path=/trunk/; revision=2323
This commit is contained in:
David Welch 2001-10-29 02:39:38 +00:00
parent 2a1ac328ed
commit 6efd918a8b
2 changed files with 43 additions and 29 deletions

View file

@ -42,7 +42,8 @@ static PPHYSICAL_PAGE MmPageArray;
static LIST_ENTRY UsedPageListHead; static LIST_ENTRY UsedPageListHead;
static KSPIN_LOCK PageListLock; static KSPIN_LOCK PageListLock;
static LIST_ENTRY FreePageListHead; static LIST_ENTRY FreeZeroedPageListHead;
static LIST_ENTRY FreeUnzeroedPageListHead;
static LIST_ENTRY BiosPageListHead; static LIST_ENTRY BiosPageListHead;
NTSTATUS NTSTATUS
@ -137,7 +138,7 @@ VOID MiParseRangeToFreeList(
{ {
MmPageArray[i].Flags = MM_PHYSICAL_PAGE_FREE; MmPageArray[i].Flags = MM_PHYSICAL_PAGE_FREE;
MmPageArray[i].ReferenceCount = 0; MmPageArray[i].ReferenceCount = 0;
InsertTailList(&FreePageListHead, InsertTailList(&FreeUnzeroedPageListHead,
&MmPageArray[i].ListEntry); &MmPageArray[i].ListEntry);
} }
} }
@ -230,7 +231,8 @@ PVOID MmInitializePageList(PVOID FirstPhysKernelAddress,
InitializeListHead(&UsedPageListHead); InitializeListHead(&UsedPageListHead);
KeInitializeSpinLock(&PageListLock); KeInitializeSpinLock(&PageListLock);
InitializeListHead(&FreePageListHead); InitializeListHead(&FreeUnzeroedPageListHead);
InitializeListHead(&FreeZeroedPageListHead);
InitializeListHead(&BiosPageListHead); InitializeListHead(&BiosPageListHead);
Reserved = Reserved =
@ -295,7 +297,7 @@ PVOID MmInitializePageList(PVOID FirstPhysKernelAddress,
{ {
MmPageArray[i].Flags = MM_PHYSICAL_PAGE_FREE; MmPageArray[i].Flags = MM_PHYSICAL_PAGE_FREE;
MmPageArray[i].ReferenceCount = 0; MmPageArray[i].ReferenceCount = 0;
InsertTailList(&FreePageListHead, InsertTailList(&FreeUnzeroedPageListHead,
&MmPageArray[i].ListEntry); &MmPageArray[i].ListEntry);
} }
MmStats.NrSystemPages += MmStats.NrSystemPages +=
@ -312,7 +314,7 @@ PVOID MmInitializePageList(PVOID FirstPhysKernelAddress,
{ {
MmPageArray[i].Flags = MM_PHYSICAL_PAGE_FREE; MmPageArray[i].Flags = MM_PHYSICAL_PAGE_FREE;
MmPageArray[i].ReferenceCount = 0; MmPageArray[i].ReferenceCount = 0;
InsertTailList(&FreePageListHead, InsertTailList(&FreeUnzeroedPageListHead,
&MmPageArray[i].ListEntry); &MmPageArray[i].ListEntry);
} }
MmStats.NrReservedPages += ((0x100000/PAGESIZE) - i); MmStats.NrReservedPages += ((0x100000/PAGESIZE) - i);
@ -331,7 +333,7 @@ PVOID MmInitializePageList(PVOID FirstPhysKernelAddress,
{ {
MmPageArray[i].Flags = MM_PHYSICAL_PAGE_FREE; MmPageArray[i].Flags = MM_PHYSICAL_PAGE_FREE;
MmPageArray[i].ReferenceCount = 0; MmPageArray[i].ReferenceCount = 0;
InsertTailList(&FreePageListHead, InsertTailList(&FreeUnzeroedPageListHead,
&MmPageArray[i].ListEntry); &MmPageArray[i].ListEntry);
} }
MmStats.NrReservedPages += (0x60000 / PAGESIZE); MmStats.NrReservedPages += (0x60000 / PAGESIZE);
@ -347,7 +349,7 @@ PVOID MmInitializePageList(PVOID FirstPhysKernelAddress,
{ {
MmPageArray[i].Flags = MM_PHYSICAL_PAGE_FREE; MmPageArray[i].Flags = MM_PHYSICAL_PAGE_FREE;
MmPageArray[i].ReferenceCount = 0; MmPageArray[i].ReferenceCount = 0;
InsertTailList(&FreePageListHead, InsertTailList(&FreeUnzeroedPageListHead,
&MmPageArray[i].ListEntry); &MmPageArray[i].ListEntry);
} }
MmStats.NrSystemPages += MmStats.NrSystemPages +=
@ -366,7 +368,7 @@ PVOID MmInitializePageList(PVOID FirstPhysKernelAddress,
{ {
MmPageArray[i].Flags = MM_PHYSICAL_PAGE_FREE; MmPageArray[i].Flags = MM_PHYSICAL_PAGE_FREE;
MmPageArray[i].ReferenceCount = 0; MmPageArray[i].ReferenceCount = 0;
InsertTailList(&FreePageListHead, InsertTailList(&FreeUnzeroedPageListHead,
&MmPageArray[i].ListEntry); &MmPageArray[i].ListEntry);
} }
@ -574,7 +576,7 @@ VOID MmDereferencePage(PVOID PhysicalAddress)
KeBugCheck(0); KeBugCheck(0);
} }
MmPageArray[Start].Flags = MM_PHYSICAL_PAGE_FREE; MmPageArray[Start].Flags = MM_PHYSICAL_PAGE_FREE;
InsertTailList(&FreePageListHead, &MmPageArray[Start].ListEntry); InsertTailList(&FreeUnzeroedPageListHead, &MmPageArray[Start].ListEntry);
} }
KeReleaseSpinLock(&PageListLock, oldIrql); KeReleaseSpinLock(&PageListLock, oldIrql);
} }
@ -662,21 +664,34 @@ MmAllocPage(SWAPENTRY SavedSwapEntry)
PLIST_ENTRY ListEntry; PLIST_ENTRY ListEntry;
PPHYSICAL_PAGE PageDescriptor; PPHYSICAL_PAGE PageDescriptor;
KIRQL oldIrql; KIRQL oldIrql;
BOOLEAN NeedClear = FALSE;
DPRINT("MmAllocPage()\n"); DPRINT("MmAllocPage()\n");
KeAcquireSpinLock(&PageListLock, &oldIrql); KeAcquireSpinLock(&PageListLock, &oldIrql);
if (IsListEmpty(&FreePageListHead)) if (IsListEmpty(&FreeZeroedPageListHead))
{
if (IsListEmpty(&FreeUnzeroedPageListHead))
{ {
DPRINT1("MmAllocPage(): Out of memory\n"); DPRINT1("MmAllocPage(): Out of memory\n");
KeReleaseSpinLock(&PageListLock, oldIrql); KeReleaseSpinLock(&PageListLock, oldIrql);
return(NULL); return(NULL);
} }
ListEntry = RemoveTailList(&FreePageListHead); ListEntry = RemoveTailList(&FreeUnzeroedPageListHead);
PageDescriptor = CONTAINING_RECORD(ListEntry, PHYSICAL_PAGE, ListEntry);
KeReleaseSpinLock(&PageListLock, oldIrql);
NeedClear = TRUE;
}
else
{
ListEntry = RemoveTailList(&FreeZeroedPageListHead);
KeReleaseSpinLock(&PageListLock, oldIrql); KeReleaseSpinLock(&PageListLock, oldIrql);
PageDescriptor = CONTAINING_RECORD(ListEntry, PHYSICAL_PAGE, ListEntry); PageDescriptor = CONTAINING_RECORD(ListEntry, PHYSICAL_PAGE, ListEntry);
DPRINT("PageDescriptor %x\n",PageDescriptor); }
if (PageDescriptor->Flags != MM_PHYSICAL_PAGE_FREE) if (PageDescriptor->Flags != MM_PHYSICAL_PAGE_FREE)
{ {
DbgPrint("Got non-free page from freelist\n"); DbgPrint("Got non-free page from freelist\n");
@ -687,18 +702,17 @@ MmAllocPage(SWAPENTRY SavedSwapEntry)
PageDescriptor->LockCount = 0; PageDescriptor->LockCount = 0;
PageDescriptor->MapCount = 0; PageDescriptor->MapCount = 0;
PageDescriptor->SavedSwapEntry = SavedSwapEntry; PageDescriptor->SavedSwapEntry = SavedSwapEntry;
ExInterlockedInsertTailList(&UsedPageListHead, ListEntry, ExInterlockedInsertTailList(&UsedPageListHead, ListEntry, &PageListLock);
&PageListLock);
DPRINT("PageDescriptor %x MmPageArray %x\n", PageDescriptor, MmPageArray);
offset = (ULONG)((ULONG)PageDescriptor - (ULONG)MmPageArray);
DPRINT("offset %x\n",offset);
offset = offset / sizeof(PHYSICAL_PAGE) * PAGESIZE;
DPRINT("offset %x\n",offset);
MmStats.NrSystemPages++; MmStats.NrSystemPages++;
MmStats.NrFreePages--; MmStats.NrFreePages--;
offset = (ULONG)((ULONG)PageDescriptor - (ULONG)MmPageArray);
offset = (offset / sizeof(PHYSICAL_PAGE)) * PAGESIZE;
if (NeedClear)
{
MiZeroPage(offset);
}
DPRINT("MmAllocPage() = %x\n",offset); DPRINT("MmAllocPage() = %x\n",offset);
return((PVOID)offset); return((PVOID)offset);
} }

View file

@ -1,4 +1,4 @@
/* $Id: npool.c,v 1.47 2001/09/29 19:40:49 phreak Exp $ /* $Id: npool.c,v 1.48 2001/10/29 02:39:38 dwelch Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel