Author: amunger Date: Thu Mar 13 10:26:17 2008 New Revision: 32673
URL: http://svn.reactos.org/svn/reactos?rev=3D32673&view=3Drev Log: Simplify and rename the functions that touch UserPageListHead. They were confusingly coded to accept any flavor of PFN_TYPE, which resulte= d in at least one bug. Constrained the calls to the MmRequest/ReleasePageMemoryConsumer and MmTrim= UserMemory.
Modified: trunk/reactos/ntoskrnl/include/internal/mm.h trunk/reactos/ntoskrnl/mm/balance.c trunk/reactos/ntoskrnl/mm/freelist.c trunk/reactos/ntoskrnl/mm/wset.c
Modified: trunk/reactos/ntoskrnl/include/internal/mm.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/inte= rnal/mm.h?rev=3D32673&r1=3D32672&r2=3D32673&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/reactos/ntoskrnl/include/internal/mm.h (original) +++ trunk/reactos/ntoskrnl/include/internal/mm.h Thu Mar 13 10:26:17 2008 @@ -1025,7 +1025,11 @@ =
VOID NTAPI -MmSetLRULastPage(PFN_TYPE Page); +MmInsertLRULastUserPage(PFN_TYPE Page); + +VOID +NTAPI +MmRemoveLRUUserPage(PFN_TYPE Page); =
VOID NTAPI
Modified: trunk/reactos/ntoskrnl/mm/balance.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/balance.c= ?rev=3D32673&r1=3D32672&r2=3D32673&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/reactos/ntoskrnl/mm/balance.c (original) +++ trunk/reactos/ntoskrnl/mm/balance.c Thu Mar 13 10:26:17 2008 @@ -114,6 +114,7 @@ Entry =3D RemoveHeadList(&AllocationListHead); Request =3D CONTAINING_RECORD(Entry, MM_ALLOCATION_REQUEST, ListE= ntry); KeReleaseSpinLock(&AllocationListLock, oldIrql); + if(Consumer =3D=3D MC_USER) MmRemoveLRUUserPage(Page); Request->Page =3D Page; KeSetEvent(&Request->Event, IO_NO_INCREMENT, FALSE); } @@ -121,6 +122,7 @@ else { KeReleaseSpinLock(&AllocationListLock, oldIrql); + if(Consumer =3D=3D MC_USER) MmRemoveLRUUserPage(Page); MmDereferencePage(Page); } =
@@ -262,7 +264,9 @@ { KEBUGCHECK(NO_PAGES_AVAILABLE); } - MmSetLRULastPage(Page); + /* Update the Consumer */ + MiGetPfnEntry(Page)->Flags.Consumer =3D Consumer; + if(Consumer =3D=3D MC_USER) MmInsertLRULastUserPage(Page); *AllocatedPage =3D Page; (void)InterlockedDecrementUL(&MiPagesRequired); return(STATUS_SUCCESS); @@ -276,6 +280,7 @@ { KEBUGCHECK(NO_PAGES_AVAILABLE); } + if(Consumer =3D=3D MC_USER) MmInsertLRULastUserPage(Page); *AllocatedPage =3D Page; =
return(STATUS_SUCCESS);
Modified: trunk/reactos/ntoskrnl/mm/freelist.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/freelist.= c?rev=3D32673&r1=3D32672&r2=3D32673&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/reactos/ntoskrnl/mm/freelist.c (original) +++ trunk/reactos/ntoskrnl/mm/freelist.c Thu Mar 13 10:26:17 2008 @@ -31,8 +31,12 @@ ULONG MmPageArraySize; =
static KSPIN_LOCK PageListLock; +/* List of pages allocated to the MC_USER Consumer */ static LIST_ENTRY UserPageListHead; +/* List of pages zeroed by the ZPW (MmZeroPageThreadMain) */ static LIST_ENTRY FreeZeroedPageListHead; +/* List of free pages, filled by MmGetReferenceCountPage and + * and MmInitializePageList */ static LIST_ENTRY FreeUnzeroedPageListHead; =
static KEVENT ZeroPageThreadEvent; @@ -65,19 +69,16 @@ =
VOID NTAPI -MmSetLRULastPage(PFN_TYPE Pfn) +MmInsertLRULastUserPage(PFN_TYPE Pfn) { KIRQL oldIrql; PPHYSICAL_PAGE Page; =
KeAcquireSpinLock(&PageListLock, &oldIrql); Page =3D MiGetPfnEntry(Pfn); - if (Page->Flags.Type =3D=3D MM_PHYSICAL_PAGE_USED && - Page->Flags.Consumer =3D=3D MC_USER) - { - RemoveEntryList(&Page->ListEntry); - InsertTailList(&UserPageListHead, &Page->ListEntry); - } + ASSERT(Page->Flags.Type =3D=3D MM_PHYSICAL_PAGE_USED); + ASSERT(Page->Flags.Consumer =3D=3D MC_USER); + InsertTailList(&UserPageListHead, &Page->ListEntry); KeReleaseSpinLock(&PageListLock, oldIrql); } =
@@ -92,15 +93,9 @@ =
KeAcquireSpinLock(&PageListLock, &oldIrql); Page =3D MiGetPfnEntry(PreviousPfn); - if (Page->Flags.Type !=3D MM_PHYSICAL_PAGE_USED || - Page->Flags.Consumer !=3D MC_USER) - { - NextListEntry =3D UserPageListHead.Flink; - } - else - { - NextListEntry =3D Page->ListEntry.Flink; - } + ASSERT(Page->Flags.Type =3D=3D MM_PHYSICAL_PAGE_USED); + ASSERT(Page->Flags.Consumer =3D=3D MC_USER); + NextListEntry =3D Page->ListEntry.Flink; if (NextListEntry =3D=3D &UserPageListHead) { KeReleaseSpinLock(&PageListLock, oldIrql); @@ -109,6 +104,13 @@ PageDescriptor =3D CONTAINING_RECORD(NextListEntry, PHYSICAL_PAGE, List= Entry); KeReleaseSpinLock(&PageListLock, oldIrql); return PageDescriptor - MmPageArray; +} + +VOID +NTAPI +MmRemoveLRUUserPage(PFN_TYPE Page) +{ + RemoveEntryList(&MiGetPfnEntry(Page)->ListEntry); } =
PFN_TYPE @@ -782,7 +784,6 @@ KeReleaseSpinLock(&PageListLock, oldIrql); =
PfnOffset =3D PageDescriptor - MmPageArray; - MmSetLRULastPage(PfnOffset); if (NeedClear) { MiZeroPage(PfnOffset); @@ -882,7 +883,7 @@ /* Remember the page */ pfn =3D PageDescriptor - MmPageArray; Pages[NumberOfPagesFound++] =3D pfn; - MmSetLRULastPage(pfn); + if(Consumer =3D=3D MC_USER) MmInsertLRULastUserPage(pfn); } } else @@ -917,7 +918,6 @@ =
/* Remember the page */ Pages[NumberOfPagesFound++] =3D pfn; - MmSetLRULastPage(pfn); if (NumberOfPagesFound =3D=3D NumberOfPages) break; }
Modified: trunk/reactos/ntoskrnl/mm/wset.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/wset.c?re= v=3D32673&r1=3D32672&r2=3D32673&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/reactos/ntoskrnl/mm/wset.c (original) +++ trunk/reactos/ntoskrnl/mm/wset.c Thu Mar 13 10:26:17 2008 @@ -38,7 +38,8 @@ } else if (Status =3D=3D STATUS_PAGEFILE_QUOTA) { - MmSetLRULastPage(CurrentPage); + MmRemoveLRUUserPage(CurrentPage); + MmInsertLRULastUserPage(CurrentPage); } =
CurrentPage =3D NextPage;