Index: devel-pcp-2.5.99/src/pmdas/linux/pmda.c =================================================================== --- devel-pcp-2.5.99.orig/src/pmdas/linux/pmda.c 2006-11-21 11:56:25.496190500 +1100 +++ devel-pcp-2.5.99/src/pmdas/linux/pmda.c 2006-11-21 17:05:16.378298250 +1100 @@ -80,12 +80,26 @@ */ #if defined(HAVE_64BIT_LONG) #define KERNEL_ULONG PM_TYPE_U64 -#define _pm_assign_ulong(atomp, val) (atomp)->ull = val +#define _pm_assign_ulong(atomp, val) do { (atomp)->ull = (val); } while (0) #else #define KERNEL_ULONG PM_TYPE_U32 -#define _pm_assign_ulong(atomp, val) (atomp)->ul = val +#define _pm_assign_ulong(atomp, val) do { (atomp)->ul = (val); } while (0) #endif +/* + * Some metrics need to have their type set at runtime, based on the + * running kernel version (not simply a 64 vs 32 bit machine issue). + */ +#define KERNEL_UTYPE PM_TYPE_NOSUPPORT /* set to real type at runtime */ +#define _pm_metric_type(type, size) \ + do { \ + (type) = ((size)==8 ? PM_TYPE_U64 : PM_TYPE_U32); \ + } while (0) +#define _pm_assign_utype(size, atomp, val) \ + do { \ + if ((size)==8) { (atomp)->ull = (val); } else { (atomp)->ul = (val); } \ + } while (0) + static proc_stat_t proc_stat; static proc_meminfo_t proc_meminfo; static proc_loadavg_t proc_loadavg; @@ -117,6 +131,10 @@ static int _isDSO = 1; /* =0 I am a dae /* globals */ size_t _pm_system_pagesize; /* for hinv.pagesize and used elsewhere */ int _pm_have_proc_vmstat; /* if /proc/vmstat is available */ +int _pm_intr_size; /* size in bytes of interrupt sum count metric */ +int _pm_ctxt_size; /* size in bytes of context switch count metric */ +int _pm_cputime_size; /* size in bytes of most of the cputime metrics */ +int _pm_idletime_size; /* size in bytes of the idle cputime metric */ /* * Metric Instance Domains (statically initialized ones only) @@ -201,22 +219,22 @@ static pmdaMetric metrictab[] = { /* kernel.percpu.cpu.user */ { NULL, - { PMDA_PMID(CLUSTER_STAT,0), PM_TYPE_U32, CPU_INDOM, PM_SEM_COUNTER, + { PMDA_PMID(CLUSTER_STAT,0), KERNEL_UTYPE, CPU_INDOM, PM_SEM_COUNTER, PMDA_PMUNITS(0,1,0,0,PM_TIME_MSEC,0) }, }, /* kernel.percpu.cpu.nice */ { NULL, - { PMDA_PMID(CLUSTER_STAT,1), PM_TYPE_U32, CPU_INDOM, PM_SEM_COUNTER, + { PMDA_PMID(CLUSTER_STAT,1), KERNEL_UTYPE, CPU_INDOM, PM_SEM_COUNTER, PMDA_PMUNITS(0,1,0,0,PM_TIME_MSEC,0) }, }, /* kernel.percpu.cpu.sys */ { NULL, - { PMDA_PMID(CLUSTER_STAT,2), PM_TYPE_U32, CPU_INDOM, PM_SEM_COUNTER, + { PMDA_PMID(CLUSTER_STAT,2), KERNEL_UTYPE, CPU_INDOM, PM_SEM_COUNTER, PMDA_PMUNITS(0,1,0,0,PM_TIME_MSEC,0) }, }, /* kernel.percpu.cpu.idle */ { NULL, - { PMDA_PMID(CLUSTER_STAT,3), KERNEL_ULONG, CPU_INDOM, PM_SEM_COUNTER, + { PMDA_PMID(CLUSTER_STAT,3), KERNEL_UTYPE, CPU_INDOM, PM_SEM_COUNTER, PMDA_PMUNITS(0,1,0,0,PM_TIME_MSEC,0) }, }, /* disk.dev.read */ @@ -301,12 +319,12 @@ static pmdaMetric metrictab[] = { /* kernel.all.intr */ { NULL, - { PMDA_PMID(CLUSTER_STAT,12), PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_COUNTER, + { PMDA_PMID(CLUSTER_STAT,12), KERNEL_UTYPE, PM_INDOM_NULL, PM_SEM_COUNTER, PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, /* kernel.all.pswitch */ { NULL, - { PMDA_PMID(CLUSTER_STAT,13), KERNEL_ULONG, PM_INDOM_NULL, PM_SEM_COUNTER, + { PMDA_PMID(CLUSTER_STAT,13), KERNEL_UTYPE, PM_INDOM_NULL, PM_SEM_COUNTER, PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, /* kernel.all.sysfork */ @@ -317,22 +335,22 @@ static pmdaMetric metrictab[] = { /* kernel.all.cpu.user */ { NULL, - { PMDA_PMID(CLUSTER_STAT,20), PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_COUNTER, + { PMDA_PMID(CLUSTER_STAT,20), KERNEL_UTYPE, PM_INDOM_NULL, PM_SEM_COUNTER, PMDA_PMUNITS(0,1,0,0,PM_TIME_MSEC,0) }, }, /* kernel.all.cpu.nice */ { NULL, - { PMDA_PMID(CLUSTER_STAT,21), PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_COUNTER, + { PMDA_PMID(CLUSTER_STAT,21), KERNEL_UTYPE, PM_INDOM_NULL, PM_SEM_COUNTER, PMDA_PMUNITS(0,1,0,0,PM_TIME_MSEC,0) }, }, /* kernel.all.cpu.sys */ { NULL, - { PMDA_PMID(CLUSTER_STAT,22), PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_COUNTER, + { PMDA_PMID(CLUSTER_STAT,22), KERNEL_UTYPE, PM_INDOM_NULL, PM_SEM_COUNTER, PMDA_PMUNITS(0,1,0,0,PM_TIME_MSEC,0) }, }, /* kernel.all.cpu.idle */ { NULL, - { PMDA_PMID(CLUSTER_STAT,23), KERNEL_ULONG, PM_INDOM_NULL, PM_SEM_COUNTER, + { PMDA_PMID(CLUSTER_STAT,23), KERNEL_UTYPE, PM_INDOM_NULL, PM_SEM_COUNTER, PMDA_PMUNITS(0,1,0,0,PM_TIME_MSEC,0) }, }, /* disk.all.read */ @@ -377,12 +395,12 @@ static pmdaMetric metrictab[] = { /* kernel.percpu.cpu.wait.total */ { NULL, - { PMDA_PMID(CLUSTER_STAT,30), PM_TYPE_U32, CPU_INDOM, PM_SEM_COUNTER, + { PMDA_PMID(CLUSTER_STAT,30), KERNEL_UTYPE, CPU_INDOM, PM_SEM_COUNTER, PMDA_PMUNITS(0,1,0,0,PM_TIME_MSEC,0) }, }, /* kernel.percpu.cpu.intr */ { NULL, - { PMDA_PMID(CLUSTER_STAT,31), PM_TYPE_U32, CPU_INDOM, PM_SEM_COUNTER, + { PMDA_PMID(CLUSTER_STAT,31), KERNEL_UTYPE, CPU_INDOM, PM_SEM_COUNTER, PMDA_PMUNITS(0,1,0,0,PM_TIME_MSEC,0) }, }, /* hinv.ncpu */ @@ -397,12 +415,12 @@ static pmdaMetric metrictab[] = { /* kernel.all.cpu.intr */ { NULL, - { PMDA_PMID(CLUSTER_STAT,34), PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_COUNTER, + { PMDA_PMID(CLUSTER_STAT,34), KERNEL_UTYPE, PM_INDOM_NULL, PM_SEM_COUNTER, PMDA_PMUNITS(0,1,0,0,PM_TIME_MSEC,0) }, }, /* kernel.all.cpu.wait.total */ { NULL, - { PMDA_PMID(CLUSTER_STAT,35), PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_COUNTER, + { PMDA_PMID(CLUSTER_STAT,35), KERNEL_UTYPE, PM_INDOM_NULL, PM_SEM_COUNTER, PMDA_PMUNITS(0,1,0,0,PM_TIME_MSEC,0) }, }, /* kernel.all.hz */ @@ -3067,16 +3085,20 @@ linux_fetchCallBack(pmdaMetric *mdesc, u */ switch (idp->item) { case 0: /* user */ - atom->ul = 1000 * (double)proc_stat.p_user[inst] / proc_stat.hz; + _pm_assign_utype(_pm_cputime_size, atom, + 1000 * (double)proc_stat.p_user[inst] / proc_stat.hz); break; case 1: /* nice */ - atom->ul = 1000 * (double)proc_stat.p_nice[inst] / proc_stat.hz; + _pm_assign_utype(_pm_cputime_size, atom, + 1000 * (double)proc_stat.p_nice[inst] / proc_stat.hz); break; case 2: /* sys */ - atom->ul = 1000 * (double)proc_stat.p_sys[inst] / proc_stat.hz; + _pm_assign_utype(_pm_cputime_size, atom, + 1000 * (double)proc_stat.p_sys[inst] / proc_stat.hz); break; case 3: /* idle */ - _pm_assign_ulong(atom, 1000 * (double)proc_stat.p_idle[inst] / proc_stat.hz); + _pm_assign_utype(_pm_idletime_size, atom, + 1000 * (double)proc_stat.p_idle[inst] / proc_stat.hz); break; case 8: /* pagesin */ @@ -3104,10 +3126,10 @@ linux_fetchCallBack(pmdaMetric *mdesc, u atom->ul = proc_stat.page[1]; break; case 12: /* intr */ - atom->ul = proc_stat.intr[0]; + _pm_assign_utype(_pm_intr_size, atom, proc_stat.intr); break; case 13: /* ctxt */ - _pm_assign_ulong(atom, proc_stat.ctxt); + _pm_assign_utype(_pm_ctxt_size, atom, proc_stat.intr); break; case 14: /* processes */ _pm_assign_ulong(atom, proc_stat.processes); @@ -3115,31 +3137,39 @@ linux_fetchCallBack(pmdaMetric *mdesc, u /* gilly - change the calculation to prevent a bug */ case 20: /* all.user */ - atom->ul = 1000 * (double)proc_stat.user / proc_stat.hz; + _pm_assign_utype(_pm_cputime_size, atom, + 1000 * (double)proc_stat.user / proc_stat.hz); break; case 21: /* all.nice */ - atom->ul = 1000 * (double)proc_stat.nice / proc_stat.hz; + _pm_assign_utype(_pm_cputime_size, atom, + 1000 * (double)proc_stat.nice / proc_stat.hz); break; case 22: /* all.sys */ - atom->ul = 1000 * (double)proc_stat.sys / proc_stat.hz; + _pm_assign_utype(_pm_cputime_size, atom, + 1000 * (double)proc_stat.sys / proc_stat.hz); break; case 23: /* all.idle */ - _pm_assign_ulong(atom, 1000 * (double)proc_stat.idle / proc_stat.hz); + _pm_assign_utype(_pm_idletime_size, atom, + 1000 * (double)proc_stat.idle / proc_stat.hz); break; case 30: /* kernel.percpu.cpu.wait.total */ - atom->ul = 1000 * (double)proc_stat.p_wait[inst] / proc_stat.hz; + _pm_assign_utype(_pm_cputime_size, atom, + 1000 * (double)proc_stat.p_wait[inst] / proc_stat.hz); break; case 31: /* kernel.percpu.cpu.intr */ - atom->ul = 1000 * ((double)proc_stat.p_irq[inst] + - (double)proc_stat.p_sirq[inst]) / proc_stat.hz; + _pm_assign_utype(_pm_cputime_size, atom, + 1000 * ((double)proc_stat.p_irq[inst] + + (double)proc_stat.p_sirq[inst]) / proc_stat.hz); break; case 34: /* kernel.all.cpu.intr */ - atom->ul = 1000 * ((double)proc_stat.irq + - (double)proc_stat.sirq) / proc_stat.hz; + _pm_assign_utype(_pm_cputime_size, atom, + 1000 * ((double)proc_stat.irq + + (double)proc_stat.sirq) / proc_stat.hz); break; case 35: /* kernel.all.cpu.wait.total */ - atom->ul = 1000 * (double)proc_stat.wait / proc_stat.hz; + _pm_assign_utype(_pm_cputime_size, atom, + 1000 * (double)proc_stat.wait / proc_stat.hz); break; case 32: /* hinv.ncpu */ atom->ul = indomtab[CPU_INDOM].it_numinst; @@ -4319,6 +4349,8 @@ void linux_init(pmdaInterface *dp) { int need_refresh[NUM_CLUSTERS]; + int i, major, minor; + __pmID_int *idp; _pm_system_pagesize = getpagesize(); if (_isDSO) { @@ -4343,6 +4375,65 @@ linux_init(pmdaInterface *dp) proc_scsi.scsi_indom = &indomtab[SCSI_INDOM]; proc_slabinfo.indom = &indomtab[SLAB_INDOM]; + /* + * Figure out kernel version. The precision of certain metrics + * (e.g. percpu time counters) has changed over kernel versions. + * See include/linux/kernel_stat.h for all the various flavours. + */ + uname(&kernel_uname); + _pm_ctxt_size = 8; + _pm_intr_size = 8; + _pm_cputime_size = 8; + _pm_idletime_size = 8; + if (sscanf(kernel_uname.release, "%d.%d", &major, &minor) == 2) { + if (major < 2 || (major == 2 && minor <= 4)) { /* 2.4 and earlier */ + fprintf(stderr, "NOTICE: using kernel 2.4 or earlier CPU types\n"); + _pm_ctxt_size = 4; + _pm_intr_size = 4; + _pm_cputime_size = 4; + _pm_idletime_size = sizeof(unsigned long); + } + else if (major == 2 && minor >= 0 && minor <= 4) { /* 2.6.0->.4 */ + fprintf(stderr, "NOTICE: using kernel 2.6.0 to 2.6.4 CPU types\n"); + _pm_cputime_size = 4; + _pm_idletime_size = 4; + } + else + fprintf(stderr, "NOTICE: using 64 bit CPU time types\n"); + } + for (i = 0; i < sizeof(metrictab)/sizeof(metrictab[0]); i++) { + idp = (__pmID_int *)&(metrictab[i].m_desc.pmid); + if (idp->cluster == CLUSTER_STAT) { + switch (idp->item) { + case 0: /* kernel.percpu.cpu.user */ + case 1: /* kernel.percpu.cpu.nice */ + case 2: /* kernel.percpu.cpu.sys */ + case 20: /* kernel.all.cpu.user */ + case 21: /* kernel.all.cpu.nice */ + case 22: /* kernel.all.cpu.sys */ + case 30: /* kernel.percpu.cpu.wait.total */ + case 31: /* kernel.percpu.cpu.intr */ + case 34: /* kernel.all.cpu.intr */ + case 35: /* kernel.all.cpu.wait.total */ + _pm_metric_type(metrictab[i].m_desc.type, _pm_cputime_size); + break; + case 3: /* kernel.percpu.cpu.idle */ + case 23: /* kernel.all.cpu.idle */ + _pm_metric_type(metrictab[i].m_desc.type, _pm_idletime_size); + break; + case 12: /* kernel.all.intr */ + _pm_metric_type(metrictab[i].m_desc.type, _pm_intr_size); + break; + case 13: /* kernel.all.pswitch */ + _pm_metric_type(metrictab[i].m_desc.type, _pm_ctxt_size); + break; + } + } + if (metrictab[i].m_desc.type == PM_TYPE_NOSUPPORT) + fprintf(stderr, "Bad kernel metric descriptor type (%u.%u)\n", + idp->cluster, idp->item); + } + /* * Read System.map and /proc/ksyms. Used to translate wait channel * addresses to symbol names. Index: devel-pcp-2.5.99/src/pmdas/linux/proc_stat.c =================================================================== --- devel-pcp-2.5.99.orig/src/pmdas/linux/proc_stat.c 2006-11-21 14:37:38.612722500 +1100 +++ devel-pcp-2.5.99/src/pmdas/linux/proc_stat.c 2006-11-21 17:11:19.965021000 +1100 @@ -64,9 +64,6 @@ refresh_proc_stat(proc_cpuinfo_t *proc_c int n; int i; int j; - unsigned long cur_idle; - struct utsname kversion; - static int have_long_idle_metric = -1; if ((fd = open("/proc/stat", O_RDONLY)) < 0) { return -errno; @@ -90,17 +87,6 @@ refresh_proc_stat(proc_cpuinfo_t *proc_c bufindex = (char **)malloc(maxbufindex * sizeof(char *)); } - if (have_long_idle_metric < 0) { - memset(&kversion, 0, sizeof(kversion)); - if (uname(&kversion) == 0) { - have_long_idle_metric = - strncmp(kversion.release, "2.2", 3) == 0 || - strncmp(kversion.release, "2.4", 3) == 0; - } - else - fprintf(stderr, "refresh_proc_stat: warning: uname() failed: %s\n", strerror(errno)); - } - nbufindex = 0; bufindex[nbufindex++] = statbuf; for (i=0; i < n; i++) { @@ -142,68 +128,40 @@ refresh_proc_stat(proc_cpuinfo_t *proc_c proc_stat->cpu_indom->it_set[i].i_name = cpu_name(proc_cpuinfo, i); } - /* - * All cpu metrics are "unsigned int" except idle, - * which is "unsigned long" on 2.4.x kernels and - * "unsigned int" on 2.6.x kernels. - */ - n = proc_stat->ncpu * sizeof(unsigned int); - proc_stat->p_user = (unsigned int *)malloc(n); - proc_stat->p_nice = (unsigned int *)malloc(n); - proc_stat->p_sys = (unsigned int *)malloc(n); - proc_stat->p_wait = (unsigned int *)malloc(n); - proc_stat->p_irq = (unsigned int *)malloc(n); - proc_stat->p_sirq = (unsigned int *)malloc(n); + n = proc_stat->ncpu * sizeof(unsigned long long); + proc_stat->p_user = (unsigned long long *)malloc(n); + proc_stat->p_nice = (unsigned long long *)malloc(n); + proc_stat->p_sys = (unsigned long long *)malloc(n); + proc_stat->p_idle = (unsigned long long *)malloc(n); + proc_stat->p_wait = (unsigned long long *)malloc(n); + proc_stat->p_irq = (unsigned long long *)malloc(n); + proc_stat->p_sirq = (unsigned long long *)malloc(n); memset(proc_stat->p_user, 0, n); memset(proc_stat->p_nice, 0, n); memset(proc_stat->p_sys, 0, n); + memset(proc_stat->p_idle, 0, n); memset(proc_stat->p_wait, 0, n); memset(proc_stat->p_irq, 0, n); memset(proc_stat->p_sirq, 0, n); - - n = proc_stat->ncpu * sizeof(unsigned long); - proc_stat->p_idle = (unsigned long *)malloc(n); - proc_stat->p_prev_idle = (unsigned long *)malloc(n); - memset(proc_stat->p_idle, 0, n); - memset(proc_stat->p_prev_idle, 0, n); } - /* * cpu 95379 4 20053 6502503 * 2.6 kernels have 3 additional fields * for wait, irq and soft_irq. */ - strcpy(fmt, "cpu %u %u %u %lu %u %u %u"); + strcpy(fmt, "cpu %llu %llu %llu %llu %llu %llu %llu"); n = sscanf((const char *)bufindex[0], fmt, &proc_stat->user, &proc_stat->nice, - &proc_stat->sys, &cur_idle, + &proc_stat->sys, &proc_stat->idle, &proc_stat->wait, &proc_stat->irq, &proc_stat->sirq); if (n == 4) proc_stat->wait = proc_stat->irq = proc_stat->sirq = 0; - if (cur_idle >= proc_stat->prev_idle) - proc_stat->idle += cur_idle - proc_stat->prev_idle; - else { - /* - * For 2.6.x kernels, idle counters always wrap at 32 bits. - * For 2.4 kernels, idle counters wrap at either 32 bits - * or 64 bits, depending on sizeof(long). - */ - if (have_long_idle_metric) - proc_stat->idle += cur_idle + - (ULONG_MAX - proc_stat->prev_idle); - else - proc_stat->idle += cur_idle + - (UINT_MAX - proc_stat->prev_idle); - } - proc_stat->prev_idle = cur_idle; - /* * per-cpu stats * e.g. cpu0 95379 4 20053 6502503 - * * 2.6 kernels have 3 additional fields * for wait, irq and soft_irq. */ @@ -223,36 +181,26 @@ refresh_proc_stat(proc_cpuinfo_t *proc_c proc_stat->p_sirq[0] = proc_stat->sirq; } else { + strcpy(fmt, "cpu%d %llu %llu %llu %llu %llu %llu %llu"); for (i=0; i < proc_stat->ncpu; i++) { for (j=0; j < nbufindex; j++) { if (strncmp("cpu", bufindex[j], 3) == 0 && isdigit(bufindex[j][3])) { int c; int cpunum = atoi(&bufindex[j][3]); if (cpunum >= 0 && cpunum < proc_stat->ncpu) { - n = sscanf(bufindex[j], "cpu%d %u %u %u %lu %u %u %u", &c, - &proc_stat->p_user[cpunum], &proc_stat->p_nice[cpunum], - &proc_stat->p_sys[cpunum], &cur_idle, - &proc_stat->p_wait[cpunum], &proc_stat->p_irq[cpunum], + n = sscanf(bufindex[j], fmt, &c, + &proc_stat->p_user[cpunum], + &proc_stat->p_nice[cpunum], + &proc_stat->p_sys[cpunum], + &proc_stat->p_idle[cpunum], + &proc_stat->p_wait[cpunum], + &proc_stat->p_irq[cpunum], &proc_stat->p_sirq[cpunum]); - if (n == 4) { proc_stat->p_wait[cpunum] = proc_stat->p_irq[cpunum] = proc_stat->p_sirq[cpunum] = 0; } - - if (cur_idle >= proc_stat->p_prev_idle[cpunum]) - proc_stat->p_idle[cpunum] += cur_idle - proc_stat->p_prev_idle[cpunum]; - else { - /* wrapped, see comment above */ - if (have_long_idle_metric) - proc_stat->p_idle[cpunum] += cur_idle + - (ULONG_MAX - proc_stat->p_prev_idle[cpunum]); - else - proc_stat->p_idle[cpunum] += cur_idle + - (UINT_MAX - proc_stat->p_prev_idle[cpunum]); - } - proc_stat->p_prev_idle[cpunum] = cur_idle; } } } @@ -292,10 +240,10 @@ refresh_proc_stat(proc_cpuinfo_t *proc_c * intr 32845463 24099228 2049 0 2 .... * (just export the first number, which is total interrupts) */ - strcpy(fmt, "intr %u"); + strcpy(fmt, "intr %llu"); for (j=0; j < nbufindex; j++) { if (strncmp(fmt, bufindex[j], 5) == 0) { - sscanf((const char *)bufindex[j], fmt, &proc_stat->intr[0]); + sscanf((const char *)bufindex[j], fmt, &proc_stat->intr); break; } } @@ -303,7 +251,7 @@ refresh_proc_stat(proc_cpuinfo_t *proc_c /* * ctxt 1733480 */ - strcpy(fmt, "ctxt %lu"); + strcpy(fmt, "ctxt %llu"); for (j=0; j < nbufindex; j++) { if (strncmp(fmt, bufindex[j], 5) == 0) { sscanf((const char *)bufindex[j], fmt, &proc_stat->ctxt); Index: devel-pcp-2.5.99/src/pmdas/linux/proc_stat.h =================================================================== --- devel-pcp-2.5.99.orig/src/pmdas/linux/proc_stat.h 2006-11-21 13:58:32.434095500 +1100 +++ devel-pcp-2.5.99/src/pmdas/linux/proc_stat.h 2006-11-21 15:30:23.214497750 +1100 @@ -24,18 +24,14 @@ #ident "$Id: proc_stat.h,v 1.13 2005/05/10 05:37:54 markgw Exp $" typedef struct { - unsigned int user, sys, nice, wait, irq, sirq; - unsigned long idle; - unsigned long prev_idle; + unsigned long long user, sys, nice, idle, wait, irq, sirq; unsigned int ncpu; - unsigned int *p_user, *p_sys, *p_nice, *p_wait, *p_irq, *p_sirq; - unsigned long *p_idle; - unsigned long *p_prev_idle; + unsigned long long *p_user, *p_sys, *p_nice, *p_idle, *p_wait, *p_irq, *p_sirq; unsigned int ndisk; - unsigned int page[2]; - unsigned int swap[2]; - unsigned int intr[65]; - unsigned long ctxt; + unsigned int page[2]; /* unused in 2.6, switched to /proc/vmstat */ + unsigned int swap[2]; /* unused in 2.6, switched to /proc/vmstat */ + unsigned long long intr; + unsigned long long ctxt; unsigned long btime; unsigned long processes; pmdaIndom *cpu_indom;