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:
@@ -330,43 +330,56 @@ dump_handlers(int argc, char** argv)
|
|||||||
void
|
void
|
||||||
low_resource(uint32 resource, uint64 requirements, uint32 flags, uint32 timeout)
|
low_resource(uint32 resource, uint64 requirements, uint32 flags, uint32 timeout)
|
||||||
{
|
{
|
||||||
|
int32 newState = B_NO_LOW_RESOURCE;
|
||||||
switch (resource) {
|
switch (resource) {
|
||||||
case B_KERNEL_RESOURCE_PAGES:
|
case B_KERNEL_RESOURCE_PAGES:
|
||||||
if (requirements <= kCriticalPagesLimit)
|
if (requirements <= kCriticalPagesLimit)
|
||||||
sLowPagesState = B_LOW_RESOURCE_CRITICAL;
|
newState = B_LOW_RESOURCE_CRITICAL;
|
||||||
else if (requirements <= kWarnPagesLimit)
|
else if (requirements <= kWarnPagesLimit)
|
||||||
sLowPagesState = B_LOW_RESOURCE_WARNING;
|
newState = B_LOW_RESOURCE_WARNING;
|
||||||
else
|
else
|
||||||
sLowPagesState = B_LOW_RESOURCE_NOTE;
|
newState = B_LOW_RESOURCE_NOTE;
|
||||||
|
|
||||||
|
if (sLowPagesState < newState)
|
||||||
|
sLowPagesState = newState;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case B_KERNEL_RESOURCE_MEMORY: {
|
case B_KERNEL_RESOURCE_MEMORY: {
|
||||||
const off_t required = requirements;
|
const off_t required = requirements;
|
||||||
if (required <= sCriticalMemoryLimit)
|
if (required <= sCriticalMemoryLimit)
|
||||||
sLowMemoryState = B_LOW_RESOURCE_CRITICAL;
|
newState = B_LOW_RESOURCE_CRITICAL;
|
||||||
else if (required <= sWarnMemoryLimit)
|
else if (required <= sWarnMemoryLimit)
|
||||||
sLowMemoryState = B_LOW_RESOURCE_WARNING;
|
newState = B_LOW_RESOURCE_WARNING;
|
||||||
else
|
else
|
||||||
sLowMemoryState = B_LOW_RESOURCE_NOTE;
|
newState = B_LOW_RESOURCE_NOTE;
|
||||||
|
|
||||||
|
if (sLowMemoryState < newState)
|
||||||
|
sLowMemoryState = newState;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case B_KERNEL_RESOURCE_SEMAPHORES:
|
case B_KERNEL_RESOURCE_SEMAPHORES:
|
||||||
if (requirements <= 4)
|
if (requirements <= 4)
|
||||||
sLowSemaphoresState = B_LOW_RESOURCE_CRITICAL;
|
newState = B_LOW_RESOURCE_CRITICAL;
|
||||||
else if (requirements <= 32)
|
else if (requirements <= 32)
|
||||||
sLowSemaphoresState = B_LOW_RESOURCE_WARNING;
|
newState = B_LOW_RESOURCE_WARNING;
|
||||||
else
|
else
|
||||||
sLowSemaphoresState = B_LOW_RESOURCE_NOTE;
|
newState = B_LOW_RESOURCE_NOTE;
|
||||||
|
|
||||||
|
if (sLowSemaphoresState < newState)
|
||||||
|
sLowSemaphoresState = newState;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case B_KERNEL_RESOURCE_ADDRESS_SPACE:
|
case B_KERNEL_RESOURCE_ADDRESS_SPACE:
|
||||||
if (requirements <= (kCriticalPagesLimit * B_PAGE_SIZE))
|
if (requirements <= (kCriticalPagesLimit * B_PAGE_SIZE))
|
||||||
sLowSpaceState = B_LOW_RESOURCE_CRITICAL;
|
newState = B_LOW_RESOURCE_CRITICAL;
|
||||||
else if (requirements <= (kWarnPagesLimit * B_PAGE_SIZE))
|
else if (requirements <= (kWarnPagesLimit * B_PAGE_SIZE))
|
||||||
sLowSpaceState = B_LOW_RESOURCE_WARNING;
|
newState = B_LOW_RESOURCE_WARNING;
|
||||||
else
|
else
|
||||||
sLowSpaceState = B_LOW_RESOURCE_NOTE;
|
newState = B_LOW_RESOURCE_NOTE;
|
||||||
|
|
||||||
|
if (sLowSpaceState < newState)
|
||||||
|
sLowSpaceState = newState;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user