first try sysctl to get swap info on freebsd
This commit is contained in:
parent
d02f09c178
commit
eddfa04179
|
@ -254,6 +254,79 @@ int sigar_mem_get(sigar_t *sigar, sigar_mem_t *mem)
|
|||
#define VM_DIR "/private/var/vm"
|
||||
#define SWAPFILE "swapfile"
|
||||
|
||||
#define NL_SWAPBLIST 0
|
||||
#define NL_SWDEVT 1
|
||||
#define NL_NSWDEV 2
|
||||
#define NL_DMMAX 3
|
||||
|
||||
#define SWI_MAXMIB 3
|
||||
|
||||
/* code in this function is based on FreeBSD 5.3 kvm_getswapinfo.c */
|
||||
static int getswapinfo_sysctl(struct kvm_swap *swap_ary,
|
||||
int swap_max)
|
||||
{
|
||||
int ti, ttl;
|
||||
size_t mibi, len, size;
|
||||
int soid[SWI_MAXMIB];
|
||||
struct xswdev xsd;
|
||||
struct kvm_swap tot;
|
||||
int unswdev, dmmax;
|
||||
|
||||
/* XXX this can be optimized by using os_open */
|
||||
size = sizeof(dmmax);
|
||||
if (sysctlbyname("vm.dmmax", &dmmax, &size, NULL, 0) == -1) {
|
||||
return errno;
|
||||
}
|
||||
|
||||
mibi = SWI_MAXMIB - 1;
|
||||
if (sysctlnametomib("vm.swap_info", soid, &mibi) == -1) {
|
||||
return errno;
|
||||
}
|
||||
|
||||
bzero(&tot, sizeof(tot));
|
||||
for (unswdev = 0;; unswdev++) {
|
||||
soid[mibi] = unswdev;
|
||||
len = sizeof(xsd);
|
||||
if (sysctl(soid, mibi + 1, &xsd, &len, NULL, 0) == -1) {
|
||||
if (errno == ENOENT) {
|
||||
break;
|
||||
}
|
||||
return errno;
|
||||
}
|
||||
#if 0
|
||||
if (len != sizeof(xsd)) {
|
||||
_kvm_err(kd, kd->program, "struct xswdev has unexpected "
|
||||
"size; kernel and libkvm out of sync?");
|
||||
return -1;
|
||||
}
|
||||
if (xsd.xsw_version != XSWDEV_VERSION) {
|
||||
_kvm_err(kd, kd->program, "struct xswdev version "
|
||||
"mismatch; kernel and libkvm out of sync?");
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
ttl = xsd.xsw_nblks - dmmax;
|
||||
if (unswdev < swap_max - 1) {
|
||||
bzero(&swap_ary[unswdev], sizeof(swap_ary[unswdev]));
|
||||
swap_ary[unswdev].ksw_total = ttl;
|
||||
swap_ary[unswdev].ksw_used = xsd.xsw_used;
|
||||
swap_ary[unswdev].ksw_flags = xsd.xsw_flags;
|
||||
}
|
||||
tot.ksw_total += ttl;
|
||||
tot.ksw_used += xsd.xsw_used;
|
||||
}
|
||||
|
||||
ti = unswdev;
|
||||
if (ti >= swap_max) {
|
||||
ti = swap_max - 1;
|
||||
}
|
||||
if (ti >= 0) {
|
||||
swap_ary[ti] = tot;
|
||||
}
|
||||
|
||||
return SIGAR_OK;
|
||||
}
|
||||
|
||||
int sigar_swap_get(sigar_t *sigar, sigar_swap_t *swap)
|
||||
{
|
||||
#ifdef DARWIN
|
||||
|
@ -312,12 +385,14 @@ int sigar_swap_get(sigar_t *sigar, sigar_swap_t *swap)
|
|||
#else
|
||||
struct kvm_swap kswap[1];
|
||||
|
||||
if (!sigar->kmem) {
|
||||
return SIGAR_EPERM_KMEM;
|
||||
}
|
||||
if (getswapinfo_sysctl(kswap, 1) != SIGAR_OK) {
|
||||
if (!sigar->kmem) {
|
||||
return SIGAR_EPERM_KMEM;
|
||||
}
|
||||
|
||||
if (kvm_getswapinfo(sigar->kmem, kswap, 1, 0) < 0) {
|
||||
return errno;
|
||||
if (kvm_getswapinfo(sigar->kmem, kswap, 1, 0) < 0) {
|
||||
return errno;
|
||||
}
|
||||
}
|
||||
|
||||
if (kswap[0].ksw_total == 0) {
|
||||
|
|
Loading…
Reference in New Issue