- Initialize the used page count for the non paged pool in MmInitializeBalancer.
[reactos.git] / reactos / ntoskrnl / mm / freelist.c
index 85302ff..7313084 100644 (file)
@@ -73,7 +73,7 @@ MmTransferOwnershipPage(PHYSICAL_ADDRESS PhysicalAddress, ULONG NewConsumer)
   if (MmPageArray[Start].MapCount != 0)
     {
       DbgPrint("Transfering mapped page.\n");
-      KeBugCheck(0);
+      KEBUGCHECK(0);
     }
   RemoveEntryList(&MmPageArray[Start].ListEntry);
   InsertTailList(&UsedPageListHeads[NewConsumer], 
@@ -219,7 +219,7 @@ MmGetContinuousPages(ULONG NumberOfBytes,
    return((LARGE_INTEGER)((LONGLONG)start * PAGE_SIZE));
 }
 
-VOID 
+VOID INIT_FUNCTION
 MiParseRangeToFreeList(PADDRESS_RANGE Range)
 {
   ULONG i, first, last;
@@ -233,7 +233,7 @@ MiParseRangeToFreeList(PADDRESS_RANGE Range)
   
   first = (Range->BaseAddrLow + PAGE_SIZE - 1) / PAGE_SIZE;
   last = first + ((Range->LengthLow + PAGE_SIZE - 1) / PAGE_SIZE);
-  for (i = first; i < last; i++)
+  for (i = first; i < last && i < MmPageArraySize; i++)
     {
       if (MmPageArray[i].Flags.Type == 0)
         {
@@ -246,7 +246,7 @@ MiParseRangeToFreeList(PADDRESS_RANGE Range)
     }
 }
 
-VOID
+VOID INIT_FUNCTION
 MiParseRangeToBiosList(PADDRESS_RANGE Range)
 {
   ULONG i, first, last;
@@ -260,7 +260,7 @@ MiParseRangeToBiosList(PADDRESS_RANGE Range)
   
   first = (Range->BaseAddrLow + PAGE_SIZE - 1) / PAGE_SIZE;
   last = first + ((Range->LengthLow + PAGE_SIZE - 1) / PAGE_SIZE);
-  for (i = first; i < last; i++)
+  for (i = first; i < last && i < MmPageArraySize; i++)
     {
       /* Remove the page from the free list if it is there */
       if (MmPageArray[i].Flags.Type == MM_PHYSICAL_PAGE_FREE)
@@ -279,33 +279,28 @@ MiParseRangeToBiosList(PADDRESS_RANGE Range)
     }
 }
 
-VOID 
-MiParseBIOSMemoryMap(ULONG MemorySizeInPages,
-                    PADDRESS_RANGE BIOSMemoryMap,
+VOID INIT_FUNCTION
+MiParseBIOSMemoryMap(PADDRESS_RANGE BIOSMemoryMap,
                     ULONG AddressRangeCount)
 {
   PADDRESS_RANGE p;
   ULONG i;
   
   p = BIOSMemoryMap;
-  for (i = 0; i < AddressRangeCount; i++)
+  for (i = 0; i < AddressRangeCount; i++, p++)
     {
-      if (((p->BaseAddrLow + PAGE_SIZE - 1) / PAGE_SIZE) < MemorySizeInPages)
+      if (p->Type == 1)
         {
-          if (p->Type == 1)
-            {
-              MiParseRangeToFreeList(p);
-            }
-          else
-            {
-              MiParseRangeToBiosList(p);
-            }
+          MiParseRangeToFreeList(p);
+        }
+      else
+        {
+          MiParseRangeToBiosList(p);
         }
-      p += 1;
     }
 }
 
-PVOID 
+PVOID INIT_FUNCTION
 MmInitializePageList(PVOID FirstPhysKernelAddress,
                     PVOID LastPhysKernelAddress,
                     ULONG MemorySizeInPages,
@@ -380,7 +375,7 @@ MmInitializePageList(PVOID FirstPhysKernelAddress,
           if (!NT_SUCCESS(Status))
             {
               DbgPrint("Unable to create virtual mapping\n");
-              KeBugCheck(0);
+              KEBUGCHECK(0);
             }
         }
        memset((PVOID)MmPageArray + (i * PAGE_SIZE), 0, PAGE_SIZE);
@@ -502,7 +497,6 @@ MmInitializePageList(PVOID FirstPhysKernelAddress,
   if ((BIOSMemoryMap != NULL) && (AddressRangeCount > 0))
     {
       MiParseBIOSMemoryMap(
-        MemorySizeInPages,
         BIOSMemoryMap,
         AddressRangeCount);
     }
@@ -512,7 +506,7 @@ MmInitializePageList(PVOID FirstPhysKernelAddress,
   
    MmStats.NrTotalPages = MmStats.NrFreePages + MmStats.NrSystemPages +
      MmStats.NrReservedPages + MmStats.NrUserPages;
-   MmInitializeBalancer(MmStats.NrFreePages);
+   MmInitializeBalancer(MmStats.NrFreePages, MmStats.NrSystemPages + MmStats.NrReservedPages);
    return((PVOID)LastKernelAddress);
 }
 
@@ -556,7 +550,7 @@ MmMarkPageMapped(PHYSICAL_ADDRESS PhysicalAddress)
       if (MmPageArray[Start].Flags.Type == MM_PHYSICAL_PAGE_FREE)
        {
          DbgPrint("Mapping non-used page\n");
-         KeBugCheck(0);
+         KEBUGCHECK(0);
        }
       MmPageArray[Start].MapCount++;
       KeReleaseSpinLock(&PageListLock, oldIrql);
@@ -575,12 +569,12 @@ MmMarkPageUnmapped(PHYSICAL_ADDRESS PhysicalAddress)
       if (MmPageArray[Start].Flags.Type == MM_PHYSICAL_PAGE_FREE)
        {
          DbgPrint("Unmapping non-used page\n");
-         KeBugCheck(0);
+         KEBUGCHECK(0);
        }
       if (MmPageArray[Start].MapCount == 0)
        {
          DbgPrint("Unmapping not mapped page\n");
-         KeBugCheck(0);
+         KEBUGCHECK(0);
        }
       MmPageArray[Start].MapCount--;
       KeReleaseSpinLock(&PageListLock, oldIrql);
@@ -638,7 +632,7 @@ MmReferencePage(PHYSICAL_ADDRESS PhysicalAddress)
 
    if (PhysicalAddress.u.LowPart == 0)
      {
-       KeBugCheck(0);
+       KEBUGCHECK(0);
      }
    
    KeAcquireSpinLock(&PageListLock, &oldIrql);
@@ -646,7 +640,7 @@ MmReferencePage(PHYSICAL_ADDRESS PhysicalAddress)
    if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED)
      {
        DbgPrint("Referencing non-used page\n");
-       KeBugCheck(0);
+       KEBUGCHECK(0);
      }
    
    MmPageArray[Start].ReferenceCount++;
@@ -664,7 +658,7 @@ MmGetReferenceCountPage(PHYSICAL_ADDRESS PhysicalAddress)
 
    if (PhysicalAddress.u.LowPart == 0)
      {
-       KeBugCheck(0);
+       KEBUGCHECK(0);
      }
    
    KeAcquireSpinLock(&PageListLock, &oldIrql);
@@ -672,7 +666,7 @@ MmGetReferenceCountPage(PHYSICAL_ADDRESS PhysicalAddress)
    if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED)
      {
        DbgPrint("Getting reference count for free page\n");
-       KeBugCheck(0);
+       KEBUGCHECK(0);
      }
    
    RCount = MmPageArray[Start].ReferenceCount;
@@ -690,7 +684,7 @@ MmIsUsablePage(PHYSICAL_ADDRESS PhysicalAddress)
 
    if (PhysicalAddress.u.LowPart == 0)
      {
-       KeBugCheck(0);
+       KEBUGCHECK(0);
      }
 
    if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED &&
@@ -712,7 +706,7 @@ MmDereferencePage(PHYSICAL_ADDRESS PhysicalAddress)
 
    if (PhysicalAddress.u.LowPart == 0)
      {
-       KeBugCheck(0);
+       KEBUGCHECK(0);
      }
    
    KeAcquireSpinLock(&PageListLock, &oldIrql);
@@ -721,7 +715,7 @@ MmDereferencePage(PHYSICAL_ADDRESS PhysicalAddress)
    if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED)
      {
        DbgPrint("Dereferencing free page\n");
-       KeBugCheck(0);
+       KEBUGCHECK(0);
      }
   
    MmPageArray[Start].ReferenceCount--;
@@ -733,29 +727,29 @@ MmDereferencePage(PHYSICAL_ADDRESS PhysicalAddress)
        if (MmPageArray[Start].RmapListHead != NULL)
         {
           DbgPrint("Freeing page with rmap entries.\n");
-          KeBugCheck(0);
+          KEBUGCHECK(0);
         }
        if (MmPageArray[Start].MapCount != 0)
         {
           DbgPrint("Freeing mapped page (0x%I64x count %d)\n",
                    PhysicalAddress, MmPageArray[Start].MapCount);
-          KeBugCheck(0);
+          KEBUGCHECK(0);
         }
        if (MmPageArray[Start].LockCount > 0)
         {
           DbgPrint("Freeing locked page\n");
-          KeBugCheck(0);
+          KEBUGCHECK(0);
         }
        if (MmPageArray[Start].SavedSwapEntry != 0)
         {
           DbgPrint("Freeing page with swap entry.\n");
-          KeBugCheck(0);
+          KEBUGCHECK(0);
         }
        if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED)
         {
           DbgPrint("Freeing page with flags %x\n",
                    MmPageArray[Start].Flags.Type);
-          KeBugCheck(0);
+          KEBUGCHECK(0);
         }
        MmPageArray[Start].Flags.Type = MM_PHYSICAL_PAGE_FREE;
        InsertTailList(&FreeUnzeroedPageListHead, 
@@ -780,7 +774,7 @@ MmGetLockCountPage(PHYSICAL_ADDRESS PhysicalAddress)
    
    if (PhysicalAddress.u.LowPart == 0)
      {
-       KeBugCheck(0);
+       KEBUGCHECK(0);
      }
    
    KeAcquireSpinLock(&PageListLock, &oldIrql);
@@ -788,7 +782,7 @@ MmGetLockCountPage(PHYSICAL_ADDRESS PhysicalAddress)
    if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED)
      {
        DbgPrint("Getting lock count for free page\n");
-       KeBugCheck(0);
+       KEBUGCHECK(0);
      }
    
    LockCount = MmPageArray[Start].LockCount;
@@ -807,7 +801,7 @@ MmLockPage(PHYSICAL_ADDRESS PhysicalAddress)
    
    if (PhysicalAddress.u.LowPart == 0)
      {
-       KeBugCheck(0);
+       KEBUGCHECK(0);
      }
    
    KeAcquireSpinLock(&PageListLock, &oldIrql);
@@ -815,7 +809,7 @@ MmLockPage(PHYSICAL_ADDRESS PhysicalAddress)
    if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED)
      {
        DbgPrint("Locking free page\n");
-       KeBugCheck(0);
+       KEBUGCHECK(0);
      }
    
    MmPageArray[Start].LockCount++;
