Author: tfaber
Date: Tue May 10 11:47:05 2016
New Revision: 71304

URL: http://svn.reactos.org/svn/reactos?rev=71304&view=rev
Log:
[NTOS:MM]
- Keep track of physical pages allocated for special pool, and respect the 
initially calculated MiSpecialPagesNonPagedMaximum

Modified:
    trunk/reactos/ntoskrnl/mm/ARM3/special.c

Modified: trunk/reactos/ntoskrnl/mm/ARM3/special.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/special.c?rev=71304&r1=71303&r2=71304&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/mm/ARM3/special.c    [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/ARM3/special.c    [iso-8859-1] Tue May 10 
11:47:05 2016
@@ -44,8 +44,12 @@
 PMMPTE MiSpecialPoolLastPte;
 
 PFN_COUNT MmSpecialPagesInUse;
+PFN_COUNT MmSpecialPagesInUsePeak;
+PFN_COUNT MiSpecialPagesPagable;
+PFN_COUNT MiSpecialPagesPagablePeak;
 PFN_COUNT MiSpecialPagesNonPaged;
-PFN_NUMBER MiSpecialPagesNonPagedMaximum;
+PFN_COUNT MiSpecialPagesNonPagedPeak;
+PFN_COUNT MiSpecialPagesNonPagedMaximum;
 
 BOOLEAN MmSpecialPoolCatchOverruns = TRUE;
 
@@ -135,7 +139,9 @@
     /* Reserve those PTEs */
     do
     {
-        PointerPte = MiReserveAlignedSystemPtes(SpecialPoolPtes, 0, 
/*0x400000*/0); // FIXME:
+        PointerPte = MiReserveAlignedSystemPtes(SpecialPoolPtes,
+                                                SystemPteSpace,
+                                                /*0x400000*/0); // FIXME:
         if (PointerPte) break;
 
         /* Reserving didn't work, so try to reduce the requested size */
@@ -238,6 +244,7 @@
     LARGE_INTEGER TickCount;
     PVOID Entry;
     PPOOL_HEADER Header;
+    PFN_COUNT PagesInUse;
 
     DPRINT("MmAllocateSpecialPool(%x %x %x %x)\n", NumberOfBytes, Tag, 
PoolType, SpecialType);
 
@@ -262,8 +269,13 @@
     }
 
     /* TODO: Take into account various limitations */
-    /*if ((PoolType != NonPagedPool) &&
-        MiSpecialPagesNonPaged > MiSpecialPagesNonPagedMaximum)*/
+
+    /* Heed the maximum limit of nonpaged pages */
+    if ((PoolType == NonPagedPool) &&
+        (MiSpecialPagesNonPaged > MiSpecialPagesNonPagedMaximum))
+    {
+        return NULL;
+    }
 
     /* Lock PFN database */
     Irql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
@@ -311,6 +323,11 @@
     /* Release the PFN database lock */
     KeReleaseQueuedSpinLock(LockQueuePfnLock, Irql);
 
+    /* Increase page counter */
+    PagesInUse = InterlockedIncrementUL(&MmSpecialPagesInUse);
+    if (PagesInUse > MmSpecialPagesInUsePeak)
+        MmSpecialPagesInUsePeak = PagesInUse;
+
     /* Put some content into the page. Low value of tick count would do */
     Entry = MiPteToAddress(PointerPte);
     RtlFillMemory(Entry, PAGE_SIZE, TickCount.LowPart);
@@ -347,11 +364,21 @@
 
         /* Also mark the next PTE as special-pool-paged */
         PointerPte[1].u.Soft.PageFileHigh |= SPECIAL_POOL_PAGED_PTE;
+
+        /* Increase pagable counter */
+        PagesInUse = InterlockedIncrementUL(&MiSpecialPagesPagable);
+        if (PagesInUse > MiSpecialPagesPagablePeak)
+            MiSpecialPagesPagablePeak = PagesInUse;
     }
     else
     {
         /* Mark the next PTE as special-pool-nonpaged */
         PointerPte[1].u.Soft.PageFileHigh |= SPECIAL_POOL_NONPAGED_PTE;
+
+        /* Increase nonpaged counter */
+        PagesInUse = InterlockedIncrementUL(&MiSpecialPagesNonPaged);
+        if (PagesInUse > MiSpecialPagesNonPagedPeak)
+            MiSpecialPagesNonPagedPeak = PagesInUse;
     }
 
     /* Finally save tag and put allocation time into the header's blocksize.
@@ -547,6 +574,9 @@
         /* Non pagable. Get PFN element corresponding to the PTE */
         Pfn = MI_PFN_ELEMENT(PointerPte->u.Hard.PageFrameNumber);
 
+        /* Count the page as free */
+        InterlockedDecrementUL(&MiSpecialPagesNonPaged);
+
         /* Lock PFN database */
         Irql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
 
@@ -567,6 +597,9 @@
         /* Pagable. Delete that virtual address */
         MiDeleteSystemPageableVm(PointerPte, 1, 0, NULL);
 
+        /* Count the page as free */
+        InterlockedDecrementUL(&MiSpecialPagesPagable);
+
         /* Lock PFN database */
         Irql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
     }
@@ -586,6 +619,9 @@
 
     /* Release the PFN database lock */
     KeReleaseQueuedSpinLock(LockQueuePfnLock, Irql);
+
+    /* Update page counter */
+    InterlockedDecrementUL(&MmSpecialPagesInUse);
 }
 
 VOID


Reply via email to