[ros-diffs] [fireball] 32463: - 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.

fireball at svn.reactos.org fireball at svn.reactos.org
Sun Feb 24 11:43:57 CET 2008


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/mm.h?rev=32463&r1=32462&r2=32463&view=diff
==============================================================================
--- 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=32463&r1=32462&r2=32463&view=diff
==============================================================================
--- 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=32463&r1=32462&r2=32463&view=diff
==============================================================================
--- 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




More information about the Ros-diffs mailing list