/* * getkerndata() interface * e.g. Dynix */ #include #include #include #include #include #include #include #include #include #include #include /* * Initialise the list of CPUs on the system * (including descriptions) */ void init_cpu_nlist( void ) { int i; netsnmp_cpu_info *cpu = netsnmp_cpu_get_byIdx( -1, 1 ); strcpy(cpu->name, "Overall CPU statistics"); cpu_num = tmp_ctl( TMP_NENG, 0 ); if ( cpu_num <= 0 ) cpu_num = 1; /* Single CPU system */ for ( i=0; i < cpu_num; i++ ) { cpu = netsnmp_cpu_get_byIdx( i, 1 ); sprintf( cpu->name, "cpu%d", i ); } } /* * Load the latest CPU usage statistics */ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) { int i; exp_vmmeter_t *vminfo; size_t vminfo_size; netsnmp_cpu_info *cpu = netsnmp_cpu_get_byIdx( -1, 0 ); netsnmp_cpu_info *cpu2; /* Clear overall stats, ready for summing individual CPUs */ cpu->user_ticks = 0; cpu->idle_ticks = 0; cpu->kern_ticks = 0; cpu->wait_ticks = 0; cpu->sys2_ticks = 0; cpu->swapIn = 0; cpu->swapOut = 0; cpu->nInterrupts = 0; cpu->nCtxSwitches = 0; vminfo_size = cpu_num * sizeof(exp_vmmeter_t); vminfo = (exp_vmmeter_t *)malloc( vminfo_size ); getkerninfo(VMMETER_DATAID, vminfo, vminfo_size); for ( i=0; i < cpu_num; i++ ) { cpu2 = netsnmp_cpu_get_byIdx( i, 0 ); cpu2->user_ticks = (unsigned long long)vminfo[i].v_time[V_CPU_USER]; cpu2->idle_ticks = (unsigned long long)vminfo[i].v_time[V_CPU_IDLE]; cpu2->kern_ticks = (unsigned long long)vminfo[i].v_time[V_CPU_KERNEL]; cpu2->wait_ticks = (unsigned long long)vminfo[i].v_time[V_CPU_STREAM]; cpu2->sys2_ticks = (unsigned long long)vminfo[i].v_time[V_CPU_KERNEL]+ vminfo[i].v_time[V_CPU_STREAM]; /* nice_ticks, intrpt_ticks, sirq_ticks unused */ /* sum these for the overall stats */ cpu->user_ticks += (unsigned long long)vminfo[i].v_time[V_CPU_USER]; cpu->idle_ticks += (unsigned long long)vminfo[i].v_time[V_CPU_IDLE]; cpu->kern_ticks += (unsigned long long)vminfo[i].v_time[V_CPU_KERNEL]; cpu->wait_ticks += (unsigned long long)vminfo[i].v_time[V_CPU_STREAM]; cpu->sys2_ticks += (unsigned long long)vminfo[i].v_time[V_CPU_KERNEL]+ vminfo[i].v_time[V_CPU_STREAM]; /* * Interrupt/Context Switch statistics * XXX - Do these really belong here ? */ cpu->swapIn += (unsigned long long)vminfo[i].v_swpin; cpu->swapOut += (unsigned long long)vminfo[i].v_swpout; cpu->pageIn += (unsigned long long)vminfo[i].v_phread; cpu->pageOut += (unsigned long long)vminfo[i].v_phwrite; cpu->nInterrupts += (unsigned long long)vminfo[i].v_intr; cpu->nCtxSwitches += (unsigned long long)vminfo[i].v_swtch; } return 0; }