From d02aaee17e007631fcfa91a012ec7b6386927012 Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Mon, 16 Dec 2013 04:53:46 +0100 Subject: [PATCH] kernel, libroot: Add more memory info in system_info system_info now contains all information previously available only through __get_system_info_etc(B_MEMORY_INFO, ...). --- headers/os/kernel/OS.h | 7 ++-- headers/private/kernel/vm/vm.h | 2 +- headers/private/system/syscalls.h | 2 - headers/private/system/system_info.h | 16 -------- src/apps/activitymonitor/DataSource.cpp | 8 +--- src/apps/activitymonitor/SystemInfo.cpp | 22 +++++++---- src/apps/activitymonitor/SystemInfo.h | 2 +- src/bin/vmstat.cpp | 38 ++++++++++--------- .../virtualmemory/SettingsWindow.cpp | 9 +++-- src/system/kernel/system_info.cpp | 29 +------------- src/system/kernel/vm/VMAnonymousCache.cpp | 6 +-- src/system/kernel/vm/VMAnonymousCache.h | 2 +- src/system/kernel/vm/vm.cpp | 7 +--- src/system/kernel/vm/vm_page.cpp | 1 + src/system/libroot/os/system_info.cpp | 10 ----- 15 files changed, 55 insertions(+), 106 deletions(-) diff --git a/headers/os/kernel/OS.h b/headers/os/kernel/OS.h index d6199a3d6a..66131ee825 100644 --- a/headers/os/kernel/OS.h +++ b/headers/os/kernel/OS.h @@ -433,14 +433,15 @@ typedef struct { uint64 max_pages; /* total # of accessible pages */ uint64 used_pages; /* # of accessible pages in use */ - uint64 free_pages; - uint64 reserved_pages; uint64 cached_pages; uint64 block_cache_pages; uint64 ignored_pages; /* # of ignored/inaccessible pages */ + uint64 needed_memory; + uint64 free_memory; + uint64 max_swap_pages; - uint64 used_swap_pages; + uint64 free_swap_pages; uint32 page_faults; /* # of page faults */ diff --git a/headers/private/kernel/vm/vm.h b/headers/private/kernel/vm/vm.h index 1962f418a2..2b4b1e32c3 100644 --- a/headers/private/kernel/vm/vm.h +++ b/headers/private/kernel/vm/vm.h @@ -142,7 +142,7 @@ status_t vm_get_physical_page_debug(phys_addr_t paddr, addr_t* vaddr, void** _handle); status_t vm_put_physical_page_debug(addr_t vaddr, void* handle); -void vm_get_info(struct system_memory_info *info); +void vm_get_info(system_info *info); uint32 vm_num_page_faults(void); off_t vm_available_memory(void); off_t vm_available_not_needed_memory(void); diff --git a/headers/private/system/syscalls.h b/headers/private/system/syscalls.h index fd787c4cda..3f475e7886 100644 --- a/headers/private/system/syscalls.h +++ b/headers/private/system/syscalls.h @@ -521,8 +521,6 @@ extern status_t _kern_get_cpu_topology_info( cpu_topology_node_info* topologyInfos, uint32* topologyInfoCount); -extern status_t _kern_get_system_info_etc(int32 id, void *buffer, - size_t bufferSize); extern status_t _kern_analyze_scheduling(bigtime_t from, bigtime_t until, void* buffer, size_t size, struct scheduling_analysis* analysis); diff --git a/headers/private/system/system_info.h b/headers/private/system/system_info.h index 89a47f6bac..e04dd61f26 100644 --- a/headers/private/system/system_info.h +++ b/headers/private/system/system_info.h @@ -9,21 +9,6 @@ #include -#define B_MEMORY_INFO 'memo' - -struct system_memory_info { - uint64 max_memory; - uint64 free_memory; - uint64 needed_memory; - uint64 max_swap_space; - uint64 free_swap_space; - uint64 block_cache_memory; - uint32 page_faults; - - // TODO: add active/inactive page counts, swap in/out, ... -}; - - enum { // team creation or deletion; object == -1; either one also triggers on // exec() @@ -67,7 +52,6 @@ status_t __get_system_info(system_info* info); status_t __get_cpu_info(uint32 firstCPU, uint32 cpuCount, cpu_info* info); status_t __get_cpu_topology_info(cpu_topology_node_info* topologyInfos, uint32* topologyInfoCount); -status_t __get_system_info_etc(int32 id, void* buffer, size_t bufferSize); status_t __start_watching_system(int32 object, uint32 flags, port_id port, int32 token); diff --git a/src/apps/activitymonitor/DataSource.cpp b/src/apps/activitymonitor/DataSource.cpp index 9c954e1051..c493593f8c 100644 --- a/src/apps/activitymonitor/DataSource.cpp +++ b/src/apps/activitymonitor/DataSource.cpp @@ -497,13 +497,7 @@ BlockCacheDataSource::Copy() const int64 BlockCacheDataSource::NextValue(SystemInfo& info) { - system_memory_info memoryInfo; - status_t status = __get_system_info_etc(B_MEMORY_INFO, &memoryInfo, - sizeof(system_memory_info)); - if (status != B_OK) - return 0; - - return memoryInfo.block_cache_memory; + return info.BlockCacheMemory(); } diff --git a/src/apps/activitymonitor/SystemInfo.cpp b/src/apps/activitymonitor/SystemInfo.cpp index 2416e4a2a0..482fa694c1 100644 --- a/src/apps/activitymonitor/SystemInfo.cpp +++ b/src/apps/activitymonitor/SystemInfo.cpp @@ -26,8 +26,6 @@ SystemInfo::SystemInfo(SystemInfoHandler* handler) get_system_info(&fSystemInfo); fCPUInfos = new cpu_info[fSystemInfo.cpu_count]; get_cpu_info(0, fSystemInfo.cpu_count, fCPUInfos); - __get_system_info_etc(B_MEMORY_INFO, &fMemoryInfo, - sizeof(system_memory_info)); if (handler != NULL) { fRunningApps = handler->RunningApps(); @@ -50,45 +48,53 @@ uint64 SystemInfo::CachedMemory() const { #ifdef __HAIKU__ - return (uint64)fSystemInfo.cached_pages * B_PAGE_SIZE; + return fSystemInfo.cached_pages * B_PAGE_SIZE; #else return 0LL; #endif } +uint64 +SystemInfo::BlockCacheMemory() const +{ + return fSystemInfo.block_cache_pages * B_PAGE_SIZE; +} + + uint64 SystemInfo::UsedMemory() const { - return (uint64)fSystemInfo.used_pages * B_PAGE_SIZE; + return fSystemInfo.used_pages * B_PAGE_SIZE; } uint64 SystemInfo::MaxMemory() const { - return (uint64)fSystemInfo.max_pages * B_PAGE_SIZE; + return fSystemInfo.max_pages * B_PAGE_SIZE; } uint32 SystemInfo::PageFaults() const { - return fMemoryInfo.page_faults; + return fSystemInfo.page_faults; } uint64 SystemInfo::UsedSwapSpace() const { - return fMemoryInfo.max_swap_space - fMemoryInfo.free_swap_space; + return (fSystemInfo.max_swap_pages - fSystemInfo.free_swap_pages) + * B_PAGE_SIZE; } uint64 SystemInfo::MaxSwapSpace() const { - return fMemoryInfo.max_swap_space; + return fSystemInfo.max_swap_pages * B_PAGE_SIZE; } diff --git a/src/apps/activitymonitor/SystemInfo.h b/src/apps/activitymonitor/SystemInfo.h index 66e900b27b..065eb234bd 100644 --- a/src/apps/activitymonitor/SystemInfo.h +++ b/src/apps/activitymonitor/SystemInfo.h @@ -20,6 +20,7 @@ public: ~SystemInfo(); uint64 CachedMemory() const; + uint64 BlockCacheMemory() const; uint64 UsedMemory() const; uint64 MaxMemory() const; @@ -64,7 +65,6 @@ private: system_info fSystemInfo; cpu_info* fCPUInfos; - system_memory_info fMemoryInfo; bigtime_t fTime; bool fRetrievedNetwork; uint64 fBytesReceived; diff --git a/src/bin/vmstat.cpp b/src/bin/vmstat.cpp index ed2dee580f..9d6085b32f 100644 --- a/src/bin/vmstat.cpp +++ b/src/bin/vmstat.cpp @@ -66,40 +66,44 @@ main(int argc, char** argv) break; } } - system_memory_info info; - status_t status = __get_system_info_etc(B_MEMORY_INFO, &info, - sizeof(system_memory_info)); + system_info info; + status_t status = get_system_info(&info); if (status != B_OK) { fprintf(stderr, "%s: cannot get system info: %s\n", kProgramName, strerror(status)); return 1; } - printf("max memory:\t\t%Lu\n", info.max_memory); + printf("max memory:\t\t%Lu\n", info.max_pages * B_PAGE_SIZE); printf("free memory:\t\t%Lu\n", info.free_memory); printf("needed memory:\t\t%Lu\n", info.needed_memory); - printf("block cache memory:\t%Lu\n", info.block_cache_memory); - printf("max swap space:\t\t%Lu\n", info.max_swap_space); - printf("free swap space:\t%Lu\n", info.free_swap_space); + printf("block cache memory:\t%Lu\n", info.block_cache_pages * B_PAGE_SIZE); + printf("max swap space:\t\t%Lu\n", info.max_swap_pages * B_PAGE_SIZE); + printf("free swap space:\t%Lu\n", info.free_swap_pages * B_PAGE_SIZE); printf("page faults:\t\t%lu\n", info.page_faults); if (periodically) { puts("\npage faults used memory used swap block cache"); - system_memory_info lastInfo = info; + system_info lastInfo = info; while (true) { snooze(rate); - __get_system_info_etc(B_MEMORY_INFO, &info, - sizeof(system_memory_info)); + get_system_info(&info); - printf("%11ld %11Ld %11Ld %11Ld\n", - (int32)info.page_faults - lastInfo.page_faults, - (info.max_memory - info.free_memory) - - (lastInfo.max_memory - lastInfo.free_memory), - (info.max_swap_space - info.free_swap_space) - - (lastInfo.max_swap_space - lastInfo.free_swap_space), - info.block_cache_memory - lastInfo.block_cache_memory); + int32 pageFaults = info.page_faults - lastInfo.page_faults; + int64 usedMemory + = (info.max_pages * B_PAGE_SIZE - info.free_memory) + - (lastInfo.max_pages * B_PAGE_SIZE - lastInfo.free_memory); + int64 usedSwap + = ((info.max_swap_pages - info.free_swap_pages) + - (lastInfo.max_swap_pages - lastInfo.free_swap_pages)) + * B_PAGE_SIZE; + int64 blockCache + = (info.block_cache_pages - lastInfo.block_cache_pages) + * B_PAGE_SIZE; + printf("%11" B_PRId32 " %11" B_PRId64 " %11" B_PRId64 " %11" + B_PRId64 "\n", pageFaults, usedMemory, usedSwap, blockCache); lastInfo = info; } diff --git a/src/preferences/virtualmemory/SettingsWindow.cpp b/src/preferences/virtualmemory/SettingsWindow.cpp index 38bf127c48..508cf46060 100644 --- a/src/preferences/virtualmemory/SettingsWindow.cpp +++ b/src/preferences/virtualmemory/SettingsWindow.cpp @@ -476,11 +476,12 @@ SettingsWindow::_Update() void SettingsWindow::_UpdateSwapInfo() { - system_memory_info memInfo = {}; - __get_system_info_etc(B_MEMORY_INFO, &memInfo, sizeof(memInfo)); + system_info info; + get_system_info(&info); - off_t currentSwapSize = memInfo.max_swap_space; - off_t currentSwapUsed = (memInfo.max_swap_space - memInfo.free_swap_space); + off_t currentSwapSize = info.max_swap_pages * B_PAGE_SIZE; + off_t currentSwapUsed + = (info.max_swap_pages - info.free_swap_pages) * B_PAGE_SIZE; char sizeStr[16]; BString swapSizeStr = string_for_size(currentSwapSize, sizeStr, diff --git a/src/system/kernel/system_info.cpp b/src/system/kernel/system_info.cpp index 709fe30860..82929d0c4b 100644 --- a/src/system/kernel/system_info.cpp +++ b/src/system/kernel/system_info.cpp @@ -418,6 +418,7 @@ get_system_info(system_info* info) info->cpu_count = smp_get_num_cpus(); vm_page_get_stats(info); + vm_get_info(info); info->used_threads = thread_used_threads(); info->max_threads = thread_max_threads(); @@ -428,8 +429,6 @@ get_system_info(system_info* info) info->used_sems = sem_used_sems(); info->max_sems = sem_max_sems(); - // TODO: fill the new fields - info->kernel_version = kKernelVersion; strlcpy(info->kernel_name, kKernelName, B_FILE_NAME_LENGTH); strlcpy(info->kernel_build_date, __DATE__, B_OS_NAME_LENGTH); @@ -625,32 +624,6 @@ _user_get_cpu_topology_info(cpu_topology_node_info* topologyInfos, } -status_t -_user_get_system_info_etc(int32 id, void* userInfo, size_t size) -{ - if (userInfo == NULL || !IS_USER_ADDRESS(userInfo)) - return B_BAD_ADDRESS; - - switch (id) { - case B_MEMORY_INFO: - { - if (size < sizeof(system_memory_info)) - return B_BAD_VALUE; - - system_memory_info info; - vm_get_info(&info); - - info.block_cache_memory = block_cache_used_memory(); - - return user_memcpy(userInfo, &info, sizeof(system_memory_info)); - } - - default: - return B_BAD_VALUE; - } -} - - status_t _user_start_watching_system(int32 object, uint32 flags, port_id port, int32 token) diff --git a/src/system/kernel/vm/VMAnonymousCache.cpp b/src/system/kernel/vm/VMAnonymousCache.cpp index d0337ba71c..0abb92a8db 100644 --- a/src/system/kernel/vm/VMAnonymousCache.cpp +++ b/src/system/kernel/vm/VMAnonymousCache.cpp @@ -1667,11 +1667,11 @@ swap_total_swap_pages() void -swap_get_info(struct system_memory_info* info) +swap_get_info(system_info* info) { #if ENABLE_SWAP_SUPPORT - info->max_swap_space = (uint64)swap_total_swap_pages() * B_PAGE_SIZE; - info->free_swap_space = (uint64)swap_available_pages() * B_PAGE_SIZE; + info->max_swap_pages = swap_total_swap_pages(); + info->free_swap_pages = swap_available_pages(); #else info->max_swap_space = 0; info->free_swap_space = 0; diff --git a/src/system/kernel/vm/VMAnonymousCache.h b/src/system/kernel/vm/VMAnonymousCache.h index 065f422325..b68800047c 100644 --- a/src/system/kernel/vm/VMAnonymousCache.h +++ b/src/system/kernel/vm/VMAnonymousCache.h @@ -99,7 +99,7 @@ private: #endif // ENABLE_SWAP_SUPPORT -extern "C" void swap_get_info(struct system_memory_info* info); +extern "C" void swap_get_info(system_info* info); #endif /* _KERNEL_VM_STORE_ANONYMOUS_H */ diff --git a/src/system/kernel/vm/vm.cpp b/src/system/kernel/vm/vm.cpp index 2e5a3747dd..5de32b25e8 100644 --- a/src/system/kernel/vm/vm.cpp +++ b/src/system/kernel/vm/vm.cpp @@ -4628,16 +4628,13 @@ vm_put_physical_page_debug(addr_t vaddr, void* handle) void -vm_get_info(system_memory_info* info) +vm_get_info(system_info* info) { swap_get_info(info); - info->max_memory = vm_page_num_pages() * B_PAGE_SIZE; - info->page_faults = sPageFaults; - MutexLocker locker(sAvailableMemoryLock); - info->free_memory = sAvailableMemory; info->needed_memory = sNeededMemory; + info->free_memory = sAvailableMemory; } diff --git a/src/system/kernel/vm/vm_page.cpp b/src/system/kernel/vm/vm_page.cpp index 9f1f548887..008782773c 100644 --- a/src/system/kernel/vm/vm_page.cpp +++ b/src/system/kernel/vm/vm_page.cpp @@ -4059,6 +4059,7 @@ vm_page_get_stats(system_info *info) // TODO: We should subtract the blocks that are in use ATM, since those // can't really be freed in a low memory situation. page_num_t blockCachePages = block_cache_used_memory() / B_PAGE_SIZE; + info->block_cache_pages = blockCachePages; // Non-temporary modified pages are special as they represent pages that // can be written back, so they could be freed if necessary, for us diff --git a/src/system/libroot/os/system_info.cpp b/src/system/libroot/os/system_info.cpp index adf7a0c710..337e7469a9 100644 --- a/src/system/libroot/os/system_info.cpp +++ b/src/system/libroot/os/system_info.cpp @@ -198,16 +198,6 @@ __get_cpu_topology_info(cpu_topology_node_info* topologyInfos, } -status_t -__get_system_info_etc(int32 id, void *info, size_t size) -{ - if (info == NULL || size == 0 || id < 0) - return B_BAD_VALUE; - - return _kern_get_system_info_etc(id, info, size); -} - - status_t __start_watching_system(int32 object, uint32 flags, port_id port, int32 token) {