@@ -832,7 +826,7 @@ MmUnlockPage(PHYSICAL_ADDRESS PhysicalAddress)
    
    if (PhysicalAddress.u.LowPart == 0)
      {
-       KeBugCheck(0);
+       KEBUGCHECK(0);
      }
    
    KeAcquireSpinLock(&PageListLock, &oldIrql);
@@ -840,7 +834,7 @@ MmUnlockPage(PHYSICAL_ADDRESS PhysicalAddress)
    if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED)
      {
        DbgPrint("Unlocking free page\n");
-       KeBugCheck(0);
+       KEBUGCHECK(0);
      }
    
    MmPageArray[Start].LockCount--;
@@ -884,12 +878,12 @@ MmAllocPage(ULONG Consumer, SWAPENTRY SavedSwapEntry)
   if (PageDescriptor->Flags.Type != MM_PHYSICAL_PAGE_FREE)
     {
       DbgPrint("Got non-free page from freelist\n");
-      KeBugCheck(0);
+      KEBUGCHECK(0);
     }
   if (PageDescriptor->MapCount != 0)
     {
       DbgPrint("Got mapped page from freelist\n");
-      KeBugCheck(0);
+      KEBUGCHECK(0);
     }
   PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_USED;
   PageDescriptor->Flags.Consumer = Consumer;
