Changeset 26375
- Timestamp:
- 07/10/08 15:50:34 (4 months ago)
- Location:
- haiku/branches/developer/bonefish/vm
- Files:
-
- 8 modified
-
headers/private/kernel/low_resource_manager.h (modified) (1 diff)
-
headers/private/kernel/vm.h (modified) (1 diff)
-
headers/private/kernel/vm_priv.h (modified) (1 diff)
-
src/system/kernel/low_resource_manager.cpp (modified) (4 diffs)
-
src/system/kernel/vm/VMAnonymousCache.cpp (modified) (2 diffs)
-
src/system/kernel/vm/VMAnonymousNoSwapCache.cpp (modified) (2 diffs)
-
src/system/kernel/vm/vm.cpp (modified) (5 diffs)
-
src/system/kernel/vm/vm_page.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
haiku/branches/developer/bonefish/vm/headers/private/kernel/low_resource_manager.h
r26373 r26375 38 38 status_t low_resource_manager_init_post_thread(void); 39 39 int32 low_resource_state(uint32 resources); 40 void low_resource(uint32 resource, uint64 requirements, bool wait); 40 void low_resource(uint32 resource, uint64 requirements, uint32 flags, 41 uint32 timeout); 41 42 42 43 // these calls might get public some day -
haiku/branches/developer/bonefish/vm/headers/private/kernel/vm.h
r26175 r26375 89 89 90 90 off_t vm_available_memory(void); 91 off_t vm_available_not_needed_memory(void); 91 92 92 93 // user syscalls -
haiku/branches/developer/bonefish/vm/headers/private/kernel/vm_priv.h
r22506 r26375 49 49 bool isUser, addr_t *newip); 50 50 void vm_unreserve_memory(size_t bytes); 51 status_t vm_try_reserve_memory(size_t bytes );51 status_t vm_try_reserve_memory(size_t bytes, bigtime_t timeout); 52 52 void vm_schedule_page_scanner(uint32 target); 53 53 status_t vm_daemon_init(void); -
haiku/branches/developer/bonefish/vm/src/system/kernel/low_resource_manager.cpp
r26373 r26375 147 147 148 148 // free memory state 149 off_t freeMemory = vm_available_ memory();149 off_t freeMemory = vm_available_not_needed_memory(); 150 150 151 151 if (freeMemory < sCriticalMemoryLimit) { … … 195 195 TRACE(("low_resource_manager: state = %ld, %ld free pages, %lld free " 196 196 "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())); 198 199 199 200 if (state < B_LOW_RESOURCE_NOTE) … … 243 244 244 245 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). 248 250 */ 249 251 void 250 low_resource(uint32 resource, uint64 requirements, bool wait)252 low_resource(uint32 resource, uint64 requirements, uint32 flags, uint32 timeout) 251 253 { 252 254 // TODO: take requirements into account … … 264 266 release_sem(sLowResourceWaitSem); 265 267 266 if ( wait)267 sLowResourceWaiterCondition.Wait( );268 if ((flags & B_RELATIVE_TIMEOUT) == 0 || timeout > 0) 269 sLowResourceWaiterCondition.Wait(flags, timeout); 268 270 } 269 271 -
haiku/branches/developer/bonefish/vm/src/system/kernel/vm/VMAnonymousCache.cpp
r26315 r26375 142 142 if (size > committed_size) { 143 143 // 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) 145 145 return B_NO_MEMORY; 146 146 } else { … … 268 268 if (fPrecommittedPages == 0) { 269 269 // 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) 271 271 return B_NO_MEMORY; 272 272 -
haiku/branches/developer/bonefish/vm/src/system/kernel/vm/VMAnonymousNoSwapCache.cpp
r26314 r26375 76 76 if (size > committed_size) { 77 77 // 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) 79 79 return B_NO_MEMORY; 80 80 } else { … … 137 137 if (fPrecommittedPages == 0) { 138 138 // 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) 140 140 return B_NO_MEMORY; 141 141 -
haiku/branches/developer/bonefish/vm/src/system/kernel/vm/vm.cpp
r26351 r26375 21 21 #include <AutoDeleter.h> 22 22 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> 23 31 #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>29 32 #include <heap.h> 30 #include <condition_variable.h>31 #include <debug.h>32 #include <console.h>33 33 #include <int.h> 34 #include <lock.h> 35 #include <low_resource_manager.h> 34 36 #include <smp.h> 35 #include <lock.h>36 37 #include <thread.h> 37 38 #include <team.h> 38 39 #include <util/AutoLock.h> 39 40 #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> 46 45 47 46 … … 194 193 195 194 static off_t sAvailableMemory; 195 static off_t sNeededMemory; 196 196 static mutex sAvailableMemoryLock = MUTEX_INITIALIZER("available memory lock"); 197 197 … … 4614 4614 vm_available_memory(void) 4615 4615 { 4616 MutexLocker locker(sAvailableMemoryLock); 4616 4617 return sAvailableMemory; 4618 } 4619 4620 4621 off_t 4622 vm_available_not_needed_memory(void) 4623 { 4624 MutexLocker locker(sAvailableMemoryLock); 4625 return sAvailableMemory - sNeededMemory; 4617 4626 } 4618 4627 … … 4637 4646 4638 4647 status_t 4639 vm_try_reserve_memory(size_t amount) 4640 { 4641 status_t status; 4642 mutex_lock(&sAvailableMemoryLock); 4648 vm_try_reserve_memory(size_t amount, bigtime_t timeout) 4649 { 4650 MutexLocker locker(sAvailableMemoryLock); 4643 4651 4644 4652 //dprintf("try to reserve %lu bytes, %Lu left\n", amount, sAvailableMemory); … … 4646 4654 if (sAvailableMemory >= amount) { 4647 4655 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; 4654 4684 } 4655 4685 -
haiku/branches/developer/bonefish/vm/src/system/kernel/vm/vm_page.cpp
r26373 r26375 1253 1253 locker.Unlock(); 1254 1254 1255 low_resource(B_KERNEL_RESOURCE_PAGES, count, false);1255 low_resource(B_KERNEL_RESOURCE_PAGES, count, B_RELATIVE_TIMEOUT, 0); 1256 1256 //snooze(50000); 1257 1257 // sleep for 50ms
