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, ...).
This commit is contained in:
@@ -433,14 +433,15 @@ typedef struct {
|
|||||||
|
|
||||||
uint64 max_pages; /* total # of accessible pages */
|
uint64 max_pages; /* total # of accessible pages */
|
||||||
uint64 used_pages; /* # of accessible pages in use */
|
uint64 used_pages; /* # of accessible pages in use */
|
||||||
uint64 free_pages;
|
|
||||||
uint64 reserved_pages;
|
|
||||||
uint64 cached_pages;
|
uint64 cached_pages;
|
||||||
uint64 block_cache_pages;
|
uint64 block_cache_pages;
|
||||||
uint64 ignored_pages; /* # of ignored/inaccessible pages */
|
uint64 ignored_pages; /* # of ignored/inaccessible pages */
|
||||||
|
|
||||||
|
uint64 needed_memory;
|
||||||
|
uint64 free_memory;
|
||||||
|
|
||||||
uint64 max_swap_pages;
|
uint64 max_swap_pages;
|
||||||
uint64 used_swap_pages;
|
uint64 free_swap_pages;
|
||||||
|
|
||||||
uint32 page_faults; /* # of page faults */
|
uint32 page_faults; /* # of page faults */
|
||||||
|
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ status_t vm_get_physical_page_debug(phys_addr_t paddr, addr_t* vaddr,
|
|||||||
void** _handle);
|
void** _handle);
|
||||||
status_t vm_put_physical_page_debug(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);
|
uint32 vm_num_page_faults(void);
|
||||||
off_t vm_available_memory(void);
|
off_t vm_available_memory(void);
|
||||||
off_t vm_available_not_needed_memory(void);
|
off_t vm_available_not_needed_memory(void);
|
||||||
|
|||||||
@@ -521,8 +521,6 @@ extern status_t _kern_get_cpu_topology_info(
|
|||||||
cpu_topology_node_info* topologyInfos,
|
cpu_topology_node_info* topologyInfos,
|
||||||
uint32* topologyInfoCount);
|
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,
|
extern status_t _kern_analyze_scheduling(bigtime_t from, bigtime_t until,
|
||||||
void* buffer, size_t size,
|
void* buffer, size_t size,
|
||||||
struct scheduling_analysis* analysis);
|
struct scheduling_analysis* analysis);
|
||||||
|
|||||||
@@ -9,21 +9,6 @@
|
|||||||
#include <OS.h>
|
#include <OS.h>
|
||||||
|
|
||||||
|
|
||||||
#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 {
|
enum {
|
||||||
// team creation or deletion; object == -1; either one also triggers on
|
// team creation or deletion; object == -1; either one also triggers on
|
||||||
// exec()
|
// 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_info(uint32 firstCPU, uint32 cpuCount, cpu_info* info);
|
||||||
status_t __get_cpu_topology_info(cpu_topology_node_info* topologyInfos,
|
status_t __get_cpu_topology_info(cpu_topology_node_info* topologyInfos,
|
||||||
uint32* topologyInfoCount);
|
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,
|
status_t __start_watching_system(int32 object, uint32 flags, port_id port,
|
||||||
int32 token);
|
int32 token);
|
||||||
|
|||||||
@@ -497,13 +497,7 @@ BlockCacheDataSource::Copy() const
|
|||||||
int64
|
int64
|
||||||
BlockCacheDataSource::NextValue(SystemInfo& info)
|
BlockCacheDataSource::NextValue(SystemInfo& info)
|
||||||
{
|
{
|
||||||
system_memory_info memoryInfo;
|
return info.BlockCacheMemory();
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -26,8 +26,6 @@ SystemInfo::SystemInfo(SystemInfoHandler* handler)
|
|||||||
get_system_info(&fSystemInfo);
|
get_system_info(&fSystemInfo);
|
||||||
fCPUInfos = new cpu_info[fSystemInfo.cpu_count];
|
fCPUInfos = new cpu_info[fSystemInfo.cpu_count];
|
||||||
get_cpu_info(0, fSystemInfo.cpu_count, fCPUInfos);
|
get_cpu_info(0, fSystemInfo.cpu_count, fCPUInfos);
|
||||||
__get_system_info_etc(B_MEMORY_INFO, &fMemoryInfo,
|
|
||||||
sizeof(system_memory_info));
|
|
||||||
|
|
||||||
if (handler != NULL) {
|
if (handler != NULL) {
|
||||||
fRunningApps = handler->RunningApps();
|
fRunningApps = handler->RunningApps();
|
||||||
@@ -50,45 +48,53 @@ uint64
|
|||||||
SystemInfo::CachedMemory() const
|
SystemInfo::CachedMemory() const
|
||||||
{
|
{
|
||||||
#ifdef __HAIKU__
|
#ifdef __HAIKU__
|
||||||
return (uint64)fSystemInfo.cached_pages * B_PAGE_SIZE;
|
return fSystemInfo.cached_pages * B_PAGE_SIZE;
|
||||||
#else
|
#else
|
||||||
return 0LL;
|
return 0LL;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint64
|
||||||
|
SystemInfo::BlockCacheMemory() const
|
||||||
|
{
|
||||||
|
return fSystemInfo.block_cache_pages * B_PAGE_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
uint64
|
uint64
|
||||||
SystemInfo::UsedMemory() const
|
SystemInfo::UsedMemory() const
|
||||||
{
|
{
|
||||||
return (uint64)fSystemInfo.used_pages * B_PAGE_SIZE;
|
return fSystemInfo.used_pages * B_PAGE_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint64
|
uint64
|
||||||
SystemInfo::MaxMemory() const
|
SystemInfo::MaxMemory() const
|
||||||
{
|
{
|
||||||
return (uint64)fSystemInfo.max_pages * B_PAGE_SIZE;
|
return fSystemInfo.max_pages * B_PAGE_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint32
|
uint32
|
||||||
SystemInfo::PageFaults() const
|
SystemInfo::PageFaults() const
|
||||||
{
|
{
|
||||||
return fMemoryInfo.page_faults;
|
return fSystemInfo.page_faults;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint64
|
uint64
|
||||||
SystemInfo::UsedSwapSpace() const
|
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
|
uint64
|
||||||
SystemInfo::MaxSwapSpace() const
|
SystemInfo::MaxSwapSpace() const
|
||||||
{
|
{
|
||||||
return fMemoryInfo.max_swap_space;
|
return fSystemInfo.max_swap_pages * B_PAGE_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ public:
|
|||||||
~SystemInfo();
|
~SystemInfo();
|
||||||
|
|
||||||
uint64 CachedMemory() const;
|
uint64 CachedMemory() const;
|
||||||
|
uint64 BlockCacheMemory() const;
|
||||||
uint64 UsedMemory() const;
|
uint64 UsedMemory() const;
|
||||||
uint64 MaxMemory() const;
|
uint64 MaxMemory() const;
|
||||||
|
|
||||||
@@ -64,7 +65,6 @@ private:
|
|||||||
|
|
||||||
system_info fSystemInfo;
|
system_info fSystemInfo;
|
||||||
cpu_info* fCPUInfos;
|
cpu_info* fCPUInfos;
|
||||||
system_memory_info fMemoryInfo;
|
|
||||||
bigtime_t fTime;
|
bigtime_t fTime;
|
||||||
bool fRetrievedNetwork;
|
bool fRetrievedNetwork;
|
||||||
uint64 fBytesReceived;
|
uint64 fBytesReceived;
|
||||||
|
|||||||
+21
-17
@@ -66,40 +66,44 @@ main(int argc, char** argv)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
system_memory_info info;
|
system_info info;
|
||||||
status_t status = __get_system_info_etc(B_MEMORY_INFO, &info,
|
status_t status = get_system_info(&info);
|
||||||
sizeof(system_memory_info));
|
|
||||||
if (status != B_OK) {
|
if (status != B_OK) {
|
||||||
fprintf(stderr, "%s: cannot get system info: %s\n", kProgramName,
|
fprintf(stderr, "%s: cannot get system info: %s\n", kProgramName,
|
||||||
strerror(status));
|
strerror(status));
|
||||||
return 1;
|
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("free memory:\t\t%Lu\n", info.free_memory);
|
||||||
printf("needed memory:\t\t%Lu\n", info.needed_memory);
|
printf("needed memory:\t\t%Lu\n", info.needed_memory);
|
||||||
printf("block cache memory:\t%Lu\n", info.block_cache_memory);
|
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_space);
|
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_space);
|
printf("free swap space:\t%Lu\n", info.free_swap_pages * B_PAGE_SIZE);
|
||||||
printf("page faults:\t\t%lu\n", info.page_faults);
|
printf("page faults:\t\t%lu\n", info.page_faults);
|
||||||
|
|
||||||
if (periodically) {
|
if (periodically) {
|
||||||
puts("\npage faults used memory used swap block cache");
|
puts("\npage faults used memory used swap block cache");
|
||||||
system_memory_info lastInfo = info;
|
system_info lastInfo = info;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
snooze(rate);
|
snooze(rate);
|
||||||
|
|
||||||
__get_system_info_etc(B_MEMORY_INFO, &info,
|
get_system_info(&info);
|
||||||
sizeof(system_memory_info));
|
|
||||||
|
|
||||||
printf("%11ld %11Ld %11Ld %11Ld\n",
|
int32 pageFaults = info.page_faults - lastInfo.page_faults;
|
||||||
(int32)info.page_faults - lastInfo.page_faults,
|
int64 usedMemory
|
||||||
(info.max_memory - info.free_memory)
|
= (info.max_pages * B_PAGE_SIZE - info.free_memory)
|
||||||
- (lastInfo.max_memory - lastInfo.free_memory),
|
- (lastInfo.max_pages * B_PAGE_SIZE - lastInfo.free_memory);
|
||||||
(info.max_swap_space - info.free_swap_space)
|
int64 usedSwap
|
||||||
- (lastInfo.max_swap_space - lastInfo.free_swap_space),
|
= ((info.max_swap_pages - info.free_swap_pages)
|
||||||
info.block_cache_memory - lastInfo.block_cache_memory);
|
- (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;
|
lastInfo = info;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -476,11 +476,12 @@ SettingsWindow::_Update()
|
|||||||
void
|
void
|
||||||
SettingsWindow::_UpdateSwapInfo()
|
SettingsWindow::_UpdateSwapInfo()
|
||||||
{
|
{
|
||||||
system_memory_info memInfo = {};
|
system_info info;
|
||||||
__get_system_info_etc(B_MEMORY_INFO, &memInfo, sizeof(memInfo));
|
get_system_info(&info);
|
||||||
|
|
||||||
off_t currentSwapSize = memInfo.max_swap_space;
|
off_t currentSwapSize = info.max_swap_pages * B_PAGE_SIZE;
|
||||||
off_t currentSwapUsed = (memInfo.max_swap_space - memInfo.free_swap_space);
|
off_t currentSwapUsed
|
||||||
|
= (info.max_swap_pages - info.free_swap_pages) * B_PAGE_SIZE;
|
||||||
|
|
||||||
char sizeStr[16];
|
char sizeStr[16];
|
||||||
BString swapSizeStr = string_for_size(currentSwapSize, sizeStr,
|
BString swapSizeStr = string_for_size(currentSwapSize, sizeStr,
|
||||||
|
|||||||
@@ -418,6 +418,7 @@ get_system_info(system_info* info)
|
|||||||
info->cpu_count = smp_get_num_cpus();
|
info->cpu_count = smp_get_num_cpus();
|
||||||
|
|
||||||
vm_page_get_stats(info);
|
vm_page_get_stats(info);
|
||||||
|
vm_get_info(info);
|
||||||
|
|
||||||
info->used_threads = thread_used_threads();
|
info->used_threads = thread_used_threads();
|
||||||
info->max_threads = thread_max_threads();
|
info->max_threads = thread_max_threads();
|
||||||
@@ -428,8 +429,6 @@ get_system_info(system_info* info)
|
|||||||
info->used_sems = sem_used_sems();
|
info->used_sems = sem_used_sems();
|
||||||
info->max_sems = sem_max_sems();
|
info->max_sems = sem_max_sems();
|
||||||
|
|
||||||
// TODO: fill the new fields
|
|
||||||
|
|
||||||
info->kernel_version = kKernelVersion;
|
info->kernel_version = kKernelVersion;
|
||||||
strlcpy(info->kernel_name, kKernelName, B_FILE_NAME_LENGTH);
|
strlcpy(info->kernel_name, kKernelName, B_FILE_NAME_LENGTH);
|
||||||
strlcpy(info->kernel_build_date, __DATE__, B_OS_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
|
status_t
|
||||||
_user_start_watching_system(int32 object, uint32 flags, port_id port,
|
_user_start_watching_system(int32 object, uint32 flags, port_id port,
|
||||||
int32 token)
|
int32 token)
|
||||||
|
|||||||
@@ -1667,11 +1667,11 @@ swap_total_swap_pages()
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
swap_get_info(struct system_memory_info* info)
|
swap_get_info(system_info* info)
|
||||||
{
|
{
|
||||||
#if ENABLE_SWAP_SUPPORT
|
#if ENABLE_SWAP_SUPPORT
|
||||||
info->max_swap_space = (uint64)swap_total_swap_pages() * B_PAGE_SIZE;
|
info->max_swap_pages = swap_total_swap_pages();
|
||||||
info->free_swap_space = (uint64)swap_available_pages() * B_PAGE_SIZE;
|
info->free_swap_pages = swap_available_pages();
|
||||||
#else
|
#else
|
||||||
info->max_swap_space = 0;
|
info->max_swap_space = 0;
|
||||||
info->free_swap_space = 0;
|
info->free_swap_space = 0;
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ private:
|
|||||||
#endif // ENABLE_SWAP_SUPPORT
|
#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 */
|
#endif /* _KERNEL_VM_STORE_ANONYMOUS_H */
|
||||||
|
|||||||
@@ -4628,16 +4628,13 @@ vm_put_physical_page_debug(addr_t vaddr, void* handle)
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
vm_get_info(system_memory_info* info)
|
vm_get_info(system_info* info)
|
||||||
{
|
{
|
||||||
swap_get_info(info);
|
swap_get_info(info);
|
||||||
|
|
||||||
info->max_memory = vm_page_num_pages() * B_PAGE_SIZE;
|
|
||||||
info->page_faults = sPageFaults;
|
|
||||||
|
|
||||||
MutexLocker locker(sAvailableMemoryLock);
|
MutexLocker locker(sAvailableMemoryLock);
|
||||||
info->free_memory = sAvailableMemory;
|
|
||||||
info->needed_memory = sNeededMemory;
|
info->needed_memory = sNeededMemory;
|
||||||
|
info->free_memory = sAvailableMemory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -4059,6 +4059,7 @@ vm_page_get_stats(system_info *info)
|
|||||||
// TODO: We should subtract the blocks that are in use ATM, since those
|
// TODO: We should subtract the blocks that are in use ATM, since those
|
||||||
// can't really be freed in a low memory situation.
|
// can't really be freed in a low memory situation.
|
||||||
page_num_t blockCachePages = block_cache_used_memory() / B_PAGE_SIZE;
|
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
|
// Non-temporary modified pages are special as they represent pages that
|
||||||
// can be written back, so they could be freed if necessary, for us
|
// can be written back, so they could be freed if necessary, for us
|
||||||
|
|||||||
@@ -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
|
status_t
|
||||||
__start_watching_system(int32 object, uint32 flags, port_id port, int32 token)
|
__start_watching_system(int32 object, uint32 flags, port_id port, int32 token)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user