From 41f8d41647c52758df0d91031609d31ca01032ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 25 Mar 2008 11:51:45 +0000 Subject: [PATCH] Applied patch by Rene Gollent: * Add a cached_pages field to the system_info structure, and change the meaning of the used_pages field to not include cached pages. * Provide the needed info using the new calls vm_get_available_memory(), and vm_page_num_available_pages(). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24571 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/os/kernel/OS.h | 3 ++- headers/private/kernel/vm.h | 4 +++- headers/private/kernel/vm_page.h | 3 ++- src/bin/sysinfo.c | 3 ++- src/system/kernel/system_info.cpp | 5 +++-- src/system/kernel/vm/vm.cpp | 7 +++++++ src/system/kernel/vm/vm_page.cpp | 16 +++++++++++++++- 7 files changed, 34 insertions(+), 7 deletions(-) diff --git a/headers/os/kernel/OS.h b/headers/os/kernel/OS.h index 3af0052c6a..5ae2463167 100644 --- a/headers/os/kernel/OS.h +++ b/headers/os/kernel/OS.h @@ -657,7 +657,8 @@ typedef struct { int64 kernel_version; /* version of this kernel */ bigtime_t _busy_wait_time; /* reserved for whatever */ - int32 pad[4]; /* just in case... */ + int32 cached_pages; + int32 pad[3]; /* just in case... */ } system_info; /* system private, use macro instead */ diff --git a/headers/private/kernel/vm.h b/headers/private/kernel/vm.h index 1dcecc45f9..967db7c51b 100644 --- a/headers/private/kernel/vm.h +++ b/headers/private/kernel/vm.h @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007, Axel Dörfler, axeld@pinc-software.de. All rights reserved. + * Copyright 2002-2008, Axel Dörfler, axeld@pinc-software.de. All rights reserved. * Distributed under the terms of the MIT License. * * Copyright 2001-2002, Travis Geiselbrecht. All rights reserved. @@ -138,6 +138,8 @@ status_t vm_map_page(struct vm_area *area, struct vm_page *page, addr_t address, status_t vm_get_physical_page(addr_t paddr, addr_t *vaddr, uint32 flags); status_t vm_put_physical_page(addr_t vaddr); +off_t vm_get_available_memory(void); + // user syscalls area_id _user_create_area(const char *name, void **address, uint32 addressSpec, size_t size, uint32 lock, uint32 protection); diff --git a/headers/private/kernel/vm_page.h b/headers/private/kernel/vm_page.h index ac1845fa59..d0d8148433 100644 --- a/headers/private/kernel/vm_page.h +++ b/headers/private/kernel/vm_page.h @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2002-2008, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. * * Copyright 2001-2002, Travis Geiselbrecht. All rights reserved. @@ -33,6 +33,7 @@ void vm_page_requeue(struct vm_page *page, bool tail); // get some data about the number of pages in the system size_t vm_page_num_pages(void); size_t vm_page_num_free_pages(void); +size_t vm_page_num_available_pages(void); status_t vm_page_write_modified_pages(struct vm_cache *cache, bool fsReenter); void vm_page_schedule_write_page(struct vm_page *page); diff --git a/src/bin/sysinfo.c b/src/bin/sysinfo.c index df2482220a..2903463add 100644 --- a/src/bin/sysinfo.c +++ b/src/bin/sysinfo.c @@ -517,9 +517,10 @@ dump_cpus(system_info *info) static void dump_mem(system_info *info) { - printf("%10lu bytes free (used/max %10lu / %10lu)\n", + printf("%10lu bytes free (used/cached/max %10lu / %10lu / %10lu)\n", B_PAGE_SIZE * (uint32)(info->max_pages - info->used_pages), B_PAGE_SIZE * (uint32)info->used_pages, + B_PAGE_SIZE * (uint32)info->cached_pages, B_PAGE_SIZE * (uint32)info->max_pages); } diff --git a/src/system/kernel/system_info.cpp b/src/system/kernel/system_info.cpp index 5362e0f7ef..241d15a806 100644 --- a/src/system/kernel/system_info.cpp +++ b/src/system/kernel/system_info.cpp @@ -79,8 +79,9 @@ _get_system_info(system_info *info, size_t size) // ToDo: Add page_faults info->max_pages = vm_page_num_pages(); - info->used_pages = vm_page_num_pages() - vm_page_num_free_pages(); - + info->used_pages = vm_page_num_pages() - vm_page_num_available_pages(); + info->cached_pages = vm_page_num_pages() - vm_page_num_free_pages() + - info->used_pages; info->used_threads = thread_used_threads(); info->max_threads = thread_max_threads(); info->used_teams = team_used_teams(); diff --git a/src/system/kernel/vm/vm.cpp b/src/system/kernel/vm/vm.cpp index 99e8b7682a..1a060a8fc4 100644 --- a/src/system/kernel/vm/vm.cpp +++ b/src/system/kernel/vm/vm.cpp @@ -4363,6 +4363,13 @@ vm_get_physical_page(addr_t paddr, addr_t *_vaddr, uint32 flags) } +off_t +vm_get_available_memory(void) +{ + return sAvailableMemory; +} + + status_t vm_put_physical_page(addr_t vaddr) { diff --git a/src/system/kernel/vm/vm_page.cpp b/src/system/kernel/vm/vm_page.cpp index 367bd634c5..5b6b0b3eac 100644 --- a/src/system/kernel/vm/vm_page.cpp +++ b/src/system/kernel/vm/vm_page.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2002-2008, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. * * Copyright 2001-2002, Travis Geiselbrecht. All rights reserved. @@ -1830,6 +1830,20 @@ vm_page_num_pages(void) } +/*! There is a subtle distinction between the page counts returned by + this function and vm_page_num_free_pages(): + The latter returns the number of pages that are completely uncommitted, + whereas this one returns the number of pages that are available for + use by being reclaimed as well (IOW it factors in things like cache pages + as available). +*/ +size_t +vm_page_num_available_pages(void) +{ + return vm_get_available_memory() / B_PAGE_SIZE; +} + + size_t vm_page_num_free_pages(void) {