auto_nlist failed on cp_time at location 1

Dan Nelson dnelson at allantgroup.com
Thu Apr 24 01:34:22 UTC 2008


In the last episode (Apr 23), Tim Stoddard said:
> I just upgraded from FreeBSD 6.2 ->
> 6.3 (using source tree).  I then recompiled my net-snmp port binaries (using
> portupgrade).  I am now get error message in my logs every five secs. 
> I am sure my libkvm is in sync with my kernel.  I do not know what else
> to look at.  

You got bit by 

 revision 1.178.2.5
 date: 2008/04/09 19:47:20;  author: peter;  state: Exp;  lines: +68 -5
 MFC: record per-cpu stats for %user/%nice/%system/%idle

, which removed the kernel variable that net-snmp uses to track CPU
usage. Try this patch (put it in /usr/ports/net-mgmt/net-snmp/files and
rebuild net-snmp).  I've sent it to the net-snmp port maintainer so
hopefully it will be committed soon.

-- 
	Dan Nelson
	dnelson at allantgroup.com
-------------- next part --------------
--- agent/mibgroup/hardware/cpu/cpu_nlist.c	2007-01-19 10:53:44.000000000 -0600
+++ agent/mibgroup/hardware/cpu/cpu_nlist.c	2008-04-22 00:13:48.330686919 -0500
@@ -1,5 +1,5 @@
 /*
- *   nlist() interface
+ *   sysctl() interface
  *     e.g. FreeBSD
  */
 #include <net-snmp/net-snmp-config.h>
@@ -12,24 +12,9 @@
 #include <sys/types.h>
 #include <sys/resource.h>
 
-#ifdef HAVE_SYS_DKSTAT_H
-#include <sys/dkstat.h>
-#endif
 #ifdef HAVE_SYS_SYSCTL_H
 #include <sys/sysctl.h>
 #endif
-#ifdef HAVE_SYS_VMMETER_H
-#include <sys/vmmeter.h>
-#endif
-#ifdef HAVE_VM_VM_PARAM_H
-#include <vm/vm_param.h>
-#endif
-#ifdef HAVE_VM_VM_EXTERN_H
-#include <vm/vm_extern.h>
-#endif
-
-#define CPU_SYMBOL  "cp_time"
-#define MEM_SYMBOL  "cnt"
 
 void _cpu_copy_stats( netsnmp_cpu_info *cpu );
 
@@ -67,11 +52,12 @@
      */
 int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
     long   cpu_stats[CPUSTATES];
-    struct vmmeter mem_stats;
+    int size, tempval;
+    
     netsnmp_cpu_info *cpu = netsnmp_cpu_get_byIdx( -1, 0 );
 
-    auto_nlist( CPU_SYMBOL, (char *) cpu_stats, sizeof(cpu_stats));
-    auto_nlist( MEM_SYMBOL, (char *)&mem_stats, sizeof(mem_stats));
+    size = sizeof(cpu_stats);
+    sysctlbyname("kern.cp_time", &cpu_stats, &size, NULL, 0);
 
     cpu->user_ticks = (unsigned long)cpu_stats[CP_USER];
     cpu->nice_ticks = (unsigned long)cpu_stats[CP_NICE];
@@ -85,15 +71,19 @@
          * Interrupt/Context Switch statistics
          *   XXX - Do these really belong here ?
          */
-#if defined(openbsd2) || defined(darwin)
-    cpu->swapIn  = (unsigned long)mem_stats.v_swpin;
-    cpu->swapOut = (unsigned long)mem_stats.v_swpout;
-#else
-    cpu->swapIn  = (unsigned long)mem_stats.v_swappgsin+mem_stats.v_vnodepgsin;
-    cpu->swapOut = (unsigned long)mem_stats.v_swappgsout+mem_stats.v_vnodepgsout;
-#endif
-    cpu->nInterrupts  = (unsigned long)mem_stats.v_intr;
-    cpu->nCtxSwitches = (unsigned long)mem_stats.v_swtch;
+    size = sizeof(int);
+#define GET_VM_STATS(cat, name, netsnmpname) \
+    do { \
+        sysctlbyname("vm.stats." #cat "." #name, &tempval, &size, NULL, 0); \
+        cpu->netsnmpname = (unsigned long) tempval; \
+    } while(0)
+
+    GET_VM_STATS(vm,  v_swappgsin,   swapIn);
+    GET_VM_STATS(vm,  v_swappgsout,  swapOut);
+    GET_VM_STATS(vm,  v_vnodepgsin,  pageIn);
+    GET_VM_STATS(vm,  v_vnodepgsout, pageOut);
+    GET_VM_STATS(sys, v_intr,        nInterrupts);
+    GET_VM_STATS(sys, v_swtch,       nCtxSwitches);
 
 #ifdef PER_CPU_INFO
     for ( i = 0; i < n; i++ ) {


More information about the freebsd-stable mailing list