From f1e86789424b2ca836de295acc27bc4e3e422dbb Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Tue, 11 Dec 2018 14:43:46 -0500 Subject: [PATCH] kernel: Notify low resource handler & retry when low on kernel address space. Solves a decade-old TODO. This might help with strange behavior in low-memory conditions. --- src/system/kernel/vm/vm.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/system/kernel/vm/vm.cpp b/src/system/kernel/vm/vm.cpp index 205ab5dca1..4e35366f57 100644 --- a/src/system/kernel/vm/vm.cpp +++ b/src/system/kernel/vm/vm.cpp @@ -871,16 +871,17 @@ map_backing_store(VMAddressSpace* addressSpace, VMCache* cache, off_t offset, status = addressSpace->InsertArea(area, size, addressRestrictions, allocationFlags, _virtualAddress); - if (status != B_OK) { - // TODO: wait and try again once this is working in the backend -#if 0 - if (status == B_NO_MEMORY && addressSpec == B_ANY_KERNEL_ADDRESS) { - low_resource(B_KERNEL_RESOURCE_ADDRESS_SPACE, size, - 0, 0); - } -#endif - goto err2; + if (status == B_NO_MEMORY + && addressRestrictions->address_specification == B_ANY_KERNEL_ADDRESS) { + // issue a low resource notification and try again + low_resource(B_KERNEL_RESOURCE_ADDRESS_SPACE, size, B_RELATIVE_TIMEOUT, + ((flags & CREATE_AREA_DONT_WAIT) != 0) ? 0 : 100000 /* 100ms*/); + + status = addressSpace->InsertArea(area, size, addressRestrictions, + allocationFlags, _virtualAddress); } + if (status != B_OK) + goto err2; // attach the cache to the area area->cache = cache;