mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-02 12:23:31 +00:00
[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:
+4
@@ -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)
|
||||
{
|
||||
|
||||
+9
-11
@@ -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))
|
||||
|
||||
+8
-6
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user