https://git.reactos.org/?p=reactos.git;a=commitdiff;h=d7de53b6d585a1048902b0...
commit d7de53b6d585a1048902b0376a16f85d8ebee114 Author: Timo Kreuzer timo.kreuzer@reactos.org AuthorDate: Sat Apr 8 19:27:15 2023 +0300 Commit: Timo Kreuzer timo.kreuzer@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)