diff --git a/headers/private/kernel/vm_page.h b/headers/private/kernel/vm_page.h index 707b439fd9..e2049c4293 100644 --- a/headers/private/kernel/vm_page.h +++ b/headers/private/kernel/vm_page.h @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2002-2009, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. * * Copyright 2001-2002, Travis Geiselbrecht. All rights reserved. @@ -35,6 +35,7 @@ void vm_page_requeue(struct vm_page *page, bool tail); size_t vm_page_num_pages(void); size_t vm_page_num_free_pages(void); size_t vm_page_num_available_pages(void); +size_t vm_page_num_unused_pages(void); void vm_page_get_stats(system_info *info); status_t vm_page_write_modified_page_range(struct VMCache *cache, diff --git a/src/system/kernel/vm/vm_cache.cpp b/src/system/kernel/vm/vm_cache.cpp index 26160e6e1e..5543567d05 100644 --- a/src/system/kernel/vm/vm_cache.cpp +++ b/src/system/kernel/vm/vm_cache.cpp @@ -345,6 +345,9 @@ vm_cache_acquire_locked_page_cache(vm_page* page, bool dontWait) return NULL; } + // TODO: this is problematic, as it requires the caller not to have + // a lock on this cache (it might be called via + // vm_page_allocate_page(..., false)). if (!cache->SwitchLock(&sCacheListLock)) { // cache has been deleted mutex_lock(&sCacheListLock); diff --git a/src/system/kernel/vm/vm_page.cpp b/src/system/kernel/vm/vm_page.cpp index 7c04735f59..b6eb259536 100644 --- a/src/system/kernel/vm/vm_page.cpp +++ b/src/system/kernel/vm/vm_page.cpp @@ -1893,6 +1893,8 @@ vm_page_try_reserve_pages(uint32 count) } +// TODO: you must not have locked a cache when calling this function with +// reserved == false. See vm_cache_acquire_locked_page_cache(). vm_page * vm_page_allocate_page(int pageState, bool reserved) { @@ -2167,13 +2169,20 @@ vm_page_num_free_pages(void) { size_t reservedPages = sReservedPages; size_t count = free_page_queue_count() + sInactivePageQueue.count; - if (reservedPages > count) + if (reservedPages >= count) return 0; return count - reservedPages; } +size_t +vm_page_num_unused_pages(void) +{ + return free_page_queue_count() - sReservedPages; +} + + void vm_page_get_stats(system_info *info) {