From 2d8073a9dc84ecdf5106afaf98996e0ed12f4a72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Thu, 30 Apr 2009 15:46:55 +0000 Subject: [PATCH] * Added a TODO about a problematic use of vm_page_allocate_page() in combination with vm_cache_acquire_locked_page_cache(). * Added new function vm_page_num_unused_pages() which returns the pages that are actually completely free and unused. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30514 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/kernel/vm_page.h | 3 ++- src/system/kernel/vm/vm_cache.cpp | 3 +++ src/system/kernel/vm/vm_page.cpp | 11 ++++++++++- 3 files changed, 15 insertions(+), 2 deletions(-) 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) {