From e93de3b1dcd7d23da1194cd02e540dfca09d1e98 Mon Sep 17 00:00:00 2001 From: Doug MacEachern Date: Thu, 2 Aug 2007 04:20:34 +0000 Subject: [PATCH] start swap.page_{in,out} solaris impl --- src/os/solaris/solaris_sigar.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/os/solaris/solaris_sigar.c b/src/os/solaris/solaris_sigar.c index 93009504..8c34b5b1 100644 --- a/src/os/solaris/solaris_sigar.c +++ b/src/os/solaris/solaris_sigar.c @@ -226,6 +226,9 @@ int sigar_mem_get(sigar_t *sigar, sigar_mem_t *mem) int sigar_swap_get(sigar_t *sigar, sigar_swap_t *swap) { + unsigned int i, id; + kstat_t *ksp; + kstat_named_t *kn; struct anoninfo anon; /* XXX vm/anon.h says: @@ -246,7 +249,34 @@ int sigar_swap_get(sigar_t *sigar, sigar_swap_t *swap) swap->free <<= sigar->pagesize; swap->used <<= sigar->pagesize; - swap->page_in = swap->page_out = -1; + swap->page_in = swap->page_out = 0; + + if (sigar_kstat_update(sigar) == -1) { + return errno; + } + + /* XXX: optimize out kstat_lookup */ + /* XXX: these stats do not exist in this form on solaris 8 + * they are in the raw cpu_stat struct, but thats not + * binary compatible + */ + /* XXX: not tested on 9. */ + for (i=0, id=0; incpu; id++) { + if (!(ksp = kstat_lookup(sigar->kc, "cpu", id, "vm"))) { + continue; + } + i++; + if (kstat_read(sigar->kc, ksp, NULL) < 0) { + continue; + } + + if ((kn = (kstat_named_t *)kstat_data_lookup(ksp, "pgin"))) { + swap->page_in += kn->value.i64; /* vmstat -s | grep "page ins" */ + } + if ((kn = (kstat_named_t *)kstat_data_lookup(ksp, "pgout"))) { + swap->page_out += kn->value.i64; /* vmstat -s | grep "page outs" */ + } + } return SIGAR_OK; }