[NTOSKRNL]

- Fix PDE reference counting
- Now only the recursive fault remains as an issue in the page out path

svn path=/trunk/; revision=55898
This commit is contained in:
Cameron Gutman 2012-02-28 09:30:53 +00:00
parent 24264b8dc2
commit 72a7d22233
3 changed files with 21 additions and 17 deletions

View file

@ -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)
{

View file

@ -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))

View file

@ -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