https://git.reactos.org/?p=reactos.git;a=commitdiff;h=d7de53b6d585a1048902b…
commit d7de53b6d585a1048902b0376a16f85d8ebee114
Author: Timo Kreuzer <timo.kreuzer(a)reactos.org>
AuthorDate: Sat Apr 8 19:27:15 2023 +0300
Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org>
CommitDate: Sat Jul 29 14:00:44 2023 +0300
[NTOS:Mm] Bail out in MmTrimUserMemory, when all LRU pages have been looped through
---
ntoskrnl/mm/balance.c | 26 +++++++++++++++++++++++---
1 file changed, 23 insertions(+), 3 deletions(-)
diff --git a/ntoskrnl/mm/balance.c b/ntoskrnl/mm/balance.c
index 0c9d34ce54f..a8c9e4c6482 100644
--- a/ntoskrnl/mm/balance.c
+++ b/ntoskrnl/mm/balance.c
@@ -138,14 +138,15 @@ MiTrimMemoryConsumer(ULONG Consumer, ULONG InitialTarget)
NTSTATUS
MmTrimUserMemory(ULONG Target, ULONG Priority, PULONG NrFreedPages)
{
- PFN_NUMBER CurrentPage;
+ PFN_NUMBER FirstPage, CurrentPage;
NTSTATUS Status;
(*NrFreedPages) = 0;
DPRINT1("MM BALANCER: %s\n", Priority ? "Paging out!" :
"Removing access bit!");
- CurrentPage = MmGetLRUFirstUserPage();
+ FirstPage = MmGetLRUFirstUserPage();
+ CurrentPage = FirstPage;
while (CurrentPage != 0 && Target > 0)
{
if (Priority)
@@ -156,6 +157,10 @@ MmTrimUserMemory(ULONG Target, ULONG Priority, PULONG NrFreedPages)
DPRINT("Succeeded\n");
Target--;
(*NrFreedPages)++;
+ if (CurrentPage == FirstPage)
+ {
+ FirstPage = 0;
+ }
}
}
else
@@ -245,8 +250,14 @@ MmTrimUserMemory(ULONG Target, ULONG Priority, PULONG NrFreedPages)
/* Nobody accessed this page since the last time we check. Time to clean
up */
Status = MmPageOutPhysicalAddress(CurrentPage);
+ if (NT_SUCCESS(Status))
+ {
+ if (CurrentPage == FirstPage)
+ {
+ FirstPage = 0;
+ }
+ }
// DPRINT1("Paged-out one page: %s\n", NT_SUCCESS(Status) ?
"Yes" : "No");
- (void)Status;
}
/* Done for this page. */
@@ -254,6 +265,15 @@ MmTrimUserMemory(ULONG Target, ULONG Priority, PULONG NrFreedPages)
}
CurrentPage = MmGetLRUNextUserPage(CurrentPage, TRUE);
+ if (FirstPage == 0)
+ {
+ FirstPage = CurrentPage;
+ }
+ else if (CurrentPage == FirstPage)
+ {
+ DPRINT1("We are back at the start, abort!\n");
+ return STATUS_SUCCESS;
+ }
}
if (CurrentPage)