@@ -914,7 +908,7 @@ MmAllocPage(ULONG Consumer, SWAPENTRY SavedSwapEntry)
   if (PageDescriptor->MapCount != 0)
     {
       DbgPrint("Returning mapped page.\n");
-      KeBugCheck(0);
+      KEBUGCHECK(0);
     }
   return(PageOffset);
 }
@@ -941,7 +935,7 @@ MmZeroPageThreadMain(PVOID Ignored)
       if (!NT_SUCCESS(Status))
        {
          DbgPrint("ZeroPageThread: Wait failed\n");
-         KeBugCheck(0);
+         KEBUGCHECK(0);
          return(STATUS_UNSUCCESSFUL);
        }
 
@@ -972,7 +966,7 @@ MmZeroPageThreadMain(PVOID Ignored)
             if (!NT_SUCCESS(Status))
             {
                DbgPrint("Unable to create virtual mapping\n");
-              KeBugCheck(0);
+              KEBUGCHECK(0);
             }
         }
          memset(Address, 0, PAGE_SIZE);
@@ -981,7 +975,7 @@ MmZeroPageThreadMain(PVOID Ignored)
         if (PageDescriptor->MapCount != 0)
           {
             DbgPrint("Mapped page on freelist.\n");
-            KeBugCheck(0);
+            KEBUGCHECK(0);
           }
         PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_FREE;
         InsertHeadList(&FreeZeroedPageListHead, ListEntry);
@@ -992,7 +986,8 @@ MmZeroPageThreadMain(PVOID Ignored)
     }
 }
  
-NTSTATUS MmInitZeroPageThread(VOID)
+NTSTATUS INIT_FUNCTION
+MmInitZeroPageThread(VOID)
 {
   KPRIORITY Priority;
   NTSTATUS Status;
@@ -1002,7 +997,7 @@ NTSTATUS MmInitZeroPageThread(VOID)
                                NULL,
                                NULL,
                                &ZeroPageThreadId,
-                               MmZeroPageThreadMain,
+                               (PKSTART_ROUTINE) MmZeroPageThreadMain,
                                NULL);
   if (!NT_SUCCESS(Status))
     {