$NetBSD: patch-dm,v 1.1 2006/03/19 22:03:29 joerg Exp $ --- agent/mibgroup/ucd-snmp/vmstat_freebsd2.c.orig 2004-06-29 12:14:32.000000000 +0000 +++ agent/mibgroup/ucd-snmp/vmstat_freebsd2.c @@ -9,9 +9,15 @@ */ #include #include +#if defined(dragonfly) +#include +#else #include +#endif #if defined(freebsd5) && __FreeBSD_version >= 500101 #include +#elif defined(dragonfly) +#include #else #include #endif @@ -168,11 +174,18 @@ var_extensible_vmstat(struct variable *v static time_t time_old; static time_t time_diff; +#if defined(dragonfly) + static struct kinfo_cputime cpu_old, cpu_new, cpu_diff; + static uint64_t cpu_total; + uint64_t cpu_sum; + static int pagesize; +#else static long cpu_old[CPUSTATES]; static long cpu_new[CPUSTATES]; static long cpu_diff[CPUSTATES]; static long cpu_total; long cpu_sum; +#endif double cpu_prc; static struct vmmeter mem_old, mem_new; @@ -180,6 +193,11 @@ var_extensible_vmstat(struct variable *v static long long_ret; static char errmsg[300]; +#if defined(dragonfly) + if (pagesize == 0) + pagesize = getpagesize() >> 10; +#endif + long_ret = 0; /* set to 0 as default */ if (header_generic(vp, name, length, exact, var_len, write_method)) @@ -195,15 +213,27 @@ var_extensible_vmstat(struct variable *v /* * CPU usage */ - auto_nlist(CPTIME_SYMBOL, (char *) cpu_new, sizeof(cpu_new)); + cpu_total = 0; - cpu_total = 0; +#if defined(dragonfly) + kinfo_get_sched_cputime(&cpu_new); +#define CP_UPDATE(field) cpu_diff.field = cpu_new.field - cpu_old.field; cpu_total += cpu_diff.field; + CP_UPDATE(cp_user); + CP_UPDATE(cp_nice); + CP_UPDATE(cp_sys); + CP_UPDATE(cp_intr); + CP_UPDATE(cp_idle); + cpu_old = cpu_new; +#undef CP_UPDATE +#else + auto_nlist(CPTIME_SYMBOL, (char *) cpu_new, sizeof(cpu_new)); for (loop = 0; loop < CPUSTATES; loop++) { cpu_diff[loop] = cpu_new[loop] - cpu_old[loop]; cpu_old[loop] = cpu_new[loop]; cpu_total += cpu_diff[loop]; } +#endif if (cpu_total == 0) cpu_total = 1; @@ -223,7 +253,11 @@ var_extensible_vmstat(struct variable *v /* * Page-to-kb macro */ +#if defined(dragonfly) +#define ptok(p) ((p) * pagesize) +#else #define ptok(p) ((p) * (mem_new.v_page_size >> 10)) +#endif switch (vp->magic) { case MIBINDEX: @@ -270,37 +304,73 @@ var_extensible_vmstat(struct variable *v long_ret = rate(mem_new.v_swtch - mem_old.v_swtch); return ((u_char *) (&long_ret)); case CPUUSER: +#if defined(dragonfly) + cpu_sum = cpu_diff.cp_user + cpu_diff.cp_nice; +#else cpu_sum = cpu_diff[CP_USER] + cpu_diff[CP_NICE]; +#endif cpu_prc = (float) cpu_sum / (float) cpu_total; long_ret = cpu_prc * CPU_PRC; return ((u_char *) (&long_ret)); case CPUSYSTEM: +#if defined(dragonfly) + cpu_sum = cpu_diff.cp_sys + cpu_diff.cp_intr; +#else cpu_sum = cpu_diff[CP_SYS] + cpu_diff[CP_INTR]; +#endif cpu_prc = (float) cpu_sum / (float) cpu_total; long_ret = cpu_prc * CPU_PRC; return ((u_char *) (&long_ret)); case CPUIDLE: +#if defined(dragonfly) + cpu_sum = cpu_diff.cp_idle; +#else cpu_sum = cpu_diff[CP_IDLE]; +#endif cpu_prc = (float) cpu_sum / (float) cpu_total; long_ret = cpu_prc * CPU_PRC; return ((u_char *) (&long_ret)); case CPURAWUSER: +#if defined(dragonfly) + cpu_sum = cpu_new.cp_user; +#else long_ret = cpu_new[CP_USER]; +#endif return ((u_char *) (&long_ret)); case CPURAWNICE: +#if defined(dragonfly) + cpu_sum = cpu_new.cp_nice; +#else long_ret = cpu_new[CP_NICE]; +#endif return ((u_char *) (&long_ret)); case CPURAWSYSTEM: +#if defined(dragonfly) + cpu_sum = cpu_new.cp_sys + cpu_new.cp_intr; +#else long_ret = cpu_new[CP_SYS] + cpu_new[CP_INTR]; +#endif return ((u_char *) (&long_ret)); case CPURAWIDLE: +#if defined(dragonfly) + cpu_sum = cpu_new.cp_idle; +#else long_ret = cpu_new[CP_IDLE]; +#endif return ((u_char *) (&long_ret)); case CPURAWKERNEL: +#if defined(dragonfly) + cpu_sum = cpu_new.cp_sys; +#else long_ret = cpu_new[CP_SYS]; +#endif return ((u_char *) (&long_ret)); case CPURAWINTR: +#if defined(dragonfly) + cpu_sum = cpu_new.cp_intr; +#else long_ret = cpu_new[CP_INTR]; +#endif return ((u_char *) (&long_ret)); case SYSRAWINTERRUPTS: long_ret = mem_new.v_intr;