From: Edgar Fuß Date: Wed, 8 Jul 2020 17:20:45 +0000 (+0200) Subject: Implement memory plugin for NetBSD X-Git-Tag: collectd-5.12.0~14^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c920cda83d7ddb9832795c2d76ab88ac8cf39152;p=thirdparty%2Fcollectd.git Implement memory plugin for NetBSD Add a port of the memory plugin for NetBSD using VM_UVMEXP2, and preferring sysctl over sysctlbyname. Written by Håvard Eidnes --- diff --git a/src/memory.c b/src/memory.c index 107e867f9..60546a0cb 100644 --- a/src/memory.c +++ b/src/memory.c @@ -68,6 +68,10 @@ static mach_port_t port_host; static vm_size_t pagesize; /* #endif HAVE_HOST_STATISTICS */ +#elif HAVE_SYSCTL +static int pagesize; +/* #endif HAVE_SYSCTL */ + #elif HAVE_SYSCTLBYNAME /* no global variables */ /* #endif HAVE_SYSCTLBYNAME */ @@ -82,11 +86,6 @@ static kstat_t *ksp; static kstat_t *ksz; /* #endif HAVE_LIBKSTAT */ -#elif HAVE_SYSCTL && __OpenBSD__ -/* OpenBSD variant does not have sysctlbyname */ -static int pagesize; -/* #endif HAVE_SYSCTL && __OpenBSD__ */ - #elif HAVE_LIBSTATGRAB /* no global variables */ /* endif HAVE_LIBSTATGRAB */ @@ -97,6 +96,10 @@ static int pagesize; #error "No applicable input method." #endif +#if KERNEL_NETBSD +# include +#endif + static bool values_absolute = true; static bool values_percentage; @@ -225,6 +228,45 @@ static int memory_read_internal(value_list_t *vl) { /* #endif HAVE_HOST_STATISTICS */ #elif HAVE_SYSCTLBYNAME + +#if HAVE_SYSCTL && defined(KERNEL_NETBSD) + int mib[] = {CTL_VM, VM_UVMEXP2}; + struct uvmexp_sysctl uvmexp; + gauge_t mem_active; + gauge_t mem_inactive; + gauge_t mem_free; + gauge_t mem_wired; + gauge_t mem_kernel; + size_t size; + + memset (&uvmexp, 0, sizeof (uvmexp)); + size = sizeof (uvmexp); + + if (sysctl (mib, 2, &uvmexp, &size, NULL, 0) < 0) { + char errbuf[1024]; + WARNING ("memory plugin: sysctl failed: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + return (-1); + } + + assert (pagesize > 0); + mem_active = (gauge_t) (uvmexp.active * pagesize); + mem_inactive = (gauge_t) (uvmexp.inactive * pagesize); + mem_free = (gauge_t) (uvmexp.free * pagesize); + mem_wired = (gauge_t) (uvmexp.wired * pagesize); + mem_kernel = (gauge_t) ((uvmexp.npages - ( + uvmexp.active + uvmexp.inactive + + uvmexp.free + uvmexp.wired + )) * pagesize); + + MEMORY_SUBMIT ("active", mem_active, + "inactive", mem_inactive, + "free", mem_free, + "wired", mem_wired, + "kernel", mem_kernel); +/* #endif HAVE_SYSCTL && defined(KERNEL_NETBSD) */ + +#else /* Other HAVE_SYSCTLBYNAME providers */ /* * vm.stats.vm.v_page_size: 4096 * vm.stats.vm.v_page_count: 246178 @@ -263,6 +305,8 @@ static int memory_read_internal(value_list_t *vl) { (gauge_t)sysctl_vals[3], "active", (gauge_t)sysctl_vals[4], "inactive", (gauge_t)sysctl_vals[5], "cache", (gauge_t)sysctl_vals[6]); + +#endif /* HAVE_SYSCTL && KERNEL_NETBSD */ /* #endif HAVE_SYSCTLBYNAME */ #elif KERNEL_LINUX