From 2d22f6f372e6ac044af2d83d4854cc478d30226c Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 8 Oct 2014 00:30:50 +0000 Subject: [PATCH] [NTOSKRNL] Move acquisition of PFN lock into MmAllocPage and MmDereferencePage svn path=/trunk/; revision=64586 --- reactos/ntoskrnl/mm/balance.c | 10 ---------- reactos/ntoskrnl/mm/freelist.c | 13 ++++++++++--- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/reactos/ntoskrnl/mm/balance.c b/reactos/ntoskrnl/mm/balance.c index 7e1a3fb5650..dd945110c85 100644 --- a/reactos/ntoskrnl/mm/balance.c +++ b/reactos/ntoskrnl/mm/balance.c @@ -98,7 +98,6 @@ MmReleasePageMemoryConsumer(ULONG Consumer, PFN_NUMBER Page) { PMM_ALLOCATION_REQUEST Request; PLIST_ENTRY Entry; - KIRQL OldIrql; if (Page == 0) { @@ -112,9 +111,7 @@ MmReleasePageMemoryConsumer(ULONG Consumer, PFN_NUMBER Page) (void)InterlockedDecrementUL(&MiMemoryConsumers[Consumer].PagesUsed); if ((Entry = ExInterlockedRemoveHeadList(&AllocationListHead, &AllocationListLock)) == NULL) { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); MmDereferencePage(Page); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); } else { @@ -126,9 +123,7 @@ MmReleasePageMemoryConsumer(ULONG Consumer, PFN_NUMBER Page) } else { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); MmDereferencePage(Page); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); } return(STATUS_SUCCESS); @@ -259,7 +254,6 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait, { ULONG PagesUsed; PFN_NUMBER Page; - KIRQL OldIrql; /* * Make sure we don't exceed our individual target. @@ -276,9 +270,7 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait, */ if ((Consumer == MC_SYSTEM) || MiIsBalancerThread()) { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); Page = MmAllocPage(Consumer); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); if (Page == 0) { KeBugCheck(NO_PAGES_AVAILABLE); @@ -337,9 +329,7 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait, /* * Actually allocate the page. */ - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); Page = MmAllocPage(Consumer); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); if (Page == 0) { KeBugCheck(NO_PAGES_AVAILABLE); diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c index 568ba1343bf..00120541c18 100644 --- a/reactos/ntoskrnl/mm/freelist.c +++ b/reactos/ntoskrnl/mm/freelist.c @@ -532,8 +532,11 @@ NTAPI MmDereferencePage(PFN_NUMBER Pfn) { PMMPFN Pfn1; + KIRQL OldIrql; DPRINT("MmDereferencePage(PhysicalAddress %x)\n", Pfn << PAGE_SHIFT); + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + Pfn1 = MiGetPfnEntry(Pfn); ASSERT(Pfn1); ASSERT_IS_ROS_PFN(Pfn1); @@ -552,6 +555,8 @@ MmDereferencePage(PFN_NUMBER Pfn) DPRINT("Legacy free: %lx\n", Pfn); MiInsertPageInFreeList(Pfn); } + + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); } PFN_NUMBER @@ -560,13 +565,14 @@ MmAllocPage(ULONG Type) { PFN_NUMBER PfnOffset; PMMPFN Pfn1; + KIRQL OldIrql; + + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); PfnOffset = MiRemoveZeroPage(MI_GET_NEXT_COLOR()); - if (!PfnOffset) { - DPRINT1("MmAllocPage(): Out of memory\n"); - return 0; + KeBugCheck(NO_PAGES_AVAILABLE); } DPRINT("Legacy allocate: %lx\n", PfnOffset); @@ -581,6 +587,7 @@ MmAllocPage(ULONG Type) Pfn1->u1.SwapEntry = 0; Pfn1->RmapListHead = NULL; + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); return PfnOffset; }