mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 01:55:19 +00:00
[NTOS:Mm] Fail gracefully when no pages are available
This commit is contained in:
parent
d7de53b6d5
commit
3ae12d5a8c
3 changed files with 18 additions and 8 deletions
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue