Author: tkreuzer Date: Sat Oct 4 21:17:27 2014 New Revision: 64528
URL: http://svn.reactos.org/svn/reactos?rev=64528&view=rev Log: [NTOSKRNL] - Implement MiIncrementAvailablePages and MiDecrementAvailablePages factoring out duplicated code from a number of locations - Get rid of MiAllocatePfn. Any further comment would result in excessive use of curse words.
Modified: trunk/reactos/ntoskrnl/mm/ARM3/miarm.h trunk/reactos/ntoskrnl/mm/ARM3/pfnlist.c trunk/reactos/ntoskrnl/mm/ARM3/sysldr.c
Modified: trunk/reactos/ntoskrnl/mm/ARM3/miarm.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/miarm.h?re... ============================================================================== --- trunk/reactos/ntoskrnl/mm/ARM3/miarm.h [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/mm/ARM3/miarm.h [iso-8859-1] Sat Oct 4 21:17:27 2014 @@ -1973,13 +1973,6 @@ IN PMMPFN Pfn );
-PFN_NUMBER -NTAPI -MiAllocatePfn( - IN PMMPTE PointerPte, - IN ULONG Protection -); - VOID NTAPI MiInitializePfn(
Modified: trunk/reactos/ntoskrnl/mm/ARM3/pfnlist.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/pfnlist.c?... ============================================================================== --- trunk/reactos/ntoskrnl/mm/ARM3/pfnlist.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/mm/ARM3/pfnlist.c [iso-8859-1] Sat Oct 4 21:17:27 2014 @@ -65,6 +65,59 @@
/* FUNCTIONS ******************************************************************/
+static +VOID +MiIncrementAvailablePages( + VOID) +{ + /* Increment available pages */ + MmAvailablePages++; + + /* Check if we've reached the configured low memory threshold */ + if (MmAvailablePages == MmLowMemoryThreshold) + { + /* Clear the event, because now we're ABOVE the threshold */ + KeClearEvent(MiLowMemoryEvent); + } + else if (MmAvailablePages == MmHighMemoryThreshold) + { + /* Otherwise check if we reached the high threshold and signal the event */ + KeSetEvent(MiHighMemoryEvent, 0, FALSE); + } +} + +static +VOID +MiDecrementAvailablePages( + VOID) +{ + ASSERT(MmAvailablePages > 0); + + /* See if we hit any thresholds */ + if (MmAvailablePages == MmHighMemoryThreshold) + { + /* Clear the high memory event */ + KeClearEvent(MiHighMemoryEvent); + } + else if (MmAvailablePages == MmLowMemoryThreshold) + { + /* Signal the low memory event */ + KeSetEvent(MiLowMemoryEvent, 0, FALSE); + } + + /* One less page */ + MmAvailablePages--; + if (MmAvailablePages < MmMinimumFreePages) + { + /* FIXME: Should wake up the MPW and working set manager, if we had one */ + + DPRINT1("Running low on pages: %lu remaining\n", MmAvailablePages); + + /* Call RosMm and see if it can release any pages for us */ + MmRebalanceMemoryConsumers(); + } +} + VOID NTAPI MiZeroPhysicalPage(IN PFN_NUMBER PageFrameIndex) @@ -195,28 +248,8 @@ Entry->u1.Flink = Entry->u2.Blink = 0; ASSERT_LIST_INVARIANT(ListHead);
- /* See if we hit any thresholds */ - if (MmAvailablePages == MmHighMemoryThreshold) - { - /* Clear the high memory event */ - KeClearEvent(MiHighMemoryEvent); - } - else if (MmAvailablePages == MmLowMemoryThreshold) - { - /* Signal the low memory event */ - KeSetEvent(MiLowMemoryEvent, 0, FALSE); - } - - /* One less page */ - if (--MmAvailablePages < MmMinimumFreePages) - { - /* FIXME: Should wake up the MPW and working set manager, if we had one */ - - DPRINT1("Running low on pages: %lu remaining\n", MmAvailablePages); - - /* Call RosMm and see if it can release any pages for us */ - MmRebalanceMemoryConsumers(); - } + /* Decrement number of available pages */ + MiDecrementAvailablePages();
#if MI_TRACE_PFNS ASSERT(MI_PFN_CURRENT_USAGE != MI_USAGE_NOT_SET); @@ -253,31 +286,12 @@ /* Get the exact list */ ListHead = &MmStandbyPageListByPriority[Pfn->u4.Priority];
- /* See if we hit any thresholds */ - if (MmAvailablePages == MmHighMemoryThreshold) - { - /* Clear the high memory event */ - KeClearEvent(MiHighMemoryEvent); - } - else if (MmAvailablePages == MmLowMemoryThreshold) - { - /* Signal the low memory event */ - KeSetEvent(MiLowMemoryEvent, 0, FALSE); - } + /* Decrement number of available pages */ + MiDecrementAvailablePages();
/* Decrease transition page counter */ ASSERT(Pfn->u3.e1.PrototypePte == 1); /* Only supported ARM3 case */ MmTransitionSharedPages--; - - /* One less page */ - if (--MmAvailablePages < MmMinimumFreePages) - { - /* FIXME: Should wake up the MPW and working set manager, if we had one */ - DPRINT1("Running low on pages: %lu remaining\n", MmAvailablePages); - - /* Call RosMm and see if it can release any pages for us */ - MmRebalanceMemoryConsumers(); - } } else if (ListHead == &MmModifiedPageListHead) { @@ -442,28 +456,8 @@ /* ReactOS Hack */ Pfn1->OriginalPte.u.Long = 0;
- /* See if we hit any thresholds */ - if (MmAvailablePages == MmHighMemoryThreshold) - { - /* Clear the high memory event */ - KeClearEvent(MiHighMemoryEvent); - } - else if (MmAvailablePages == MmLowMemoryThreshold) - { - /* Signal the low memory event */ - KeSetEvent(MiLowMemoryEvent, 0, FALSE); - } - - /* One less page */ - if (--MmAvailablePages < MmMinimumFreePages) - { - /* FIXME: Should wake up the MPW and working set manager, if we had one */ - - DPRINT1("Running low on pages: %lu remaining\n", MmAvailablePages); - - /* Call RosMm and see if it can release any pages for us */ - MmRebalanceMemoryConsumers(); - } + /* Decrement number of available pages */ + MiDecrementAvailablePages();
#if MI_TRACE_PFNS //ASSERT(MI_PFN_CURRENT_USAGE != MI_USAGE_NOT_SET); @@ -664,20 +658,8 @@ Pfn1->u4.InPageError = 0; Pfn1->u4.AweAllocation = 0;
- /* Increase available pages */ - MmAvailablePages++; - - /* Check if we've reached the configured low memory threshold */ - if (MmAvailablePages == MmLowMemoryThreshold) - { - /* Clear the event, because now we're ABOVE the threshold */ - KeClearEvent(MiLowMemoryEvent); - } - else if (MmAvailablePages == MmHighMemoryThreshold) - { - /* Otherwise check if we reached the high threshold and signal the event */ - KeSetEvent(MiHighMemoryEvent, 0, FALSE); - } + /* Increment number of available pages */ + MiIncrementAvailablePages();
/* Get the page color */ Color = PageFrameIndex & MmSecondaryColorMask; @@ -779,20 +761,8 @@ /* Move the page onto its new location */ Pfn1->u3.e1.PageLocation = StandbyPageList;
- /* One more page on the system */ - MmAvailablePages++; - - /* Check if we've reached the configured low memory threshold */ - if (MmAvailablePages == MmLowMemoryThreshold) - { - /* Clear the event, because now we're ABOVE the threshold */ - KeClearEvent(MiLowMemoryEvent); - } - else if (MmAvailablePages == MmHighMemoryThreshold) - { - /* Otherwise check if we reached the high threshold and signal the event */ - KeSetEvent(MiHighMemoryEvent, 0, FALSE); - } + /* Increment number of available pages */ + MiIncrementAvailablePages(); }
VOID @@ -919,20 +889,8 @@ /* For zero/free pages, we also have to handle the colored lists */ if (ListName <= StandbyPageList) { - /* One more page on the system */ - MmAvailablePages++; - - /* Check if we've reached the configured low memory threshold */ - if (MmAvailablePages == MmLowMemoryThreshold) - { - /* Clear the event, because now we're ABOVE the threshold */ - KeClearEvent(MiLowMemoryEvent); - } - else if (MmAvailablePages == MmHighMemoryThreshold) - { - /* Otherwise check if we reached the high threshold and signal the event */ - KeSetEvent(MiHighMemoryEvent, 0, FALSE); - } + /* Increment number of available pages */ + MiIncrementAvailablePages();
/* Sanity checks */ ASSERT(ListName == ZeroedPageList); @@ -1160,54 +1118,6 @@ /* Release the lock and return success */ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); return STATUS_SUCCESS; -} - -PFN_NUMBER -NTAPI -MiAllocatePfn(IN PMMPTE PointerPte, - IN ULONG Protection) -{ - KIRQL OldIrql; - PFN_NUMBER PageFrameIndex; - MMPTE TempPte; - - /* Sanity check that we aren't passed a valid PTE */ - ASSERT(PointerPte->u.Hard.Valid == 0); - - /* Make an empty software PTE */ - MI_MAKE_SOFTWARE_PTE(&TempPte, MM_READWRITE); - - /* Lock the PFN database */ - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - - /* Check if we're running low on pages */ - if (MmAvailablePages < 128) - { - DPRINT1("Warning, running low on memory: %lu pages left\n", MmAvailablePages); - - //MiEnsureAvailablePageOrWait(NULL, OldIrql); - - /* Call RosMm and see if it can release any pages for us */ - MmRebalanceMemoryConsumers(); - } - - /* Grab a page */ - ASSERT_LIST_INVARIANT(&MmFreePageListHead); - ASSERT_LIST_INVARIANT(&MmZeroedPageListHead); - PageFrameIndex = MiRemoveAnyPage(MI_GET_NEXT_COLOR()); - - /* Write the software PTE */ - MI_WRITE_INVALID_PTE(PointerPte, TempPte); - PointerPte->u.Soft.Protection |= Protection; - - /* Initialize its PFN entry */ - MiInitializePfn(PageFrameIndex, PointerPte, TRUE); - - /* Release the PFN lock and return the page */ - ASSERT_LIST_INVARIANT(&MmFreePageListHead); - ASSERT_LIST_INVARIANT(&MmZeroedPageListHead); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - return PageFrameIndex; }
VOID
Modified: trunk/reactos/ntoskrnl/mm/ARM3/sysldr.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/sysldr.c?r... ============================================================================== --- trunk/reactos/ntoskrnl/mm/ARM3/sysldr.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/mm/ARM3/sysldr.c [iso-8859-1] Sat Oct 4 21:17:27 2014 @@ -99,6 +99,8 @@ PMMPTE PointerPte, LastPte; PVOID DriverBase; MMPTE TempPte; + KIRQL OldIrql; + PFN_NUMBER PageFrameIndex; PAGED_CODE();
/* Detect session load */ @@ -173,30 +175,45 @@ *ImageBase = DriverBase; DPRINT1("Loading: %wZ at %p with %lx pages\n", FileName, DriverBase, PteCount);
+ /* Lock the PFN database */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + /* Some debug stuff */ + MI_SET_USAGE(MI_USAGE_DRIVER_PAGE); +#if MI_TRACE_PFNS + PWCHAR pos = NULL; + ULONG len = 0; + if (FileName->Buffer) + { + pos = wcsrchr(FileName->Buffer, '\'); + len = wcslen(pos) * sizeof(WCHAR); + if (pos) snprintf(MI_PFN_CURRENT_PROCESS_NAME, min(16, len), "%S", pos); + } +#endif + /* Loop the new driver PTEs */ TempPte = ValidKernelPte; while (PointerPte < LastPte) { - /* Allocate a page */ - MI_SET_USAGE(MI_USAGE_DRIVER_PAGE); -#if MI_TRACE_PFNS - PWCHAR pos = NULL; - ULONG len = 0; - if (FileName->Buffer) - { - pos = wcsrchr(FileName->Buffer, '\'); - len = wcslen(pos) * sizeof(WCHAR); - if (pos) snprintf(MI_PFN_CURRENT_PROCESS_NAME, min(16, len), "%S", pos); - } -#endif - TempPte.u.Hard.PageFrameNumber = MiAllocatePfn(PointerPte, MM_EXECUTE); - - /* Write it */ + /* Make sure the PTE is not valid for whatever reason */ + ASSERT(PointerPte->u.Hard.Valid == 0); + + /* Grab a page */ + PageFrameIndex = MiRemoveAnyPage(MI_GET_NEXT_COLOR()); + + /* Initialize its PFN entry */ + MiInitializePfn(PageFrameIndex, PointerPte, TRUE); + + /* Write the PTE */ + TempPte.u.Hard.PageFrameNumber = PageFrameIndex; MI_WRITE_VALID_PTE(PointerPte, TempPte);
/* Move on */ PointerPte++; } + + /* Release the PFN lock */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
/* Copy the image */ RtlCopyMemory(DriverBase, Base, PteCount << PAGE_SHIFT);