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/m... ============================================================================== --- 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=32... ============================================================================== --- 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