--- src/libs/zbxsysinfo/freebsd/memory.c.orig 2011-04-15 23:17:29.000000000 +0400 +++ src/libs/zbxsysinfo/freebsd/memory.c 2011-05-10 18:37:14.000000000 +0400 @@ -70,21 +70,66 @@ #endif /* HAVE_FUNCTION_SYSCTLBYNAME */ } -static int VM_MEMORY_USED(AGENT_RESULT *result) +static int VM_MEMORY_ACTIVE(AGENT_RESULT *result) { #if defined(HAVE_FUNCTION_SYSCTLBYNAME) /* FreeBSD 6.2 i386; FreeBSD 7.0 i386 */ - u_int totalpages, freepages, pagesize; + u_int activepages, pagesize; size_t len; - len = sizeof(totalpages); + len = sizeof(activepages); - if (0 != sysctlbyname("vm.stats.vm.v_page_count", &totalpages, &len, NULL, 0)) + if (0 != sysctlbyname("vm.stats.vm.v_active_count", &activepages, &len, NULL, 0)) return SYSINFO_RET_FAIL; - len = sizeof(freepages); + len = sizeof(pagesize); - if (0 != sysctlbyname("vm.stats.vm.v_free_count", &freepages, &len, NULL, 0)) + if (0 != sysctlbyname("vm.stats.vm.v_page_size", &pagesize, &len, NULL, 0)) + return SYSINFO_RET_FAIL; + + SET_UI64_RESULT(result, (zbx_uint64_t)activepages * pagesize); + + return SYSINFO_RET_OK; +#else + return SYSINFO_RET_FAIL; +#endif /* HAVE_FUNCTION_SYSCTLBYNAME */ +} + +static int VM_MEMORY_INACTIVE(AGENT_RESULT *result) +{ +#if defined(HAVE_FUNCTION_SYSCTLBYNAME) + /* FreeBSD 6.2 i386; FreeBSD 7.0 i386 */ + u_int inactivepages, pagesize; + size_t len; + + len = sizeof(inactivepages); + + if (0 != sysctlbyname("vm.stats.vm.v_inactive_count", &inactivepages, &len, NULL, 0)) + return SYSINFO_RET_FAIL; + + len = sizeof(pagesize); + + if (0 != sysctlbyname("vm.stats.vm.v_page_size", &pagesize, &len, NULL, 0)) + return SYSINFO_RET_FAIL; + + SET_UI64_RESULT(result, (zbx_uint64_t)inactivepages * pagesize); + + return SYSINFO_RET_OK; +#else + return SYSINFO_RET_FAIL; +#endif /* HAVE_FUNCTION_SYSCTLBYNAME */ +} + +static int VM_MEMORY_WIRED(AGENT_RESULT *result) +{ +#if defined(HAVE_FUNCTION_SYSCTLBYNAME) + /* FreeBSD 6.2 i386; FreeBSD 7.0 i386 */ + u_int wiredpages, pagesize; + size_t len; + + len = sizeof(wiredpages); + + if (0 != sysctlbyname("vm.stats.vm.v_wire_count", &wiredpages, &len, NULL, 0)) return SYSINFO_RET_FAIL; len = sizeof(pagesize); @@ -92,7 +137,7 @@ if (0 != sysctlbyname("vm.stats.vm.v_page_size", &pagesize, &len, NULL, 0)) return SYSINFO_RET_FAIL; - SET_UI64_RESULT(result, (zbx_uint64_t)(totalpages - freepages) * pagesize); + SET_UI64_RESULT(result, (zbx_uint64_t)wiredpages * pagesize); return SYSINFO_RET_OK; #else @@ -104,7 +149,7 @@ { #if defined(HAVE_FUNCTION_SYSCTLBYNAME) /* FreeBSD 6.2 i386; FreeBSD 7.0 i386 */ - u_int totalpages, freepages; + u_int totalpages, freepages, cachepages, inactivepages; size_t len; len = sizeof(totalpages); @@ -117,7 +162,17 @@ if (0 != sysctlbyname("vm.stats.vm.v_free_count", &freepages, &len, NULL, 0)) return SYSINFO_RET_FAIL; - SET_DBL_RESULT(result, (double)(100.0 * freepages) / totalpages); + len = sizeof(cachepages); + + if (0 != sysctlbyname("vm.stats.vm.v_cache_count", &cachepages, &len, NULL, 0)) + return SYSINFO_RET_FAIL; + + len = sizeof(inactivepages); + + if (0 != sysctlbyname("vm.stats.vm.v_inactive_count", &inactivepages, &len, NULL, 0)) + return SYSINFO_RET_FAIL; + + SET_DBL_RESULT(result, (double)(100.0 * (freepages + cachepages + inactivepages) / totalpages)); return SYSINFO_RET_OK; #else @@ -129,7 +184,7 @@ { #if defined(HAVE_FUNCTION_SYSCTLBYNAME) /* FreeBSD 6.2 i386; FreeBSD 7.0 i386 */ - u_int totalpages, freepages; + u_int totalpages, activepages, wiredpages; size_t len; len = sizeof(totalpages); @@ -137,12 +192,17 @@ if (0 != sysctlbyname("vm.stats.vm.v_page_count", &totalpages, &len, NULL, 0)) return SYSINFO_RET_FAIL; - len = sizeof(freepages); + len = sizeof(activepages); - if (0 != sysctlbyname("vm.stats.vm.v_free_count", &freepages, &len, NULL, 0)) + if (0 != sysctlbyname("vm.stats.vm.v_active_count", &activepages, &len, NULL, 0)) return SYSINFO_RET_FAIL; - SET_DBL_RESULT(result, (double)(100.0 * (totalpages - freepages)) / totalpages); + len = sizeof(wiredpages); + + if (0 != sysctlbyname("vm.stats.vm.v_wire_count", &wiredpages, &len, NULL, 0)) + return SYSINFO_RET_FAIL; + + SET_DBL_RESULT(result, (double)((100.0 * (activepages + wiredpages)) / totalpages)); return SYSINFO_RET_OK; #else @@ -175,25 +235,69 @@ #endif /* HAVE_FUNCTION_SYSCTLBYNAME */ } -static int VM_MEMORY_SHARED(AGENT_RESULT *result) +static int VM_MEMORY_AVAILABLE(AGENT_RESULT *result) { -#if defined(HAVE_SYS_VMMETER_VMTOTAL) +#if defined(HAVE_FUNCTION_SYSCTLBYNAME) /* FreeBSD 6.2 i386; FreeBSD 7.0 i386 */ - int mib[] = {CTL_VM, VM_METER}; - size_t len; - struct vmtotal v; + u_int freepages, cachepages, inactivepages, pagesize; + size_t len; - len = sizeof(v); + len = sizeof(freepages); - if (0 != sysctl(mib, 2, &v, &len, NULL, 0)) + if (0 != sysctlbyname("vm.stats.vm.v_free_count", &freepages, &len, NULL, 0)) return SYSINFO_RET_FAIL; - SET_UI64_RESULT(result, (zbx_uint64_t)(v.t_vmshr + v.t_rmshr) * sysconf(_SC_PAGESIZE)); + len = sizeof(cachepages); + + if (0 != sysctlbyname("vm.stats.vm.v_cache_count", &cachepages, &len, NULL, 0)) + return SYSINFO_RET_FAIL; + + len = sizeof(inactivepages); + + if (0 != sysctlbyname("vm.stats.vm.v_inactive_count", &inactivepages, &len, NULL, 0)) + return SYSINFO_RET_FAIL; + + len = sizeof(pagesize); + + if (0 != sysctlbyname("vm.stats.vm.v_page_size", &pagesize, &len, NULL, 0)) + return SYSINFO_RET_FAIL; + + SET_UI64_RESULT(result, (zbx_uint64_t)(freepages + cachepages + inactivepages) * pagesize); return SYSINFO_RET_OK; #else return SYSINFO_RET_FAIL; -#endif +#endif /* HAVE_FUNCTION_SYSCTLBYNAME */ +} + +static int VM_MEMORY_USED(AGENT_RESULT *result) +{ +#if defined(HAVE_FUNCTION_SYSCTLBYNAME) + /* FreeBSD 6.2 i386; FreeBSD 7.0 i386 */ + u_int activepages, wiredpages, pagesize; + size_t len; + + len = sizeof(activepages); + + if (0 != sysctlbyname("vm.stats.vm.v_active_count", &activepages, &len, NULL, 0)) + return SYSINFO_RET_FAIL; + + len = sizeof(wiredpages); + + if (0 != sysctlbyname("vm.stats.vm.v_wire_count", &wiredpages, &len, NULL, 0)) + return SYSINFO_RET_FAIL; + + len = sizeof(pagesize); + + if (0 != sysctlbyname("vm.stats.vm.v_page_size", &pagesize, &len, NULL, 0)) + return SYSINFO_RET_FAIL; + + SET_UI64_RESULT(result, (zbx_uint64_t)(activepages + wiredpages) * pagesize); + + return SYSINFO_RET_OK; +#else + return SYSINFO_RET_FAIL; +#endif /* HAVE_FUNCTION_SYSCTLBYNAME */ } int VM_MEMORY_SIZE(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result) @@ -202,11 +306,14 @@ { {"total", VM_MEMORY_TOTAL}, {"free", VM_MEMORY_FREE}, - {"used", VM_MEMORY_USED}, + {"active", VM_MEMORY_ACTIVE}, + {"inactive", VM_MEMORY_INACTIVE}, + {"wired", VM_MEMORY_WIRED}, {"pfree", VM_MEMORY_PFREE}, {"pused", VM_MEMORY_PUSED}, - {"shared", VM_MEMORY_SHARED}, {"cached", VM_MEMORY_CACHED}, + {"available", VM_MEMORY_AVAILABLE}, + {"used", VM_MEMORY_USED}, {0, 0} };