From d78bbd2aab3c4b97c2feb04a21b4ea1a6f4bb50d Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 5 Mar 2012 19:40:44 +0000 Subject: [PATCH] [NTOSKRNL] - Fix incorrect placement of the PDE freeing code which caused a deadlock to occur if a low memory condition was indicated by ARM3 svn path=/trunk/; revision=56050 --- reactos/ntoskrnl/mm/balance.c | 55 +++++++++++++++++------------------ 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/reactos/ntoskrnl/mm/balance.c b/reactos/ntoskrnl/mm/balance.c index 829b12311cc..dc55185f8c4 100644 --- a/reactos/ntoskrnl/mm/balance.c +++ b/reactos/ntoskrnl/mm/balance.c @@ -245,33 +245,6 @@ VOID NTAPI MmRebalanceMemoryConsumers(VOID) { -#if (_MI_PAGING_LEVELS == 2) - if(!MiIsBalancerThread()) - { - /* Clean up the unused PDEs */ - ULONG_PTR Address; - PEPROCESS Process = PsGetCurrentProcess(); - - /* Acquire PFN lock */ - KIRQL OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - PMMPDE pointerPde; - for(Address = (ULONG_PTR)MI_LOWEST_VAD_ADDRESS; - Address < (ULONG_PTR)MM_HIGHEST_VAD_ADDRESS; - Address += (PAGE_SIZE * PTE_COUNT)) - { - if(MmWorkingSetList->UsedPageTableEntries[MiGetPdeOffset(Address)] == 0) - { - pointerPde = MiAddressToPde(Address); - if(pointerPde->u.Hard.Valid) - MiDeletePte(pointerPde, MiPdeToPte(pointerPde), Process, NULL); - ASSERT(pointerPde->u.Hard.Valid == 0); - } - } - /* Release lock */ - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } -#endif - if (MiBalancerThreadHandle != NULL && !MiIsBalancerThread()) { @@ -405,8 +378,34 @@ MiBalancerThread(PVOID Unused) if (Status == STATUS_WAIT_0 || Status == STATUS_WAIT_1) { - ULONG InitialTarget = 0; + ULONG InitialTarget = 0; +#if (_MI_PAGING_LEVELS == 2) + if(!MiIsBalancerThread()) + { + /* Clean up the unused PDEs */ + ULONG_PTR Address; + PEPROCESS Process = PsGetCurrentProcess(); + + /* Acquire PFN lock */ + KIRQL OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + PMMPDE pointerPde; + for(Address = (ULONG_PTR)MI_LOWEST_VAD_ADDRESS; + Address < (ULONG_PTR)MM_HIGHEST_VAD_ADDRESS; + Address += (PAGE_SIZE * PTE_COUNT)) + { + if(MmWorkingSetList->UsedPageTableEntries[MiGetPdeOffset(Address)] == 0) + { + pointerPde = MiAddressToPde(Address); + if(pointerPde->u.Hard.Valid) + MiDeletePte(pointerPde, MiPdeToPte(pointerPde), Process, NULL); + ASSERT(pointerPde->u.Hard.Valid == 0); + } + } + /* Release lock */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + } +#endif do { ULONG OldTarget = InitialTarget;