Author: sir_richard
Date: Mon Sep 27 16:00:24 2010
New Revision: 48908
URL:
http://svn.reactos.org/svn/reactos?rev=48908&view=rev
Log:
[NTOS]: Stop using MiInsertInListTail and MiRemoveHeadList in the deprecated ReactOS page
functions. Those two functions do not adequately support the semantis needed for page
insertion/removal and should've never been used. MmAllocPage now uses
MiRemoveAny/ZeroPage, and MmDereferencePage uses MiInsertPageInFreeList. Should help with
some corruptions. More is coming.
Modified:
trunk/reactos/ntoskrnl/mm/freelist.c
Modified: trunk/reactos/ntoskrnl/mm/freelist.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/freelist.c?rev…
==============================================================================
--- trunk/reactos/ntoskrnl/mm/freelist.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/freelist.c [iso-8859-1] Mon Sep 27 16:00:24 2010
@@ -567,13 +567,11 @@
Page->u3.e2.ReferenceCount--;
if (Page->u3.e2.ReferenceCount == 0)
{
- MmAvailablePages++;
- Page->u3.e1.PageLocation = FreePageList;
- MiInsertInListTail(&MmFreePageListHead, Page);
- if (MmFreePageListHead.Total > 8 && 0 ==
KeReadStateEvent(&ZeroPageThreadEvent))
- {
- KeSetEvent(&ZeroPageThreadEvent, IO_NO_INCREMENT, FALSE);
- }
+ /* Mark the page temporarily as valid, we're going to make it free soon */
+ Page->u3.e1.PageLocation = ActiveAndValid;
+
+ /* Bring it back into the free list */
+ MiInsertPageInFreeList(Pfn);
}
}
@@ -582,44 +580,26 @@
MmAllocPage(ULONG Type)
{
PFN_NUMBER PfnOffset;
- PPHYSICAL_PAGE PageDescriptor;
- BOOLEAN NeedClear = FALSE;
-
- DPRINT("MmAllocPage()\n");
-
- if (MmZeroedPageListHead.Total == 0)
+ PMMPFN Pfn1;
+
+ if (Type != MC_SYSTEM)
{
- if (MmFreePageListHead.Total == 0)
- {
- /* Check if this allocation is for the PFN DB itself */
- if (MmNumberOfPhysicalPages == 0)
- {
- ASSERT(FALSE);
- }
-
- DPRINT1("MmAllocPage(): Out of memory\n");
- return 0;
- }
- PageDescriptor = MiRemoveHeadList(&MmFreePageListHead);
-
- NeedClear = TRUE;
+ PfnOffset = MiRemoveZeroPage(0);
}
else
{
- PageDescriptor = MiRemoveHeadList(&MmZeroedPageListHead);
+ PfnOffset = MiRemoveAnyPage(0);
}
- PageDescriptor->u3.e2.ReferenceCount = 1;
-
- MmAvailablePages--;
-
- PfnOffset = MiGetPfnEntryIndex(PageDescriptor);
- if ((NeedClear) && (Type != MC_SYSTEM))
+ if (!PfnOffset)
{
- MiZeroPage(PfnOffset);
+ DPRINT1("MmAllocPage(): Out of memory\n");
+ return 0;
}
-
- PageDescriptor->u3.e1.PageLocation = ActiveAndValid;
+
+ Pfn1 = MiGetPfnEntry(PfnOffset);
+ Pfn1->u3.e2.ReferenceCount = 1;
+ Pfn1->u3.e1.PageLocation = ActiveAndValid;
return PfnOffset;
}