Changeset 26375

Show
Ignore:
Timestamp:
07/10/08 15:50:34 (4 months ago)
Author:
bonefish
Message:

* Replaced the low_resource() "bool wait" parameter by a flags +

timeout pair. Timeouts are a good idea given that it's not really
clear how long the low resource handlers might take.

* Added timeout parameter to vm_try_reserve_memory(). That's how long

the function loops and keeps nagging the low resource manager.

* Also track the amount of memory needed by threads waiting in

vm_try_resource_memory(). vm_available_not_needed_memory() returns the
difference of available and needed memory.

* The VMAnonymous*Cache implementations use a 1s timeout for reserving

memory in Commit() now. Over-committing areas still require immediate
reservations, though.

This might already remedy the main problem of #2046. 1s could be a
little too short for freeing the 270 MB jam needs, though.

Location:
haiku/branches/developer/bonefish/vm
Files:
8 modified

Legend:

Unmodified
Added
Removed
  • haiku/branches/developer/bonefish/vm/headers/private/kernel/low_resource_manager.h

    r26373 r26375  
    3838status_t low_resource_manager_init_post_thread(void); 
    3939int32 low_resource_state(uint32 resources); 
    40 void low_resource(uint32 resource, uint64 requirements, bool wait); 
     40void low_resource(uint32 resource, uint64 requirements, uint32 flags, 
     41        uint32 timeout); 
    4142 
    4243// these calls might get public some day 
  • haiku/branches/developer/bonefish/vm/headers/private/kernel/vm.h

    r26175 r26375  
    8989 
    9090off_t vm_available_memory(void); 
     91off_t vm_available_not_needed_memory(void); 
    9192 
    9293// user syscalls 
  • haiku/branches/developer/bonefish/vm/headers/private/kernel/vm_priv.h

    r22506 r26375  
    4949        bool isUser, addr_t *newip); 
    5050void vm_unreserve_memory(size_t bytes); 
    51 status_t vm_try_reserve_memory(size_t bytes); 
     51status_t vm_try_reserve_memory(size_t bytes, bigtime_t timeout); 
    5252void vm_schedule_page_scanner(uint32 target); 
    5353status_t vm_daemon_init(void); 
  • haiku/branches/developer/bonefish/vm/src/system/kernel/low_resource_manager.cpp

    r26373 r26375  
    147147 
    148148        // free memory state 
    149         off_t freeMemory = vm_available_memory(); 
     149        off_t freeMemory = vm_available_not_needed_memory(); 
    150150 
    151151        if (freeMemory < sCriticalMemoryLimit) { 
     
    195195                TRACE(("low_resource_manager: state = %ld, %ld free pages, %lld free " 
    196196                        "memory, %lu free semaphores\n", state, vm_page_num_free_pages(), 
    197                         vm_available_memory(), sem_max_sems() - sem_used_sems())); 
     197                        vm_available_not_needed_memory(), 
     198                        sem_max_sems() - sem_used_sems())); 
    198199 
    199200                if (state < B_LOW_RESOURCE_NOTE) 
     
    243244 
    244245 
    245 /*!     Notifies the low resource manager that a resource is lacking. If \a wait 
    246         is \c true, the function will wait until the low resource manager has 
    247         finished its next iteration of calling low resource handlers. 
     246/*!     Notifies the low resource manager that a resource is lacking. If \a flags 
     247        and \a timeout specify a timeout, the function will wait until the low 
     248        resource manager has finished its next iteration of calling low resource 
     249        handlers, or until the timeout occurs (whichever happens first). 
    248250*/ 
    249251void 
    250 low_resource(uint32 resource, uint64 requirements, bool wait) 
     252low_resource(uint32 resource, uint64 requirements, uint32 flags, uint32 timeout) 
    251253{ 
    252254        // TODO: take requirements into account 
     
    264266        release_sem(sLowResourceWaitSem); 
    265267 
    266         if (wait) 
    267                 sLowResourceWaiterCondition.Wait(); 
     268        if ((flags & B_RELATIVE_TIMEOUT) == 0 || timeout > 0) 
     269                sLowResourceWaiterCondition.Wait(flags, timeout); 
    268270} 
    269271 
  • haiku/branches/developer/bonefish/vm/src/system/kernel/vm/VMAnonymousCache.cpp

    r26315 r26375  
    142142        if (size > committed_size) { 
    143143                // try to commit 
    144                 if (vm_try_reserve_memory(size - committed_size) != B_OK) 
     144                if (vm_try_reserve_memory(size - committed_size, 1000000) != B_OK) 
    145145                        return B_NO_MEMORY; 
    146146        } else { 
     
    268268                if (fPrecommittedPages == 0) { 
    269269                        // try to commit additional memory 
    270                         if (vm_try_reserve_memory(B_PAGE_SIZE) != B_OK) 
     270                        if (vm_try_reserve_memory(B_PAGE_SIZE, 0) != B_OK) 
    271271                                return B_NO_MEMORY; 
    272272 
  • haiku/branches/developer/bonefish/vm/src/system/kernel/vm/VMAnonymousNoSwapCache.cpp

    r26314 r26375  
    7676        if (size > committed_size) { 
    7777                // try to commit 
    78                 if (vm_try_reserve_memory(size - committed_size) != B_OK) 
     78                if (vm_try_reserve_memory(size - committed_size, 1000000) != B_OK) 
    7979                        return B_NO_MEMORY; 
    8080        } else { 
     
    137137                if (fPrecommittedPages == 0) { 
    138138                        // try to commit additional memory 
    139                         if (vm_try_reserve_memory(B_PAGE_SIZE) != B_OK) 
     139                        if (vm_try_reserve_memory(B_PAGE_SIZE, 0) != B_OK) 
    140140                                return B_NO_MEMORY; 
    141141 
  • haiku/branches/developer/bonefish/vm/src/system/kernel/vm/vm.cpp

    r26351 r26375  
    2121#include <AutoDeleter.h> 
    2222 
     23#include <arch/cpu.h> 
     24#include <arch/vm.h> 
     25#include <boot/elf.h> 
     26#include <boot/stage2.h> 
     27#include <condition_variable.h> 
     28#include <console.h> 
     29#include <debug.h> 
     30#include <file_cache.h> 
    2331#include <fs/fd.h> 
    24 #include <vm_address_space.h> 
    25 #include <vm_priv.h> 
    26 #include <vm_page.h> 
    27 #include <vm_cache.h> 
    28 #include <file_cache.h> 
    2932#include <heap.h> 
    30 #include <condition_variable.h> 
    31 #include <debug.h> 
    32 #include <console.h> 
    3333#include <int.h> 
     34#include <lock.h> 
     35#include <low_resource_manager.h> 
    3436#include <smp.h> 
    35 #include <lock.h> 
    3637#include <thread.h> 
    3738#include <team.h> 
    3839#include <util/AutoLock.h> 
    3940#include <util/khash.h> 
    40  
    41 #include <boot/stage2.h> 
    42 #include <boot/elf.h> 
    43  
    44 #include <arch/cpu.h> 
    45 #include <arch/vm.h> 
     41#include <vm_address_space.h> 
     42#include <vm_cache.h> 
     43#include <vm_page.h> 
     44#include <vm_priv.h> 
    4645 
    4746 
     
    194193 
    195194static off_t sAvailableMemory; 
     195static off_t sNeededMemory; 
    196196static mutex sAvailableMemoryLock = MUTEX_INITIALIZER("available memory lock"); 
    197197 
     
    46144614vm_available_memory(void) 
    46154615{ 
     4616        MutexLocker locker(sAvailableMemoryLock); 
    46164617        return sAvailableMemory; 
     4618} 
     4619 
     4620 
     4621off_t 
     4622vm_available_not_needed_memory(void) 
     4623{ 
     4624        MutexLocker locker(sAvailableMemoryLock); 
     4625        return sAvailableMemory - sNeededMemory; 
    46174626} 
    46184627 
     
    46374646 
    46384647status_t 
    4639 vm_try_reserve_memory(size_t amount) 
    4640 { 
    4641         status_t status; 
    4642         mutex_lock(&sAvailableMemoryLock); 
     4648vm_try_reserve_memory(size_t amount, bigtime_t timeout) 
     4649{ 
     4650        MutexLocker locker(sAvailableMemoryLock); 
    46434651 
    46444652        //dprintf("try to reserve %lu bytes, %Lu left\n", amount, sAvailableMemory); 
     
    46464654        if (sAvailableMemory >= amount) { 
    46474655                sAvailableMemory -= amount; 
    4648                 status = B_OK; 
    4649         } else 
    4650                 status = B_NO_MEMORY; 
    4651  
    4652         mutex_unlock(&sAvailableMemoryLock); 
    4653         return status; 
     4656                return B_OK; 
     4657        } 
     4658 
     4659        if (timeout <= 0) 
     4660                return B_NO_MEMORY; 
     4661 
     4662        // turn timeout into an absolute timeout 
     4663        timeout += system_time(); 
     4664 
     4665        // loop until we've got the memory or the timeout occurs 
     4666        do { 
     4667                sNeededMemory += amount; 
     4668 
     4669                // call the low resource manager 
     4670                locker.Unlock(); 
     4671                low_resource(B_KERNEL_RESOURCE_MEMORY, sNeededMemory - sAvailableMemory, 
     4672                        B_ABSOLUTE_TIMEOUT, timeout); 
     4673                locker.Lock(); 
     4674 
     4675                sNeededMemory -= amount; 
     4676 
     4677                if (sAvailableMemory >= amount) { 
     4678                        sAvailableMemory -= amount; 
     4679                        return B_OK; 
     4680                } 
     4681        } while (timeout > system_time()); 
     4682 
     4683        return B_NO_MEMORY; 
    46544684} 
    46554685 
  • haiku/branches/developer/bonefish/vm/src/system/kernel/vm/vm_page.cpp

    r26373 r26375  
    12531253                locker.Unlock(); 
    12541254 
    1255                 low_resource(B_KERNEL_RESOURCE_PAGES, count, false); 
     1255                low_resource(B_KERNEL_RESOURCE_PAGES, count, B_RELATIVE_TIMEOUT, 0); 
    12561256                //snooze(50000); 
    12571257                        // sleep for 50ms