https://git.reactos.org/?p=reactos.git;a=commitdiff;h=3ae12d5a8c4f975a3ce0b…
commit 3ae12d5a8c4f975a3ce0be1158a0b0cf02757970
Author: Timo Kreuzer <timo.kreuzer(a)reactos.org>
AuthorDate: Sun Apr 2 18:35:30 2023 +0300
Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org>
CommitDate: Sat Jul 29 14:00:44 2023 +0300
[NTOS:Mm] Fail gracefully when no pages are available
---
ntoskrnl/mm/ARM3/pfnlist.c | 12 ++++++++++--
ntoskrnl/mm/balance.c | 11 ++++++-----
ntoskrnl/mm/freelist.c | 3 ++-
3 files changed, 18 insertions(+), 8 deletions(-)
diff --git a/ntoskrnl/mm/ARM3/pfnlist.c b/ntoskrnl/mm/ARM3/pfnlist.c
index 56654d1e113..cf7871f2023 100644
--- a/ntoskrnl/mm/ARM3/pfnlist.c
+++ b/ntoskrnl/mm/ARM3/pfnlist.c
@@ -481,8 +481,11 @@ MiRemoveAnyPage(IN ULONG Color)
/* Make sure PFN lock is held and we have pages */
MI_ASSERT_PFN_LOCK_HELD();
- ASSERT(MmAvailablePages != 0);
ASSERT(Color < MmSecondaryColors);
+ if (MmAvailablePages == 0)
+ {
+ return 0;
+ }
/* Check the colored free list */
PageIndex = MmFreePagesByColor[FreePageList][Color].Flink;
@@ -514,6 +517,7 @@ MiRemoveAnyPage(IN ULONG Color)
/* Remove the page from its list */
PageIndex = MiRemovePageByColor(PageIndex, Color);
+ ASSERT(PageIndex != 0);
/* Sanity checks */
Pfn1 = MI_PFN_ELEMENT(PageIndex);
@@ -538,8 +542,11 @@ MiRemoveZeroPage(IN ULONG Color)
/* Make sure PFN lock is held and we have pages */
MI_ASSERT_PFN_LOCK_HELD();
- ASSERT(MmAvailablePages != 0);
ASSERT(Color < MmSecondaryColors);
+ if (MmAvailablePages == 0)
+ {
+ return 0;
+ }
/* Check the colored zero list */
PageIndex = MmFreePagesByColor[ZeroedPageList][Color].Flink;
@@ -583,6 +590,7 @@ MiRemoveZeroPage(IN ULONG Color)
/* Remove the page from its list */
PageIndex = MiRemovePageByColor(PageIndex, Color);
+ ASSERT(PageIndex != 0);
ASSERT(Pfn1 == MI_PFN_ELEMENT(PageIndex));
/* Zero it, if needed */
diff --git a/ntoskrnl/mm/balance.c b/ntoskrnl/mm/balance.c
index a8c9e4c6482..f81027a65cd 100644
--- a/ntoskrnl/mm/balance.c
+++ b/ntoskrnl/mm/balance.c
@@ -303,20 +303,21 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait,
{
PFN_NUMBER Page;
- /* Update the target */
- InterlockedIncrementUL(&MiMemoryConsumers[Consumer].PagesUsed);
- UpdateTotalCommittedPages(1);
-
/*
* Actually allocate the page.
*/
Page = MmAllocPage(Consumer);
if (Page == 0)
{
- KeBugCheck(NO_PAGES_AVAILABLE);
+ *AllocatedPage = 0;
+ return STATUS_NO_MEMORY;
}
*AllocatedPage = Page;
+ /* Update the target */
+ InterlockedIncrementUL(&MiMemoryConsumers[Consumer].PagesUsed);
+ UpdateTotalCommittedPages(1);
+
return(STATUS_SUCCESS);
}
diff --git a/ntoskrnl/mm/freelist.c b/ntoskrnl/mm/freelist.c
index e3b2f30f9fa..95d73eb3cd4 100644
--- a/ntoskrnl/mm/freelist.c
+++ b/ntoskrnl/mm/freelist.c
@@ -623,7 +623,8 @@ MmAllocPage(ULONG Type)
PfnOffset = MiRemoveZeroPage(MI_GET_NEXT_COLOR());
if (!PfnOffset)
{
- KeBugCheck(NO_PAGES_AVAILABLE);
+ MiReleasePfnLock(OldIrql);
+ return 0;
}
DPRINT("Legacy allocate: %lx\n", PfnOffset);