Author: fireball
Date: Sun Feb 24 13:43:56 2008
New Revision: 32463
URL: http://svn.reactos.org/svn/reactos?rev=32463&view=rev
Log:
- Save original value of the free descriptor we're using to alloc early pages from.
- Fix handling of PFN database pages inside PFN: largest free descriptor does not always end with the highest usable physical page (MmPageArraySize). This removes the need for a "good hack" introduced in revision 32405. As a result, the memory above the largest free descriptor (if it exists) is now correctly marked in the PFN database as free and added to the unzeroed list.
Modified:
trunk/reactos/ntoskrnl/include/internal/mm.h
trunk/reactos/ntoskrnl/mm/freelist.c
trunk/reactos/ntoskrnl/mm/mminit.c
Modified: trunk/reactos/ntoskrnl/include/internal/mm.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/…
==============================================================================
--- trunk/reactos/ntoskrnl/include/internal/mm.h (original)
+++ trunk/reactos/ntoskrnl/include/internal/mm.h Sun Feb 24 13:43:56 2008
@@ -19,6 +19,7 @@
extern ULONG MmPagedPoolSize;
extern PMEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptor;
+extern MEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptorOrg;
extern ULONG MmHighestPhysicalPage;
extern PVOID MmPfnDatabase;
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 (original)
+++ trunk/reactos/ntoskrnl/mm/freelist.c Sun Feb 24 13:43:56 2008
@@ -54,13 +54,13 @@
/* Make sure the PFN number is valid */
ASSERT(Pfn <= MmPageArraySize);
-
+
/* Get the entry */
Page = &MmPageArray[Pfn];
-
+
/* Make sure it's valid */
ASSERT_PFN(Page);
-
+
/* Return it */
return Page;
}
@@ -368,20 +368,14 @@
}
}
}
-
+
/* Finally handle the pages describing the PFN database themselves */
for (i = (MiFreeDescriptor->BasePage + MiFreeDescriptor->PageCount);
- i <= MmPageArraySize;
+ i < (MiFreeDescriptorOrg.BasePage + MiFreeDescriptorOrg.PageCount);
i++)
{
- /* If this page was marked as free it should be removed from
- the unzeroed free pages list */
- if (MmPageArray[i].Flags.Type == MM_PHYSICAL_PAGE_FREE)
- {
- RemoveEntryList(&MmPageArray[i].ListEntry);
- UnzeroedPageCount--;
- MmStats.NrFreePages--;
- }
+ /* Ensure this page was not added previously */
+ ASSERT(MmPageArray[i].Flags.Type == 0);
/* Mark it as used kernel memory */
MmPageArray[i] = UsedPage;
@@ -764,7 +758,7 @@
MiZeroPage(PfnOffset);
return PfnOffset;
}
-
+
DPRINT1("MmAllocPage(): Out of memory\n");
KeReleaseSpinLock(&PageListLock, oldIrql);
return 0;
Modified: trunk/reactos/ntoskrnl/mm/mminit.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/mminit.c?rev=3…
==============================================================================
--- trunk/reactos/ntoskrnl/mm/mminit.c (original)
+++ trunk/reactos/ntoskrnl/mm/mminit.c Sun Feb 24 13:43:56 2008
@@ -55,6 +55,7 @@
PVOID MmPfnDatabase;
ULONG_PTR MmPfnDatabaseEnd;
PMEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptor;
+MEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptorOrg;
extern KMUTANT MmSystemLoadLock;
BOOLEAN MiDbgEnableMdDump =
#ifdef _ARM_
@@ -246,6 +247,10 @@
}
}
}
+
+ /* Save original values of the free descriptor, since it'll be
+ altered by early allocations */
+ MiFreeDescriptorOrg = *MiFreeDescriptor;
}
VOID