[ros-diffs] [arty] 56024: [NEWCC] Fix paging out. - We know we're in a wait entry in the section. What we really want to know is if it's safe to evict this address space when withdrawing the mappings. - We don...

arty at svn.reactos.org arty at svn.reactos.org
Mon Mar 5 02:20:22 UTC 2012


Author: arty
Date: Mon Mar  5 02:20:22 2012
New Revision: 56024

URL: http://svn.reactos.org/svn/reactos?rev=56024&view=rev
Log:
[NEWCC]
Fix paging out.
- We know we're in a wait entry in the section.  What we really want to know
is if it's safe to evict this address space when withdrawing the mappings.
- We don't want to corrupt our wait entry in the section page table to keep
accumulating dirty state into the page out process until it's time to finally
evict.

Modified:
    trunk/reactos/ntoskrnl/cache/section/swapout.c

Modified: trunk/reactos/ntoskrnl/cache/section/swapout.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cache/section/swapout.c?rev=56024&r1=56023&r2=56024&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/cache/section/swapout.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/cache/section/swapout.c [iso-8859-1] Mon Mar  5 02:20:22 2012
@@ -184,7 +184,7 @@
 (PMMSUPPORT AddressSpace,
  MEMORY_AREA* MemoryArea,
  PVOID Address,
- BOOLEAN Dirty,
+ PBOOLEAN Dirty,
  PMM_REQUIRED_RESOURCES Required)
 {
 	ULONG Entry;
@@ -204,19 +204,16 @@
 
 	Entry = MmGetPageEntrySectionSegment(Segment, &TotalOffset);
 
-	if (MM_IS_WAIT_PTE(Entry))
-	{
+	if (MmIsPageSwapEntry(Process, PAddress))
+	{
+        SWAPENTRY SwapEntry;
+        MmGetPageFileMapping(Process, PAddress, &SwapEntry);
 		MmUnlockSectionSegment(Segment);
-		return STATUS_SUCCESS + 1;
-	}
-
-	if (Dirty) {
-        DPRINT("Dirty page: %p:%p segment %p offset %08x%08x\n", Process, Address, Segment, TotalOffset.HighPart, TotalOffset.LowPart);
-		MmSetPageEntrySectionSegment(Segment, &TotalOffset, DIRTY_SSE(Entry));
-    }
+		return SwapEntry == MM_WAIT_ENTRY ? STATUS_SUCCESS + 1 : STATUS_UNSUCCESSFUL;
+	}
 
     MmDeleteRmap(Required->Page[0], Process, Address);
-    MmDeleteVirtualMapping(Process, Address, FALSE, NULL, &OurPage);
+    MmDeleteVirtualMapping(Process, Address, FALSE, Dirty, &OurPage);
     ASSERT(OurPage == Required->Page[0]);
 
 	MmReleasePageMemoryConsumer(MC_CACHE, Required->Page[0]);
@@ -230,7 +227,7 @@
 NTAPI
 MmpPageOutPhysicalAddress(PFN_NUMBER Page)
 {
-   BOOLEAN ProcRef = FALSE;
+   BOOLEAN ProcRef = FALSE, PageDirty;
    PFN_NUMBER SectionPage = 0;
    PMM_RMAP_ENTRY entry;
    PMM_SECTION_SEGMENT Segment = NULL;
@@ -357,8 +354,10 @@
 		   ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
 
 		   DPRINT("%x:%x, page %x %x\n", Process, Address, Page, Resources.Page[0]);
+           PageDirty = FALSE;
 		   Status = MmPageOutCacheSection
-			   (AddressSpace, MemoryArea, Address, Dirty, &Resources);
+			   (AddressSpace, MemoryArea, Address, &PageDirty, &Resources);
+           Dirty |= PageDirty;
 		   DPRINT("%x\n", Status);
 		   
 		   ASSERT(KeGetCurrentIrql() <= APC_LEVEL);




More information about the Ros-diffs mailing list