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.
This commit is contained in:
Augustin Cavalier
2024-10-17 13:42:04 -04:00
parent b3731f13ab
commit 9c0dced16e
+25 -12
View File
@@ -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;
}