From 9c0dced16e23c2a8e8642d6a597f8cf2fc700531 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Thu, 17 Oct 2024 13:42:04 -0400 Subject: [PATCH] kernel/low_resource_manager: Don't decrease the low-resource state in low_resource(). This facility is used by the kernel to notify the low_resource manager that it failed to allocate something. But if we are in (e.g.) CRITICAL low-resource state and this method is used to notify that a large allocation failed, we would previously revert to NOTE state, while we should stay at CRITICAL. --- src/system/kernel/low_resource_manager.cpp | 37 +++++++++++++++------- 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/src/system/kernel/low_resource_manager.cpp b/src/system/kernel/low_resource_manager.cpp index dba29e873c..f0c06642ce 100644 --- a/src/system/kernel/low_resource_manager.cpp +++ b/src/system/kernel/low_resource_manager.cpp @@ -330,43 +330,56 @@ dump_handlers(int argc, char** argv) void low_resource(uint32 resource, uint64 requirements, uint32 flags, uint32 timeout) { + int32 newState = B_NO_LOW_RESOURCE; switch (resource) { case B_KERNEL_RESOURCE_PAGES: if (requirements <= kCriticalPagesLimit) - sLowPagesState = B_LOW_RESOURCE_CRITICAL; + newState = B_LOW_RESOURCE_CRITICAL; else if (requirements <= kWarnPagesLimit) - sLowPagesState = B_LOW_RESOURCE_WARNING; + newState = B_LOW_RESOURCE_WARNING; else - sLowPagesState = B_LOW_RESOURCE_NOTE; + newState = B_LOW_RESOURCE_NOTE; + + if (sLowPagesState < newState) + sLowPagesState = newState; break; case B_KERNEL_RESOURCE_MEMORY: { const off_t required = requirements; if (required <= sCriticalMemoryLimit) - sLowMemoryState = B_LOW_RESOURCE_CRITICAL; + newState = B_LOW_RESOURCE_CRITICAL; else if (required <= sWarnMemoryLimit) - sLowMemoryState = B_LOW_RESOURCE_WARNING; + newState = B_LOW_RESOURCE_WARNING; else - sLowMemoryState = B_LOW_RESOURCE_NOTE; + newState = B_LOW_RESOURCE_NOTE; + + if (sLowMemoryState < newState) + sLowMemoryState = newState; break; } case B_KERNEL_RESOURCE_SEMAPHORES: if (requirements <= 4) - sLowSemaphoresState = B_LOW_RESOURCE_CRITICAL; + newState = B_LOW_RESOURCE_CRITICAL; else if (requirements <= 32) - sLowSemaphoresState = B_LOW_RESOURCE_WARNING; + newState = B_LOW_RESOURCE_WARNING; else - sLowSemaphoresState = B_LOW_RESOURCE_NOTE; + newState = B_LOW_RESOURCE_NOTE; + + if (sLowSemaphoresState < newState) + sLowSemaphoresState = newState; break; case B_KERNEL_RESOURCE_ADDRESS_SPACE: if (requirements <= (kCriticalPagesLimit * B_PAGE_SIZE)) - sLowSpaceState = B_LOW_RESOURCE_CRITICAL; + newState = B_LOW_RESOURCE_CRITICAL; else if (requirements <= (kWarnPagesLimit * B_PAGE_SIZE)) - sLowSpaceState = B_LOW_RESOURCE_WARNING; + newState = B_LOW_RESOURCE_WARNING; else - sLowSpaceState = B_LOW_RESOURCE_NOTE; + newState = B_LOW_RESOURCE_NOTE; + + if (sLowSpaceState < newState) + sLowSpaceState = newState; break; }