From 72a7d2223374e301ae5844566b8602aee9bf990e Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 28 Feb 2012 09:30:53 +0000 Subject: [PATCH] [NTOSKRNL] - Fix PDE reference counting - Now only the recursive fault remains as an issue in the page out path svn path=/trunk/; revision=55898 --- reactos/ntoskrnl/cache/section/data.c | 4 ++++ reactos/ntoskrnl/cache/section/fault.c | 20 +++++++++----------- reactos/ntoskrnl/cache/section/swapout.c | 14 ++++++++------ 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/reactos/ntoskrnl/cache/section/data.c b/reactos/ntoskrnl/cache/section/data.c index 91c63e03405..1f93eec494d 100644 --- a/reactos/ntoskrnl/cache/section/data.c +++ b/reactos/ntoskrnl/cache/section/data.c @@ -676,6 +676,10 @@ MmFreeCacheSectionPage MmDeleteRmap(Page, Process, Address); MmDeleteVirtualMapping(Process, Address, FALSE, NULL, NULL); MmReleasePageMemoryConsumer(MC_CACHE, Page); +#if (_MI_PAGING_LEVELS == 2) + if (Address < MmSystemRangeStart) + Process->Vm.VmWorkingSetList->UsedPageTableEntries[MiGetPdeOffset(Address)]--; +#endif } if (SwapEntry != 0) { diff --git a/reactos/ntoskrnl/cache/section/fault.c b/reactos/ntoskrnl/cache/section/fault.c index 583714e317b..c9b24238515 100644 --- a/reactos/ntoskrnl/cache/section/fault.c +++ b/reactos/ntoskrnl/cache/section/fault.c @@ -143,13 +143,12 @@ MmNotPresentFaultCachePage DPRINT("Set %x in address space @ %x\n", Required->Page[0], Address); Status = MmCreateVirtualMapping(Process, Address, Attributes, Required->Page, 1); #if (_MI_PAGING_LEVELS == 2) - /* Reference Page Directory Entry */ - if(Address < MmSystemRangeStart) - { - MmWorkingSetList->UsedPageTableEntries[MiGetPdeOffset(Address)]++; - ASSERT(MmWorkingSetList->UsedPageTableEntries[MiGetPdeOffset(Address)] <= PTE_COUNT); + if (Address < MmSystemRangeStart) + { + Process->Vm.VmWorkingSetList->UsedPageTableEntries[MiGetPdeOffset(Address)]++; + ASSERT(Process->Vm.VmWorkingSetList->UsedPageTableEntries[MiGetPdeOffset(Address)] <= PTE_COUNT); } -#endif +#endif if (NT_SUCCESS(Status)) { MmInsertRmap(Required->Page[0], Process, Address); @@ -175,11 +174,10 @@ MmNotPresentFaultCachePage Status = MmCreateVirtualMapping(Process, Address, Attributes, &Page, 1); #if (_MI_PAGING_LEVELS == 2) - /* Reference Page Directory Entry */ - if(Address < MmSystemRangeStart) - { - MmWorkingSetList->UsedPageTableEntries[MiGetPdeOffset(Address)]++; - ASSERT(MmWorkingSetList->UsedPageTableEntries[MiGetPdeOffset(Address)] <= PTE_COUNT); + if (Address < MmSystemRangeStart) + { + Process->Vm.VmWorkingSetList->UsedPageTableEntries[MiGetPdeOffset(Address)]++; + ASSERT(Process->Vm.VmWorkingSetList->UsedPageTableEntries[MiGetPdeOffset(Address)] <= PTE_COUNT); } #endif if (NT_SUCCESS(Status)) diff --git a/reactos/ntoskrnl/cache/section/swapout.c b/reactos/ntoskrnl/cache/section/swapout.c index daea8a81296..8e236cbda09 100644 --- a/reactos/ntoskrnl/cache/section/swapout.c +++ b/reactos/ntoskrnl/cache/section/swapout.c @@ -54,6 +54,7 @@ extern KEVENT MmWaitPageEvent; extern FAST_MUTEX RmapListLock; +extern PMMWSL MmWorkingSetList; FAST_MUTEX MiGlobalPageOperation; @@ -186,7 +187,6 @@ MmPageOutCacheSection BOOLEAN Dirty, PMM_REQUIRED_RESOURCES Required) { - NTSTATUS Status = STATUS_SUCCESS; ULONG Entry; PFN_NUMBER OurPage; PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace); @@ -213,14 +213,16 @@ MmPageOutCacheSection MmDeleteVirtualMapping(Process, Address, FALSE, NULL, &OurPage); ASSERT(OurPage == Required->Page[0]); - if (NT_SUCCESS(Status)) - { - MmReleasePageMemoryConsumer(MC_CACHE, Required->Page[0]); - } + MmReleasePageMemoryConsumer(MC_CACHE, Required->Page[0]); + +#if (_MI_PAGING_LEVELS == 2) + if (Address < MmSystemRangeStart) + Process->Vm.VmWorkingSetList->UsedPageTableEntries[MiGetPdeOffset(Address)]--; +#endif MmUnlockSectionSegment(Segment); MiSetPageEvent(Process, Address); - return Status; + return STATUS_SUCCESS; } NTSTATUS